mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-20 02:09:24 +01:00
a6504cdea7
Unfortunately, old Libevents don't _put_ a version in their headers, so this can get a little tricky. Fortunately, the only binary-compatibility issue we care about is the size of struct event. Even more fortunately, Libevent 2.0 will let us keep binary compatiblity forever by letting us decouple ourselves from the structs, if we like. svn:r18014
824 lines
24 KiB
Plaintext
824 lines
24 KiB
Plaintext
dnl $Id$
|
|
dnl Copyright (c) 2001-2004, Roger Dingledine
|
|
dnl Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson
|
|
dnl Copyright (c) 2007-2008, The Tor Project, Inc.
|
|
dnl See LICENSE for licensing information
|
|
|
|
AC_INIT
|
|
AM_INIT_AUTOMAKE(tor, 0.2.1.10-alpha-dev)
|
|
AM_CONFIG_HEADER(orconfig.h)
|
|
|
|
AC_CANONICAL_HOST
|
|
|
|
if test -f /etc/redhat-release ; then
|
|
if test -f /usr/kerberos/include ; then
|
|
CPPFLAGS="$CPPFLAGS -I/usr/kerberos/include"
|
|
fi
|
|
fi
|
|
|
|
# Not a no-op; we want to make sure that CPPFLAGS is set before we use
|
|
# the += operator on it in src/or/Makefile.am
|
|
CPPFLAGS="$CPPFLAGS -I../common"
|
|
|
|
AC_ARG_ENABLE(debug,
|
|
AS_HELP_STRING(--enable-debug, compile with debugging info),
|
|
[if test x$enableval = xyes; then
|
|
CFLAGS="$CFLAGS -g"
|
|
fi])
|
|
|
|
#XXXX ideally, we should make this into a no-op, and detect whether we're
|
|
#compiling for the iphone by using $target.
|
|
AC_ARG_ENABLE(iphone,
|
|
AS_HELP_STRING(--enable-iphone, compile with iPhone support),
|
|
[if test x$enableval = xyes ; then
|
|
tor_cv_iphone=true
|
|
CFLAGS="$CFLAGS -D__DARWIN_UNIX03 -DIPHONE"
|
|
fi])
|
|
|
|
#XXXX020 We should make these enabled or not, before 0.2.0.x-final
|
|
AC_ARG_ENABLE(buf-freelists,
|
|
AS_HELP_STRING(--disable-buf-freelists, disable freelists for buffer RAM))
|
|
AC_ARG_ENABLE(openbsd-malloc,
|
|
AS_HELP_STRING(--enable-openbsd-malloc, Use malloc code from openbsd. Linux only))
|
|
AC_ARG_ENABLE(instrument-downloads,
|
|
AS_HELP_STRING(--enable-instrument-downloads, Instrument downloads of directory resources etc.))
|
|
|
|
if test x$enable_buf_freelists != xno; then
|
|
AC_DEFINE(ENABLE_BUF_FREELISTS, 1,
|
|
[Defined if we try to use freelists for buffer RAM chunks])
|
|
fi
|
|
AM_CONDITIONAL(USE_OPENBSD_MALLOC, test x$enable_openbsd_malloc = xyes)
|
|
if test x$enable_instrument_downloads == xyes; then
|
|
AC_DEFINE(INSTRUMENT_DOWNLOADS, 1,
|
|
[Defined if we want to keep track of how much of each kind of resource we download.])
|
|
fi
|
|
|
|
AC_ARG_ENABLE(transparent,
|
|
AS_HELP_STRING(--disable-transparent, disable transparent proxy support),
|
|
[case "${enableval}" in
|
|
yes) transparent=true ;;
|
|
no) transparent=false ;;
|
|
*) AC_MSG_ERROR(bad value for --enable-transparent) ;;
|
|
esac], [transparent=true])
|
|
|
|
AC_ARG_ENABLE(threads,
|
|
AS_HELP_STRING(--disable-threads, disable multi-threading support))
|
|
|
|
if test x$enable_threads = x; then
|
|
case $host in
|
|
*-*-solaris* )
|
|
# Don't try multithreading on solaris -- cpuworkers seem to lock.
|
|
AC_MSG_NOTICE([You are running Solaris; Sometimes threading makes
|
|
cpu workers lock up here, so I will disable threads.])
|
|
enable_threads="no";;
|
|
*)
|
|
enable_threads="yes";;
|
|
esac
|
|
fi
|
|
|
|
if test "$enable_threads" = "yes"; then
|
|
AC_DEFINE(ENABLE_THREADS, 1, [Defined if we will try to use multithreading])
|
|
fi
|
|
|
|
case $host in
|
|
*-*-solaris* )
|
|
AC_DEFINE(_REENTRANT, 1, [Define on some platforms to activate x_r() functions in time.h])
|
|
;;
|
|
esac
|
|
|
|
AC_ARG_ENABLE(geoip-stats,
|
|
AS_HELP_STRING(--enable-geoip-stats, enable code for directories to collect per-country statistics))
|
|
|
|
if test "$enable_geoip_stats" = "yes"; then
|
|
AC_DEFINE(ENABLE_GEOIP_STATS, 1, [Defined if we try to collect per-country statistics])
|
|
fi
|
|
|
|
AC_ARG_ENABLE(gcc-warnings,
|
|
AS_HELP_STRING(--enable-gcc-warnings, enable verbose warnings))
|
|
|
|
AC_PROG_CC
|
|
AC_PROG_CPP
|
|
AC_PROG_MAKE_SET
|
|
AC_PROG_RANLIB
|
|
|
|
TORUSER=_tor
|
|
AC_ARG_WITH(tor-user,
|
|
[ --with-tor-user=NAME Specify username for tor daemon ],
|
|
[
|
|
TORUSER=$withval
|
|
]
|
|
)
|
|
AC_SUBST(TORUSER)
|
|
|
|
TORGROUP=_tor
|
|
AC_ARG_WITH(tor-group,
|
|
[ --with-tor-group=NAME Specify group name for tor daemon ],
|
|
[
|
|
TORGROUP=$withval
|
|
]
|
|
)
|
|
AC_SUBST(TORGROUP)
|
|
|
|
|
|
dnl If WIN32 is defined and non-zero, we are building for win32
|
|
AC_MSG_CHECKING([for win32])
|
|
AC_RUN_IFELSE([
|
|
int main(int c, char **v) {
|
|
#ifdef WIN32
|
|
#if WIN32
|
|
return 0;
|
|
#else
|
|
return 1;
|
|
#endif
|
|
#else
|
|
return 2;
|
|
#endif
|
|
}],
|
|
bwin32=true; AC_MSG_RESULT([yes]),
|
|
bwin32=false; AC_MSG_RESULT([no]),
|
|
bwin32=cross; AC_MSG_RESULT([cross])
|
|
)
|
|
|
|
if test "$bwin32" = cross; then
|
|
AC_MSG_CHECKING([for win32 (cross)])
|
|
AC_COMPILE_IFELSE([
|
|
#ifdef WIN32
|
|
int main(int c, char **v) {return 0;}
|
|
#else
|
|
#error
|
|
int main(int c, char **v) {return x(y);}
|
|
#endif
|
|
],
|
|
bwin32=true; AC_MSG_RESULT([yes]),
|
|
bwin32=false; AC_MSG_RESULT([no]))
|
|
fi
|
|
|
|
if test "$bwin32" = true; then
|
|
AC_DEFINE(MS_WINDOWS, 1, [Define to 1 if we are building for Windows.])
|
|
fi
|
|
AM_CONDITIONAL(BUILD_NT_SERVICES, test x$bwin32 = xtrue)
|
|
|
|
dnl Enable C99 when compiling with MIPSpro
|
|
AC_MSG_CHECKING([for MIPSpro compiler])
|
|
AC_COMPILE_IFELSE(AC_LANG_PROGRAM(, [
|
|
#if (defined(__sgi) && defined(_COMPILER_VERSION))
|
|
#error
|
|
return x(y);
|
|
#endif
|
|
]),
|
|
bmipspro=false; AC_MSG_RESULT(no),
|
|
bmipspro=true; AC_MSG_RESULT(yes))
|
|
|
|
if test "$bmipspro" = true; then
|
|
CFLAGS="$CFLAGS -c99"
|
|
fi
|
|
|
|
AC_C_BIGENDIAN
|
|
|
|
AC_SEARCH_LIBS(socket, [socket])
|
|
AC_SEARCH_LIBS(gethostbyname, [nsl])
|
|
AC_SEARCH_LIBS(dlopen, [dl])
|
|
AC_SEARCH_LIBS(inet_aton, [resolv])
|
|
|
|
if test "$enable_threads" = "yes"; then
|
|
AC_SEARCH_LIBS(pthread_create, [pthread])
|
|
AC_SEARCH_LIBS(pthread_detach, [pthread])
|
|
fi
|
|
|
|
dnl -------------------------------------------------------------------
|
|
dnl Check for functions before libevent, since libevent-1.2 apparently
|
|
dnl exports strlcpy without defining it in a header.
|
|
|
|
AC_CHECK_FUNCS(gettimeofday ftime socketpair uname inet_aton strptime getrlimit strlcat strlcpy strtoull getaddrinfo localtime_r gmtime_r memmem strtok_r writev readv flock)
|
|
|
|
using_custom_malloc=no
|
|
if test x$enable_openbsd_malloc = xyes ; then
|
|
AC_DEFINE(HAVE_MALLOC_GOOD_SIZE, 1, [Defined if we have the malloc_good_size function])
|
|
using_custom_malloc=yes
|
|
fi
|
|
if test x$tcmalloc = xyes ; then
|
|
using_custom_malloc=yes
|
|
fi
|
|
if test $using_custom_malloc = no ; then
|
|
AC_CHECK_FUNCS(mallinfo malloc_good_size malloc_usable_size)
|
|
fi
|
|
|
|
if test "$enable_threads" = "yes"; then
|
|
AC_CHECK_HEADERS(pthread.h)
|
|
AC_CHECK_FUNCS(pthread_create)
|
|
fi
|
|
|
|
dnl ------------------------------------------------------
|
|
dnl Where do you live, libevent? And how do we call you?
|
|
|
|
if test "$bwin32" = true; then
|
|
TOR_LIB_WS32=-lws2_32
|
|
# Some of the cargo-cults recommend -lwsock32 as well, but I don't
|
|
# think it's actually necessary.
|
|
TOR_LIB_GDI=-lgdi32
|
|
else
|
|
TOR_LIB_WS32=
|
|
TOR_LIB_GDI=
|
|
fi
|
|
AC_SUBST(TOR_LIB_WS32)
|
|
AC_SUBST(TOR_LIB_GDI)
|
|
|
|
dnl We need to do this before we try our disgusting hack below.
|
|
AC_CHECK_HEADERS([sys/types.h])
|
|
|
|
dnl This is a disgusting hack so we safely include older libevent headers.
|
|
AC_CHECK_TYPE(u_int64_t, unsigned long long)
|
|
AC_CHECK_TYPE(u_int32_t, unsigned long)
|
|
AC_CHECK_TYPE(u_int16_t, unsigned short)
|
|
AC_CHECK_TYPE(u_int8_t, unsigned char)
|
|
|
|
tor_libevent_pkg_redhat="libevent"
|
|
tor_libevent_pkg_debian="libevent-dev"
|
|
tor_libevent_devpkg_redhat="libevent-devel"
|
|
tor_libevent_devpkg_debian="libevent-dev"
|
|
|
|
TOR_SEARCH_LIBRARY(libevent, $trylibeventdir, [-levent $TOR_LIB_WS32], [
|
|
#ifdef WIN32
|
|
#include <winsock2.h>
|
|
#endif
|
|
#include <stdlib.h>
|
|
#include <sys/time.h>
|
|
#include <sys/types.h>
|
|
#include <event.h>], [
|
|
#ifdef WIN32
|
|
#include <winsock2.h>
|
|
#endif
|
|
void exit(int); void *event_init(void);],
|
|
[
|
|
#ifdef WIN32
|
|
{WSADATA d; WSAStartup(0x101,&d); }
|
|
#endif
|
|
event_init(); exit(0);
|
|
], [--with-libevent-dir], [/opt/libevent])
|
|
|
|
dnl Now check for particular libevent functions.
|
|
save_LIBS="$LIBS"
|
|
save_LDFLAGS="$LDFLAGS"
|
|
save_CPPFLAGS="$CPPFLAGS"
|
|
LIBS="-levent $TOR_LIB_WS32 $LIBS"
|
|
LDFLAGS="$TOR_LDFLAGS_libevent $LDFLAGS"
|
|
CPPFLAGS="$TOR_CPPFLAGS_libevent $CPPFLAGS"
|
|
AC_CHECK_FUNCS(event_get_version event_get_method event_set_log_callback)
|
|
AC_CHECK_MEMBERS([struct event.min_heap_idx], , ,
|
|
[#include <event.h>
|
|
])
|
|
|
|
LIBS="$save_LIBS"
|
|
LDFLAGS="$save_LDFLAGS"
|
|
CPPFLAGS="$save_CPPFLAGS"
|
|
|
|
dnl ------------------------------------------------------
|
|
dnl Where do you live, openssl? And how do we call you?
|
|
|
|
tor_openssl_pkg_redhat="openssl"
|
|
tor_openssl_pkg_debian="libssl"
|
|
tor_openssl_devpkg_redhat="openssl-devel"
|
|
tor_openssl_devpkg_debian="libssl-dev"
|
|
|
|
ALT_openssl_WITHVAL=""
|
|
AC_ARG_WITH(ssl-dir,
|
|
[ --with-ssl-dir=PATH Obsolete alias for --with-openssl-dir ],
|
|
[
|
|
if test "x$withval" != xno && test "x$withval" != "x" ; then
|
|
ALT_openssl_WITHVAL="$withval"
|
|
fi
|
|
])
|
|
|
|
TOR_SEARCH_LIBRARY(openssl, $tryssldir, [-lssl -lcrypto $TOR_LIB_GDI],
|
|
[#include <openssl/rand.h>],
|
|
[void RAND_add(const void *buf, int num, double entropy);],
|
|
[RAND_add((void*)0,0,0); exit(0);], [],
|
|
[/usr/local/openssl /usr/lib/openssl /usr/local/ssl /usr/lib/ssl /usr/local /usr/athena /opt/openssl])
|
|
|
|
dnl XXXX check for OPENSSL_VERSION_NUMBER == SSLeay()
|
|
|
|
dnl ------------------------------------------------------
|
|
dnl Where do you live, zlib? And how do we call you?
|
|
|
|
tor_openssl_pkg_redhat="zlib"
|
|
tor_openssl_pkg_debian="zlib1g"
|
|
tor_openssl_devpkg_redhat="zlib-devel"
|
|
tor_openssl_devpkg_debian="zlib1g-dev"
|
|
|
|
TOR_SEARCH_LIBRARY(zlib, $tryzlibdir, [-lz],
|
|
[#include <zlib.h>],
|
|
[const char * zlibVersion(void);],
|
|
[zlibVersion(); exit(0);], [--with-zlib-dir],
|
|
[/opt/zlib])
|
|
|
|
dnl Make sure to enable support for large off_t if available.
|
|
|
|
AC_SYS_LARGEFILE
|
|
|
|
AC_CHECK_HEADERS(unistd.h string.h signal.h ctype.h sys/stat.h sys/types.h fcntl.h sys/fcntl.h sys/time.h errno.h assert.h time.h, , AC_MSG_WARN(Some headers were not found, compilation may fail. If compilation succeeds, please send your orconfig.h to the developers so we can fix this warning.))
|
|
|
|
AC_CHECK_HEADERS(netdb.h sys/ioctl.h sys/socket.h arpa/inet.h netinet/in.h pwd.h grp.h sys/un.h sys/uio.h)
|
|
|
|
dnl These headers are not essential
|
|
|
|
AC_CHECK_HEADERS(stdint.h sys/types.h inttypes.h sys/param.h sys/wait.h limits.h sys/limits.h netinet/in.h arpa/inet.h machine/limits.h syslog.h sys/time.h sys/resource.h inttypes.h utime.h sys/utime.h sys/mman.h netinet/in6.h malloc.h sys/syslimits.h malloc/malloc.h linux/types.h sys/file.h malloc_np.h)
|
|
|
|
TOR_CHECK_PROTOTYPE(malloc_good_size, HAVE_MALLOC_GOOD_SIZE_PROTOTYPE,
|
|
[#ifdef HAVE_MALLOC_H
|
|
#include <malloc.h>
|
|
#endif
|
|
#ifdef HAVE_MALLOC_MALLOC_H
|
|
#include <malloc/malloc.h>
|
|
#endif])
|
|
|
|
AC_CHECK_HEADERS(net/if.h, net_if_found=1, net_if_found=0,
|
|
[#ifdef HAVE_SYS_TYPES_H
|
|
#include <sys/types.h>
|
|
#endif
|
|
#ifdef HAVE_SYS_SOCKET_H
|
|
#include <sys/socket.h>
|
|
#endif])
|
|
AC_CHECK_HEADERS(net/pfvar.h, net_pfvar_found=1, net_pfvar_found=0,
|
|
[#ifdef HAVE_SYS_TYPES_H
|
|
#include <sys/types.h>
|
|
#endif
|
|
#ifdef HAVE_SYS_SOCKET_H
|
|
#include <sys/socket.h>
|
|
#endif
|
|
#ifdef HAVE_NET_IF_H
|
|
#include <net/if.h>
|
|
#endif])
|
|
AC_CHECK_HEADERS(linux/netfilter_ipv4.h,
|
|
linux_netfilter_ipv4=1, linux_netfilter_ipv4=0,
|
|
[#ifdef HAVE_SYS_TYPES_H
|
|
#include <sys/types.h>
|
|
#endif
|
|
#ifdef HAVE_SYS_SOCKET_H
|
|
#include <sys/socket.h>
|
|
#endif
|
|
#ifdef HAVE_LIMITS_H
|
|
#include <limits.h>
|
|
#endif
|
|
#ifdef HAVE_LINUX_TYPES_H
|
|
#include <linux/types.h>
|
|
#endif
|
|
#ifdef HAVE_NETINET_IN6_H
|
|
#include <netinet/in6.h>
|
|
#endif
|
|
#ifdef HAVE_NETINET_IN_H
|
|
#include <netinet/in.h>
|
|
#endif])
|
|
|
|
if test x$transparent = xtrue ; then
|
|
transparent_ok=0
|
|
if test x$net_if_found = x1 && test x$net_pfvar_found = x1 ; then
|
|
transparent_ok=1
|
|
fi
|
|
if test x$linux_netfilter_ipv4 = x1 ; then
|
|
transparent_ok=1
|
|
fi
|
|
if test x$transparent_ok = x1 ; then
|
|
AC_DEFINE(USE_TRANSPARENT, 1, "Define to enable transparent proxy support")
|
|
case $host in
|
|
*-*-openbsd*)
|
|
AC_DEFINE(OPENBSD, 1, "Define to handle pf on OpenBSD properly") ;;
|
|
esac
|
|
else
|
|
AC_MSG_NOTICE([Transparent proxy support enabled, but missing headers.])
|
|
fi
|
|
fi
|
|
|
|
AC_CHECK_MEMBERS([struct timeval.tv_sec], , ,
|
|
[#ifdef HAVE_SYS_TYPES_H
|
|
#include <sys/types.h>
|
|
#endif
|
|
#ifdef HAVE_SYS_TIME_H
|
|
#include <sys/time.h>
|
|
#endif])
|
|
|
|
dnl In case we aren't given a working stdint.h, we'll need to grow our own.
|
|
dnl Watch out.
|
|
|
|
AC_CHECK_SIZEOF(int8_t)
|
|
AC_CHECK_SIZEOF(int16_t)
|
|
AC_CHECK_SIZEOF(int32_t)
|
|
AC_CHECK_SIZEOF(int64_t)
|
|
AC_CHECK_SIZEOF(uint8_t)
|
|
AC_CHECK_SIZEOF(uint16_t)
|
|
AC_CHECK_SIZEOF(uint32_t)
|
|
AC_CHECK_SIZEOF(uint64_t)
|
|
AC_CHECK_SIZEOF(intptr_t)
|
|
AC_CHECK_SIZEOF(uintptr_t)
|
|
|
|
dnl AC_CHECK_TYPES([int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t, uint64_t, intptr_t, uintptr_t])
|
|
|
|
AC_CHECK_SIZEOF(char)
|
|
AC_CHECK_SIZEOF(short)
|
|
AC_CHECK_SIZEOF(int)
|
|
AC_CHECK_SIZEOF(long)
|
|
AC_CHECK_SIZEOF(long long)
|
|
AC_CHECK_SIZEOF(__int64)
|
|
AC_CHECK_SIZEOF(void *)
|
|
AC_CHECK_SIZEOF(time_t)
|
|
AC_CHECK_SIZEOF(size_t)
|
|
|
|
AC_CHECK_TYPES([uint, u_char, ssize_t])
|
|
|
|
dnl used to include sockaddr_storage, but everybody has that.
|
|
AC_CHECK_TYPES([struct in6_addr, struct sockaddr_in6, sa_family_t], , ,
|
|
[#ifdef HAVE_SYS_TYPES_H
|
|
#include <sys/types.h>
|
|
#endif
|
|
#ifdef HAVE_NETINET_IN_H
|
|
#include <netinet/in.h>
|
|
#endif
|
|
#ifdef HAVE_NETINET_IN6_H
|
|
#include <netinet/in6.h>
|
|
#endif
|
|
#ifdef HAVE_SYS_SOCKET_H
|
|
#include <sys/socket.h>
|
|
#endif
|
|
#ifdef MS_WINDOWS
|
|
#define WIN32_WINNT 0x400
|
|
#define _WIN32_WINNT 0x400
|
|
#define WIN32_LEAN_AND_MEAN
|
|
#if defined(_MSC_VER) && (_MSC_VER < 1300)
|
|
#include <winsock.h>
|
|
#else
|
|
#include <winsock2.h>
|
|
#include <ws2tcpip.h>
|
|
#endif
|
|
#endif
|
|
])
|
|
AC_CHECK_MEMBERS([struct in6_addr.s6_addr32, struct in6_addr.s6_addr16, struct sockaddr_in.sin_len, struct sockaddr_in6.sin6_len], , ,
|
|
[#ifdef HAVE_SYS_TYPES_H
|
|
#include <sys/types.h>
|
|
#endif
|
|
#ifdef HAVE_NETINET_IN_H
|
|
#include <netinet/in.h>
|
|
#endif
|
|
#ifdef HAVE_NETINET_IN6_H
|
|
#include <netinet/in6.h>
|
|
#endif
|
|
#ifdef HAVE_SYS_SOCKET_H
|
|
#include <sys/socket.h>
|
|
#endif
|
|
#ifdef MS_WINDOWS
|
|
#define WIN32_WINNT 0x400
|
|
#define _WIN32_WINNT 0x400
|
|
#define WIN32_LEAN_AND_MEAN
|
|
#if defined(_MSC_VER) && (_MSC_VER < 1300)
|
|
#include <winsock.h>
|
|
#else
|
|
#include <winsock2.h>
|
|
#include <ws2tcpip.h>
|
|
#endif
|
|
#endif
|
|
])
|
|
|
|
AC_CHECK_TYPES([rlim_t], , ,
|
|
[#ifdef HAVE_SYS_TYPES_H
|
|
#include <sys/types.h>
|
|
#endif
|
|
#ifdef HAVE_SYS_TIME_H
|
|
#include <sys/time.h>
|
|
#endif
|
|
#ifdef HAVE_SYS_RESOURCE_H
|
|
#include <sys/resource.h>
|
|
#endif
|
|
])
|
|
|
|
AC_CACHE_CHECK([whether time_t is signed], tor_cv_time_t_signed, [
|
|
AC_RUN_IFELSE(AC_LANG_SOURCE([
|
|
#ifdef HAVE_SYS_TYPES_H
|
|
#include <sys/types.h>
|
|
#endif
|
|
#ifdef HAVE_SYS_TIME_H
|
|
#include <sys/time.h>
|
|
#endif
|
|
#ifdef HAVE_TIME_H
|
|
#include <time.h>
|
|
#endif
|
|
int main(int c, char**v) { if (((time_t)-1)<0) return 1; else return 0; }]),
|
|
tor_cv_time_t_signed=no, tor_cv_time_t_signed=yes, tor_cv_time_t_signed=cross)
|
|
])
|
|
|
|
if test "$tor_cv_time_t_signed" = cross; then
|
|
AC_MSG_NOTICE([Cross compiling: assuming that time_t is signed.])
|
|
fi
|
|
|
|
if test "$tor_cv_time_t_signed" != no; then
|
|
AC_DEFINE([TIME_T_IS_SIGNED], 1,
|
|
[Define to 1 iff time_t is signed])
|
|
fi
|
|
|
|
AC_CHECK_SIZEOF(socklen_t, , [AC_INCLUDES_DEFAULT()
|
|
#ifdef HAVE_SYS_SOCKET_H
|
|
#include <sys/socket.h>
|
|
#endif
|
|
])
|
|
|
|
# We want to make sure that we _don't_ have a cell_t defined, like IRIX does.
|
|
|
|
AC_CHECK_SIZEOF(cell_t)
|
|
|
|
# Now make sure that NULL can be represented as zero bytes.
|
|
AC_CACHE_CHECK([whether memset(0) sets pointers to NULL], tor_cv_null_is_zero,
|
|
[AC_RUN_IFELSE([AC_LANG_SOURCE(
|
|
[[#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
#ifdef HAVE_STDDEF_H
|
|
#include <stddef.h>
|
|
#endif
|
|
int main () { char *p1,*p2; p1=NULL; memset(&p2,0,sizeof(p2));
|
|
return memcmp(&p1,&p2,sizeof(char*))?1:0; }]])],
|
|
[tor_cv_null_is_zero=yes],
|
|
[tor_cv_null_is_zero=no],
|
|
[tor_cv_null_is_zero=cross])])
|
|
|
|
if test "$tor_cv_null_is_zero" = cross ; then
|
|
# Cross-compiling; let's hope that the target isn't raving mad.
|
|
AC_MSG_NOTICE([Cross-compiling: we'll assume that NULL is represented as a sequence of 0-valued bytes.])
|
|
fi
|
|
|
|
if test "$tor_cv_null_is_zero" != no; then
|
|
AC_DEFINE([NULL_REP_IS_ZERO_BYTES], 1,
|
|
[Define to 1 iff memset(0) sets pointers to NULL])
|
|
fi
|
|
|
|
# And what happens when we malloc zero?
|
|
AC_CACHE_CHECK([whether we can malloc(0) safely.], tor_cv_malloc_zero_works,
|
|
[AC_RUN_IFELSE([AC_LANG_SOURCE(
|
|
[[#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
#ifdef HAVE_STDDEF_H
|
|
#include <stddef.h>
|
|
#endif
|
|
int main () { return malloc(0)?0:1; }]])],
|
|
[tor_cv_malloc_zero_works=yes],
|
|
[tor_cv_malloc_zero_works=no],
|
|
[tor_cv_malloc_zero_works=cross])])
|
|
|
|
if test "$tor_cv_malloc_zero_works" = cross; then
|
|
# Cross-compiling; let's hope that the target isn't raving mad.
|
|
AC_MSG_NOTICE([Cross-compiling: we'll assume that we need to check malloc() arguments for 0.])
|
|
fi
|
|
|
|
if test "$tor_cv_malloc_zero_works" = yes; then
|
|
AC_DEFINE([MALLOC_ZERO_WORKS], 1,
|
|
[Define to 1 iff malloc(0) returns a pointer])
|
|
fi
|
|
|
|
# whether we seem to be in a 2s-complement world.
|
|
AC_CACHE_CHECK([whether we are using 2s-complement arithmetic], tor_cv_twos_complement,
|
|
[AC_RUN_IFELSE([AC_LANG_SOURCE(
|
|
[[int main () { int problem = ((-99) != (~99)+1);
|
|
return problem ? 1 : 0; }]])],
|
|
[tor_cv_twos_complement=yes],
|
|
[tor_cv_twos_complement=no],
|
|
[tor_cv_twos_complement=cross])])
|
|
|
|
if test "$tor_cv_twos_complement" = cross ; then
|
|
# Cross-compiling; let's hope that the target isn't raving mad.
|
|
AC_MSG_NOTICE([Cross-compiling: we'll assume that negative integers are represented with two's complement.])
|
|
fi
|
|
|
|
if test "$tor_cv_twos_complement" != no ; then
|
|
AC_DEFINE([USING_TWOS_COMPLEMENT], 1,
|
|
[Define to 1 iff we represent negative integers with two's complement])
|
|
fi
|
|
|
|
# Whether we should use the dmalloc memory allocation debugging library.
|
|
AC_MSG_CHECKING(whether to use dmalloc (debug memory allocation library))
|
|
AC_ARG_WITH(dmalloc,
|
|
[ --with-dmalloc Use debug memory allocation library. ],
|
|
[if [[ "$withval" = "yes" ]]; then
|
|
dmalloc=1
|
|
AC_MSG_RESULT(yes)
|
|
else
|
|
dmalloc=1
|
|
AC_MSG_RESULT(no)
|
|
fi], [ dmalloc=0; AC_MSG_RESULT(no) ]
|
|
)
|
|
|
|
if [[ $dmalloc -eq 1 ]]; then
|
|
AC_CHECK_HEADERS(dmalloc.h, , AC_MSG_ERROR(dmalloc header file not found. Do you have the development files for dmalloc installed?))
|
|
AC_SEARCH_LIBS(dmalloc_malloc, [dmallocth dmalloc], , AC_MSG_ERROR(Libdmalloc library not found. If you enable it you better have it installed.))
|
|
AC_DEFINE(USE_DMALLOC, 1, [Debug memory allocation library])
|
|
AC_DEFINE(DMALLOC_FUNC_CHECK, 1, [Enable dmalloc's malloc function check])
|
|
AC_CHECK_FUNCS(dmalloc_strdup dmalloc_strndup)
|
|
fi
|
|
|
|
AC_ARG_WITH(tcmalloc,
|
|
[ --with-tcmalloc Use tcmalloc memory allocation library. ],
|
|
[ tcmalloc=yes ], [ tcmalloc=no ])
|
|
|
|
if test x$tcmalloc = xyes ; then
|
|
LDFLAGS="-ltcmalloc $LDFLAGS"
|
|
fi
|
|
|
|
# Allow user to specify an alternate syslog facility
|
|
AC_ARG_WITH(syslog-facility,
|
|
[ --with-syslog-facility=LOG syslog facility to use (default=LOG_DAEMON)],
|
|
syslog_facility="$withval", syslog_facility="LOG_DAEMON")
|
|
AC_DEFINE_UNQUOTED(LOGFACILITY,$syslog_facility,[name of the syslog facility])
|
|
AC_SUBST(LOGFACILITY)
|
|
|
|
# Check if we have getresuid and getresgid
|
|
AC_CHECK_FUNCS(getresuid getresgid)
|
|
|
|
# Check for gethostbyname_r in all its glorious incompatible versions.
|
|
# (This logic is based on that in Python's configure.in)
|
|
AH_TEMPLATE(HAVE_GETHOSTBYNAME_R,
|
|
[Define this if you have any gethostbyname_r()])
|
|
|
|
AC_CHECK_FUNC(gethostbyname_r, [
|
|
AC_MSG_CHECKING([how many arguments gethostbyname_r() wants])
|
|
OLD_CFLAGS=$CFLAGS
|
|
CFLAGS="$CFLAGS $MY_CPPFLAGS $MY_THREAD_CPPFLAGS $MY_CFLAGS"
|
|
AC_COMPILE_IFELSE(AC_LANG_PROGRAM([
|
|
#include <netdb.h>
|
|
], [[
|
|
char *cp1, *cp2;
|
|
struct hostent *h1, *h2;
|
|
int i1, i2;
|
|
(void)gethostbyname_r(cp1,h1,cp2,i1,&h2,&i2);
|
|
]]),[
|
|
AC_DEFINE(HAVE_GETHOSTBYNAME_R)
|
|
AC_DEFINE(HAVE_GETHOSTBYNAME_R_6_ARG, 1,
|
|
[Define this if gethostbyname_r takes 6 arguments])
|
|
AC_MSG_RESULT(6)
|
|
], [
|
|
AC_TRY_COMPILE([
|
|
#include <netdb.h>
|
|
], [
|
|
char *cp1, *cp2;
|
|
struct hostent *h1;
|
|
int i1, i2;
|
|
(void)gethostbyname_r(cp1,h1,cp2,i1,&i2);
|
|
], [
|
|
AC_DEFINE(HAVE_GETHOSTBYNAME_R)
|
|
AC_DEFINE(HAVE_GETHOSTBYNAME_R_5_ARG, 1,
|
|
[Define this if gethostbyname_r takes 5 arguments])
|
|
AC_MSG_RESULT(5)
|
|
], [
|
|
AC_TRY_COMPILE([
|
|
#include <netdb.h>
|
|
], [
|
|
char *cp1;
|
|
struct hostent *h1;
|
|
struct hostent_data hd;
|
|
(void) gethostbyname_r(cp1,h1,&hd);
|
|
], [
|
|
AC_DEFINE(HAVE_GETHOSTBYNAME_R)
|
|
AC_DEFINE(HAVE_GETHOSTBYNAME_R_3_ARG, 1,
|
|
[Define this if gethostbyname_r takes 3 arguments])
|
|
AC_MSG_RESULT(3)
|
|
], [
|
|
AC_MSG_RESULT(0)
|
|
])
|
|
])
|
|
])
|
|
CFLAGS=$OLD_CFLAGS
|
|
])
|
|
|
|
AC_CACHE_CHECK([whether the C compiler supports __func__],
|
|
tor_cv_have_func_macro,
|
|
AC_COMPILE_IFELSE([
|
|
#include <stdio.h>
|
|
int main(int c, char **v) { puts(__func__); }],
|
|
tor_cv_have_func_macro=yes,
|
|
tor_cv_have_func_macro=no))
|
|
|
|
AC_CACHE_CHECK([whether the C compiler supports __FUNC__],
|
|
tor_cv_have_FUNC_macro,
|
|
AC_COMPILE_IFELSE([
|
|
#include <stdio.h>
|
|
int main(int c, char **v) { puts(__FUNC__); }],
|
|
tor_cv_have_FUNC_macro=yes,
|
|
tor_cv_have_FUNC_macro=no))
|
|
|
|
AC_CACHE_CHECK([whether the C compiler supports __FUNCTION__],
|
|
tor_cv_have_FUNCTION_macro,
|
|
AC_COMPILE_IFELSE([
|
|
#include <stdio.h>
|
|
int main(int c, char **v) { puts(__FUNCTION__); }],
|
|
tor_cv_have_FUNCTION_macro=yes,
|
|
tor_cv_have_FUNCTION_macro=no))
|
|
|
|
if test "$tor_cv_have_func_macro" = 'yes'; then
|
|
AC_DEFINE(HAVE_MACRO__func__, 1, [Defined if the compiler supports __func__])
|
|
fi
|
|
|
|
if test "$tor_cv_have_FUNC_macro" = 'yes'; then
|
|
AC_DEFINE(HAVE_MACRO__FUNC__, 1, [Defined if the compiler supports __FUNC__])
|
|
fi
|
|
|
|
if test "$tor_cv_have_FUNCTION_macro" = 'yes'; then
|
|
AC_DEFINE(HAVE_MACRO__FUNCTION__, 1,
|
|
[Defined if the compiler supports __FUNCTION__])
|
|
fi
|
|
|
|
# $prefix stores the value of the --prefix command line option, or
|
|
# NONE if the option wasn't set. In the case that it wasn't set, make
|
|
# it be the default, so that we can use it to expand directories now.
|
|
if test "x$prefix" = "xNONE"; then
|
|
prefix=$ac_default_prefix
|
|
fi
|
|
|
|
# and similarly for $exec_prefix
|
|
if test "x$exec_prefix" = "xNONE"; then
|
|
exec_prefix=$prefix
|
|
fi
|
|
|
|
if test "x$CONFDIR" = "x"; then
|
|
CONFDIR=`eval echo $sysconfdir/tor`
|
|
fi
|
|
AC_SUBST(CONFDIR)
|
|
AH_TEMPLATE([CONFDIR],[tor's configuration directory])
|
|
AC_DEFINE_UNQUOTED(CONFDIR,"$CONFDIR")
|
|
|
|
BINDIR=`eval echo $bindir`
|
|
AC_SUBST(BINDIR)
|
|
LOCALSTATEDIR=`eval echo $localstatedir`
|
|
AC_SUBST(LOCALSTATEDIR)
|
|
|
|
# Set CFLAGS _after_ all the above checks, since our warnings are stricter
|
|
# than autoconf's macros like.
|
|
if test "$ac_cv_c_compiler_gnu" = yes; then
|
|
CFLAGS="$CFLAGS -Wall -g -O2"
|
|
else
|
|
CFLAGS="$CFLAGS -g -O"
|
|
enable_gcc_warnings=no
|
|
fi
|
|
|
|
# Add some more warnings which we use in development but not in the
|
|
# released versions. (Some relevant gcc versions can't handle these.)
|
|
if test x$enable_gcc_warnings = xyes; then
|
|
|
|
AC_COMPILE_IFELSE(AC_LANG_PROGRAM([], [
|
|
#if !defined(__GNUC__) || (__GNUC__ < 4)
|
|
#error
|
|
#endif]), have_gcc4=yes, have_gcc4=no)
|
|
|
|
AC_COMPILE_IFELSE(AC_LANG_PROGRAM([], [
|
|
#if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 2)
|
|
#error
|
|
#endif]), have_gcc42=yes, have_gcc42=no)
|
|
|
|
AC_COMPILE_IFELSE(AC_LANG_PROGRAM([], [
|
|
#if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 3)
|
|
#error
|
|
#endif]), have_gcc43=yes, have_gcc43=no)
|
|
|
|
save_CFLAGS="$CFLAGS"
|
|
CFLAGS="$CFLAGS -Wshorten-64-to-32"
|
|
AC_COMPILE_IFELSE(AC_LANG_PROGRAM([], []), have_shorten64_flag=yes,
|
|
have_shorten64_flag=no)
|
|
CFLAGS="$save_CFLAGS"
|
|
|
|
CFLAGS="$CFLAGS -W -Wfloat-equal -Wundef -Wpointer-arith -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings -Wredundant-decls -Wchar-subscripts -Wcomment -Wformat=2 -Wwrite-strings -Wmissing-declarations -Wredundant-decls -Wnested-externs -Wbad-function-cast -Wswitch-enum -Werror"
|
|
|
|
# Disabled, so we can use mallinfo(): -Waggregate-return
|
|
|
|
if test x$have_gcc4 = xyes ; then
|
|
# These warnings break gcc 3.3.5 and work on gcc 4.0.2
|
|
CFLAGS="$CFLAGS -Winit-self -Wmissing-field-initializers -Wdeclaration-after-statement -Wold-style-definition"
|
|
fi
|
|
|
|
if test x$have_gcc42 = xyes ; then
|
|
# These warnings break gcc 4.0.2 and work on gcc 4.2
|
|
# XXXX020 Use -fstack-protector.
|
|
# XXXX020 See if any of these work with earlier versions.
|
|
CFLAGS="$CFLAGS -Waddress -Wmissing-noreturn -Wnormalized=id -Woverride-init -Wstrict-overflow=1"
|
|
# We used to use -Wstrict-overflow=5, but that breaks us heavily under 4.3.
|
|
fi
|
|
|
|
if test x$have_gcc43 = xyes ; then
|
|
# These warnings break gcc 4.2 and work on gcc 4.3
|
|
# XXXX020 See if any of these work with earlier versions.
|
|
CFLAGS="$CFLAGS -Wextra -Warray-bounds"
|
|
fi
|
|
|
|
if test x$have_shorten64_flag = xyes ; then
|
|
CFLAGS="$CFLAGS -Wshorten-64-to-32"
|
|
fi
|
|
|
|
##This will break the world on some 64-bit architectures
|
|
# CFLAGS="$CFLAGS -Winline"
|
|
fi
|
|
|
|
|
|
|
|
CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent $TOR_CPPFLAGS_openssl $TOR_CPPFLAGS_zlib"
|
|
|
|
AC_CONFIG_FILES([Makefile tor.spec Doxyfile contrib/tor.sh contrib/torctl contrib/torify contrib/tor.logrotate contrib/Makefile contrib/osx/Makefile contrib/osx/TorBundleDesc.plist contrib/osx/TorBundleInfo.plist contrib/osx/TorDesc.plist contrib/osx/TorInfo.plist contrib/osx/TorStartupDesc.plist src/config/torrc.sample doc/tor.1 src/Makefile doc/Makefile doc/design-paper/Makefile doc/spec/Makefile src/config/Makefile src/common/Makefile src/or/Makefile src/win32/Makefile src/tools/Makefile contrib/suse/Makefile contrib/suse/tor.sh contrib/tor.wxs])
|
|
AC_OUTPUT
|
|
|
|
if test -x /usr/bin/perl && test -x ./contrib/updateVersions.pl ; then
|
|
./contrib/updateVersions.pl
|
|
fi
|
|
|