1 dnl Copyright (c) 2001-2004, Roger Dingledine
2 dnl Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson
3 dnl Copyright (c) 2007-2008, The Tor Project, Inc.
4 dnl See LICENSE for licensing information
7 AM_INIT_AUTOMAKE(tor, 0.2.3.11-alpha-dev)
8 AM_CONFIG_HEADER(orconfig.h)
12 if test -f /etc/redhat-release ; then
13 if test -f /usr/kerberos/include ; then
14 CPPFLAGS="$CPPFLAGS -I/usr/kerberos/include"
18 # Not a no-op; we want to make sure that CPPFLAGS is set before we use
19 # the += operator on it in src/or/Makefile.am
20 CPPFLAGS="$CPPFLAGS -I\${top_srcdir}/src/common"
22 #XXXX020 We should make these enabled or not, before 0.2.0.x-final
23 AC_ARG_ENABLE(buf-freelists,
24 AS_HELP_STRING(--disable-buf-freelists, disable freelists for buffer RAM))
25 AC_ARG_ENABLE(openbsd-malloc,
26 AS_HELP_STRING(--enable-openbsd-malloc, Use malloc code from openbsd. Linux only))
27 AC_ARG_ENABLE(instrument-downloads,
28 AS_HELP_STRING(--enable-instrument-downloads, Instrument downloads of directory resources etc.))
29 AC_ARG_ENABLE(static-openssl,
30 AS_HELP_STRING(--enable-static-openssl, Link against a static openssl library. Requires --with-openssl-dir))
31 AC_ARG_ENABLE(static-libevent,
32 AS_HELP_STRING(--enable-static-libevent, Link against a static libevent library. Requires --with-libevent-dir))
33 AC_ARG_ENABLE(static-zlib,
34 AS_HELP_STRING(--enable-static-zlib, Link against a static zlib library. Requires --with-zlib-dir))
35 AC_ARG_ENABLE(static-tor,
36 AS_HELP_STRING(--enable-static-tor, Create an entirely static Tor binary. Requires --with-openssl-dir and --with-libevent-dir and --with-zlib-dir))
38 if test "$enable_static_tor" = "yes"; then
39 enable_static_libevent="yes";
40 enable_static_openssl="yes";
41 enable_static_zlib="yes";
42 CFLAGS="$CFLAGS -static"
45 if test x$enable_buf_freelists != xno; then
46 AC_DEFINE(ENABLE_BUF_FREELISTS, 1,
47 [Defined if we try to use freelists for buffer RAM chunks])
49 AM_CONDITIONAL(USE_OPENBSD_MALLOC, test x$enable_openbsd_malloc = xyes)
50 if test x$enable_instrument_downloads = xyes; then
51 AC_DEFINE(INSTRUMENT_DOWNLOADS, 1,
52 [Defined if we want to keep track of how much of each kind of resource we download.])
55 AC_ARG_ENABLE(transparent,
56 AS_HELP_STRING(--disable-transparent, disable transparent proxy support),
57 [case "${enableval}" in
58 yes) transparent=true ;;
59 no) transparent=false ;;
60 *) AC_MSG_ERROR(bad value for --enable-transparent) ;;
61 esac], [transparent=true])
63 AC_ARG_ENABLE(asciidoc,
64 AS_HELP_STRING(--disable-asciidoc, don't use asciidoc (disables building of manpages)),
65 [case "${enableval}" in
68 *) AC_MSG_ERROR(bad value for --disable-asciidoc) ;;
69 esac], [asciidoc=true])
71 # By default, we're not ready to ship a NAT-PMP aware Tor
72 AC_ARG_ENABLE(nat-pmp,
73 AS_HELP_STRING(--enable-nat-pmp, enable NAT-PMP support),
74 [case "${enableval}" in
77 * ) AC_MSG_ERROR(bad value for --enable-nat-pmp) ;;
78 esac], [natpmp=false])
80 # By default, we're not ready to ship a UPnP aware Tor
82 AS_HELP_STRING(--enable-upnp, enable UPnP support),
83 [case "${enableval}" in
86 * ) AC_MSG_ERROR(bad value for --enable-upnp) ;;
90 AC_ARG_ENABLE(threads,
91 AS_HELP_STRING(--disable-threads, disable multi-threading support))
93 if test x$enable_threads = x; then
96 # Don't try multithreading on solaris -- cpuworkers seem to lock.
97 AC_MSG_NOTICE([You are running Solaris; Sometimes threading makes
98 cpu workers lock up here, so I will disable threads.])
101 enable_threads="yes";;
105 if test "$enable_threads" = "yes"; then
106 AC_DEFINE(ENABLE_THREADS, 1, [Defined if we will try to use multithreading])
111 AC_DEFINE(_REENTRANT, 1, [Define on some platforms to activate x_r() functions in time.h])
115 AC_ARG_ENABLE(gcc-warnings,
116 AS_HELP_STRING(--enable-gcc-warnings, enable verbose warnings))
117 AC_ARG_ENABLE(gcc-warnings-advisory,
118 AS_HELP_STRING(--enable-gcc-warnings-advisory, [enable verbose warnings, excluding -Werror]))
120 dnl Adam shostack suggests the following for Windows:
121 dnl -D_FORTIFY_SOURCE=2 -fstack-protector-all
122 dnl Others suggest '/gs /safeseh /nxcompat /dynamicbase' for non-gcc on Windows
123 dnl This requires that we use gcc and that we add -O2 to the CFLAGS.
124 AC_ARG_ENABLE(gcc-hardening,
125 AS_HELP_STRING(--enable-gcc-hardening, enable compiler security checks),
126 [if test x$enableval = xyes; then
127 CFLAGS="$CFLAGS -D_FORTIFY_SOURCE=2 -fstack-protector-all"
128 CFLAGS="$CFLAGS -fwrapv -fPIE -Wstack-protector"
129 CFLAGS="$CFLAGS --param ssp-buffer-size=1"
130 LDFLAGS="$LDFLAGS -pie"
133 dnl Linker hardening options
134 dnl Currently these options are ELF specific - you can't use this with MacOSX
135 AC_ARG_ENABLE(linker-hardening,
136 AS_HELP_STRING(--enable-linker-hardening, enable linker security fixups),
137 [if test x$enableval = xyes; then
138 LDFLAGS="$LDFLAGS -z relro -z now"
141 AC_ARG_ENABLE(local-appdata,
142 AS_HELP_STRING(--enable-local-appdata, default to host local application data paths on Windows))
143 if test "$enable_local_appdata" = "yes"; then
144 AC_DEFINE(ENABLE_LOCAL_APPDATA, 1,
145 [Defined if we default to host local appdata paths on Windows])
149 AC_ARG_ENABLE(tor2web-mode,
150 AS_HELP_STRING(--enable-tor2web-mode, support tor2web non-anonymous mode),
151 [if test x$enableval = xyes; then
152 CFLAGS="$CFLAGS -D ENABLE_TOR2WEB_MODE=1"
155 AC_ARG_ENABLE(bufferevents,
156 AS_HELP_STRING(--enable-bufferevents, use Libevent's buffered IO.))
158 dnl check for the correct "ar" when cross-compiling
159 AN_MAKEVAR([AR], [AC_PROG_AR])
160 AN_PROGRAM([ar], [AC_PROG_AR])
161 AC_DEFUN([AC_PROG_AR], [AC_CHECK_TOOL([AR], [ar], [ar])])
169 dnl autoconf 2.59 appears not to support AC_PROG_SED
170 AC_CHECK_PROG([SED],[sed],[sed],[/bin/false])
172 dnl check for asciidoc and a2x
173 AC_PATH_PROG([ASCIIDOC], [asciidoc], none)
174 AC_PATH_PROG([A2X], [a2x], none)
176 AM_CONDITIONAL(USE_ASCIIDOC, test x$asciidoc = xtrue)
178 AM_CONDITIONAL(USE_FW_HELPER, test x$natpmp = xtrue || test x$upnp = xtrue)
179 AM_CONDITIONAL(NAT_PMP, test x$natpmp = xtrue)
180 AM_CONDITIONAL(MINIUPNPC, test x$upnp = xtrue)
183 ifdef([AC_C_FLEXIBLE_ARRAY_MEMBER], [
184 AC_C_FLEXIBLE_ARRAY_MEMBER
186 dnl Maybe we've got an old autoconf...
187 AC_CACHE_CHECK([for flexible array members],
191 struct abc { int a; char b[]; };
193 struct abc *def = malloc(sizeof(struct abc)+sizeof(char));
196 [tor_cv_c_flexarray=yes],
197 [tor_cv_c_flexarray=no])])
198 if test $tor_cv_flexarray = yes ; then
199 AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [], [Define to nothing if C supports flexible array members, and to 1 if it does not.])
201 AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [1], [Define to nothing if C supports flexible array members, and to 1 if it does not.])
205 AC_PATH_PROG([SHA1SUM], [sha1sum], none)
206 AC_PATH_PROG([OPENSSL], [openssl], none)
209 AC_ARG_WITH(tor-user,
210 [ --with-tor-user=NAME Specify username for tor daemon ],
218 AC_ARG_WITH(tor-group,
219 [ --with-tor-group=NAME Specify group name for tor daemon ],
227 dnl If _WIN32 is defined and non-zero, we are building for win32
228 AC_MSG_CHECKING([for win32])
229 AC_RUN_IFELSE([AC_LANG_SOURCE([
230 int main(int c, char **v) {
241 bwin32=true; AC_MSG_RESULT([yes]),
242 bwin32=false; AC_MSG_RESULT([no]),
243 bwin32=cross; AC_MSG_RESULT([cross])
246 if test "$bwin32" = cross; then
247 AC_MSG_CHECKING([for win32 (cross)])
248 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
250 int main(int c, char **v) {return 0;}
253 int main(int c, char **v) {return x(y);}
256 bwin32=true; AC_MSG_RESULT([yes]),
257 bwin32=false; AC_MSG_RESULT([no]))
260 AM_CONDITIONAL(BUILD_NT_SERVICES, test x$bwin32 = xtrue)
262 dnl Enable C99 when compiling with MIPSpro
263 AC_MSG_CHECKING([for MIPSpro compiler])
264 AC_COMPILE_IFELSE([AC_LANG_PROGRAM(, [
265 #if (defined(__sgi) && defined(_COMPILER_VERSION))
270 bmipspro=false; AC_MSG_RESULT(no),
271 bmipspro=true; AC_MSG_RESULT(yes))
273 if test "$bmipspro" = true; then
274 CFLAGS="$CFLAGS -c99"
279 AC_SEARCH_LIBS(socket, [socket network])
280 AC_SEARCH_LIBS(gethostbyname, [nsl])
281 AC_SEARCH_LIBS(dlopen, [dl])
282 AC_SEARCH_LIBS(inet_aton, [resolv])
283 AC_SEARCH_LIBS([clock_gettime], [rt], [have_rt=yes])
285 if test "$enable_threads" = "yes"; then
286 AC_SEARCH_LIBS(pthread_create, [pthread])
287 AC_SEARCH_LIBS(pthread_detach, [pthread])
290 dnl -------------------------------------------------------------------
291 dnl Check for functions before libevent, since libevent-1.2 apparently
292 dnl exports strlcpy without defining it in a header.
322 using_custom_malloc=no
323 if test x$enable_openbsd_malloc = xyes ; then
324 AC_DEFINE(HAVE_MALLOC_GOOD_SIZE, 1, [Defined if we have the malloc_good_size function])
325 using_custom_malloc=yes
327 if test x$tcmalloc = xyes ; then
328 using_custom_malloc=yes
330 if test $using_custom_malloc = no ; then
331 AC_CHECK_FUNCS(mallinfo malloc_good_size malloc_usable_size)
334 if test "$enable_threads" = "yes"; then
335 AC_CHECK_HEADERS(pthread.h)
336 AC_CHECK_FUNCS(pthread_create)
339 dnl ------------------------------------------------------
340 dnl Where do you live, libevent? And how do we call you?
342 if test "$bwin32" = true; then
343 TOR_LIB_WS32=-lws2_32
344 TOR_LIB_IPHLPAPI=-liphlpapi
345 # Some of the cargo-cults recommend -lwsock32 as well, but I don't
346 # think it's actually necessary.
352 AC_SUBST(TOR_LIB_WS32)
353 AC_SUBST(TOR_LIB_GDI)
354 AC_SUBST(TOR_LIB_IPHLPAPI)
356 dnl We need to do this before we try our disgusting hack below.
357 AC_CHECK_HEADERS([sys/types.h])
359 dnl This is a disgusting hack so we safely include older libevent headers.
360 AC_CHECK_TYPE(u_int64_t, unsigned long long)
361 AC_CHECK_TYPE(u_int32_t, unsigned long)
362 AC_CHECK_TYPE(u_int16_t, unsigned short)
363 AC_CHECK_TYPE(u_int8_t, unsigned char)
365 tor_libevent_pkg_redhat="libevent"
366 tor_libevent_pkg_debian="libevent-dev"
367 tor_libevent_devpkg_redhat="libevent-devel"
368 tor_libevent_devpkg_debian="libevent-dev"
370 dnl On Gnu/Linux or any place we require it, we'll add librt to the Libevent
371 dnl linking for static builds.
372 STATIC_LIBEVENT_FLAGS=""
373 if test "$enable_static_libevent" = "yes"; then
374 if test "$have_rt" = yes; then
375 STATIC_LIBEVENT_FLAGS=" -lrt "
379 TOR_SEARCH_LIBRARY(libevent, $trylibeventdir, [-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32], [
381 #include <winsock2.h>
384 #include <sys/time.h>
385 #include <sys/types.h>
386 #include <event.h>], [
388 #include <winsock2.h>
390 void exit(int); void *event_init(void);],
393 {WSADATA d; WSAStartup(0x101,&d); }
395 event_init(); exit(0);
396 ], [--with-libevent-dir], [/opt/libevent])
398 dnl Now check for particular libevent functions.
400 save_LDFLAGS="$LDFLAGS"
401 save_CPPFLAGS="$CPPFLAGS"
402 LIBS="-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32 $LIBS"
403 LDFLAGS="$TOR_LDFLAGS_libevent $LDFLAGS"
404 CPPFLAGS="$TOR_CPPFLAGS_libevent $CPPFLAGS"
405 AC_CHECK_FUNCS(event_get_version event_get_version_number event_get_method event_set_log_callback evdns_set_outgoing_bind_address event_base_loopexit)
406 AC_CHECK_MEMBERS([struct event.min_heap_idx], , ,
410 AC_CHECK_HEADERS(event2/event.h event2/dns.h event2/bufferevent_ssl.h)
413 LDFLAGS="$save_LDFLAGS"
414 CPPFLAGS="$save_CPPFLAGS"
417 AM_CONDITIONAL(USE_EXTERNAL_EVDNS, test x$ac_cv_header_event2_dns_h = xyes)
419 if test "$enable_static_libevent" = "yes"; then
420 if test "$tor_cv_library_libevent_dir" = "(system)"; then
421 AC_MSG_ERROR("You must specify an explicit --with-libevent-dir=x option when using --enable-static-libevent")
423 TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent.a $STATIC_LIBEVENT_FLAGS"
426 TOR_LIBEVENT_LIBS="-levent"
429 dnl This isn't the best test for Libevent 2.0.3-alpha. Once it's released,
430 dnl we can do much better.
431 if test "$enable_bufferevents" = "yes" ; then
432 if test "$ac_cv_header_event2_bufferevent_ssl_h" != "yes" ; then
433 AC_MSG_ERROR([You've asked for bufferevent support, but you're using a version of Libevent without SSL support. This won't work. We need Libevent 2.0.8-rc or later, and you don't seem to even have Libevent 2.0.3-alpha.])
436 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent"
438 # Check for the right version. First see if version detection works.
439 AC_MSG_CHECKING([whether we can detect the Libevent version])
440 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
441 #include <event2/event.h>
442 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 10
448 ])], [event_version_number_works=yes; AC_MSG_RESULT([yes]) ],
449 [event_version_number_works=no; AC_MSG_RESULT([no])])
450 if test "$event_version_number_works" != 'yes'; then
451 AC_MSG_WARN([Version detection on Libevent seems broken. Your Libevent installation is probably screwed up or very old.])
453 AC_MSG_CHECKING([whether Libevent is new enough for bufferevents])
454 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
455 #include <event2/event.h>
456 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 0x02000d00
462 ])], [ AC_MSG_RESULT([yes]) ],
463 [ AC_MSG_RESULT([no])
464 AC_MSG_ERROR([Libevent does not seem new enough to support bufferevents. We require 2.0.13-stable or later]) ] )
470 LDFLAGS="$save_LDFLAGS"
471 CPPFLAGS="$save_CPPFLAGS"
473 AM_CONDITIONAL(USE_BUFFEREVENTS, test "$enable_bufferevents" = "yes")
474 if test "$enable_bufferevents" = "yes"; then
475 AC_DEFINE(USE_BUFFEREVENTS, 1, [Defined if we're going to use Libevent's buffered IO API])
476 if test "$enable_static_libevent" = "yes"; then
477 TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent_openssl.a $TOR_LIBEVENT_LIBS"
479 TOR_LIBEVENT_LIBS="-levent_openssl $TOR_LIBEVENT_LIBS"
482 AC_SUBST(TOR_LIBEVENT_LIBS)
484 dnl ------------------------------------------------------
485 dnl Where do you live, libm?
487 dnl On some platforms (Haiku/BeOS) the math library is
488 dnl part of libroot. In which case don't link against lm
491 AC_SEARCH_LIBS(pow, [m], , AC_MSG_ERROR([Could not find pow in libm or libc.]))
492 if test "$ac_cv_search_pow" != "none required"; then
493 TOR_LIB_MATH="$ac_cv_search_pow"
496 AC_SUBST(TOR_LIB_MATH)
498 dnl ------------------------------------------------------
499 dnl Where do you live, openssl? And how do we call you?
501 tor_openssl_pkg_redhat="openssl"
502 tor_openssl_pkg_debian="libssl"
503 tor_openssl_devpkg_redhat="openssl-devel"
504 tor_openssl_devpkg_debian="libssl-dev"
506 ALT_openssl_WITHVAL=""
508 [ --with-ssl-dir=PATH Obsolete alias for --with-openssl-dir ],
510 if test "x$withval" != xno && test "x$withval" != "x" ; then
511 ALT_openssl_WITHVAL="$withval"
515 TOR_SEARCH_LIBRARY(openssl, $tryssldir, [-lssl -lcrypto $TOR_LIB_GDI],
516 [#include <openssl/rand.h>],
517 [void RAND_add(const void *buf, int num, double entropy);],
518 [RAND_add((void*)0,0,0); exit(0);], [],
519 [/usr/local/openssl /usr/lib/openssl /usr/local/ssl /usr/lib/ssl /usr/local /usr/athena /opt/openssl])
521 dnl XXXX check for OPENSSL_VERSION_NUMBER == SSLeay()
523 echo "tor_cv_library_openssl_dir is $tor_cv_library_openssl_dir"
524 if test "$enable_static_openssl" = "yes"; then
525 if test "$tor_cv_library_openssl_dir" = "(system)"; then
526 AC_MSG_ERROR("You must specify an explicit --with-openssl-dir=x option when using --enable-static-openssl")
528 TOR_OPENSSL_LIBS="$TOR_LIBDIR_openssl/libssl.a $TOR_LIBDIR_openssl/libcrypto.a"
531 TOR_OPENSSL_LIBS="-lssl -lcrypto"
533 AC_SUBST(TOR_OPENSSL_LIBS)
535 dnl ------------------------------------------------------
536 dnl Where do you live, zlib? And how do we call you?
538 tor_zlib_pkg_redhat="zlib"
539 tor_zlib_pkg_debian="zlib1g"
540 tor_zlib_devpkg_redhat="zlib-devel"
541 tor_zlib_devpkg_debian="zlib1g-dev"
543 TOR_SEARCH_LIBRARY(zlib, $tryzlibdir, [-lz],
545 [const char * zlibVersion(void);],
546 [zlibVersion(); exit(0);], [--with-zlib-dir],
549 if test "$enable_static_zlib" = "yes"; then
550 if test "$tor_cv_library_zlib_dir" = "(system)"; then
551 AC_MSG_ERROR("You must specify an explicit --with-zlib-dir=x option when
552 using --enable-static-zlib")
554 TOR_ZLIB_LIBS="$TOR_LIBDIR_zlib/libz.a"
555 echo "$TOR_LIBDIR_zlib/libz.a"
560 AC_SUBST(TOR_ZLIB_LIBS)
562 dnl Make sure to enable support for large off_t if available.
565 dnl ------------------------------------------------------
566 dnl Where do you live, libnatpmp? And how do we call you?
567 dnl There are no packages for Debian or Redhat as of this patch
569 if test "$natpmp" = "true"; then
570 AC_DEFINE(NAT_PMP, 1, [Define to 1 if we are building with nat-pmp.])
571 TOR_SEARCH_LIBRARY(libnatpmp, $trylibnatpmpdir, [-lnatpmp $TOR_LIB_WS32 $TOR_LIB_IPHLPAPI],
572 [#include <natpmp.h>],
576 #include <natpmp.h>],
579 natpmpresp_t response;
580 r = initnatpmp(&natpmp, 0, 0);],
581 [printf("initnatpmp() returned %d (%s)\n", r, r?"FAILED":"SUCCESS");
583 [--with-libnatpmp-dir],
588 dnl ------------------------------------------------------
589 dnl Where do you live, libminiupnpc? And how do we call you?
590 dnl There are no packages for Debian or Redhat as of this patch
592 if test "$upnp" = "true"; then
593 AC_DEFINE(MINIUPNPC, 1, [Define to 1 if we are building with UPnP.])
594 TOR_SEARCH_LIBRARY(libminiupnpc, $trylibminiupnpcdir, [-lminiupnpc $TOR_LIB_WS32 $TOR_LIB_IPHLPAPI],
595 [#include <miniupnpc/miniwget.h>
596 #include <miniupnpc/miniupnpc.h>
597 #include <miniupnpc/upnpcommands.h>],
598 [void upnpDiscover(int delay, const char * multicastif,
599 const char * minissdpdsock, int sameport);],
600 [upnpDiscover(1, 0, 0, 0); exit(0);],
601 [--with-libminiupnpc-dir],
619 , , 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.))
621 dnl These headers are not essential
657 TOR_CHECK_PROTOTYPE(malloc_good_size, HAVE_MALLOC_GOOD_SIZE_PROTOTYPE,
658 [#ifdef HAVE_MALLOC_H
661 #ifdef HAVE_MALLOC_MALLOC_H
662 #include <malloc/malloc.h>
665 AC_CHECK_HEADERS(net/if.h, net_if_found=1, net_if_found=0,
666 [#ifdef HAVE_SYS_TYPES_H
667 #include <sys/types.h>
669 #ifdef HAVE_SYS_SOCKET_H
670 #include <sys/socket.h>
672 AC_CHECK_HEADERS(net/pfvar.h, net_pfvar_found=1, net_pfvar_found=0,
673 [#ifdef HAVE_SYS_TYPES_H
674 #include <sys/types.h>
676 #ifdef HAVE_SYS_SOCKET_H
677 #include <sys/socket.h>
682 AC_CHECK_HEADERS(linux/netfilter_ipv4.h,
683 linux_netfilter_ipv4=1, linux_netfilter_ipv4=0,
684 [#ifdef HAVE_SYS_TYPES_H
685 #include <sys/types.h>
687 #ifdef HAVE_SYS_SOCKET_H
688 #include <sys/socket.h>
693 #ifdef HAVE_LINUX_TYPES_H
694 #include <linux/types.h>
696 #ifdef HAVE_NETINET_IN6_H
697 #include <netinet/in6.h>
699 #ifdef HAVE_NETINET_IN_H
700 #include <netinet/in.h>
703 if test x$transparent = xtrue ; then
705 if test x$net_if_found = x1 && test x$net_pfvar_found = x1 ; then
708 if test x$linux_netfilter_ipv4 = x1 ; then
711 if test x$transparent_ok = x1 ; then
712 AC_DEFINE(USE_TRANSPARENT, 1, "Define to enable transparent proxy support")
715 AC_DEFINE(OPENBSD, 1, "Define to handle pf on OpenBSD properly") ;;
718 AC_MSG_NOTICE([Transparent proxy support enabled, but missing headers.])
722 AC_CHECK_MEMBERS([struct timeval.tv_sec], , ,
723 [#ifdef HAVE_SYS_TYPES_H
724 #include <sys/types.h>
726 #ifdef HAVE_SYS_TIME_H
727 #include <sys/time.h>
730 dnl In case we aren't given a working stdint.h, we'll need to grow our own.
733 AC_CHECK_SIZEOF(int8_t)
734 AC_CHECK_SIZEOF(int16_t)
735 AC_CHECK_SIZEOF(int32_t)
736 AC_CHECK_SIZEOF(int64_t)
737 AC_CHECK_SIZEOF(uint8_t)
738 AC_CHECK_SIZEOF(uint16_t)
739 AC_CHECK_SIZEOF(uint32_t)
740 AC_CHECK_SIZEOF(uint64_t)
741 AC_CHECK_SIZEOF(intptr_t)
742 AC_CHECK_SIZEOF(uintptr_t)
744 dnl AC_CHECK_TYPES([int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t, uint64_t, intptr_t, uintptr_t])
746 AC_CHECK_SIZEOF(char)
747 AC_CHECK_SIZEOF(short)
749 AC_CHECK_SIZEOF(long)
750 AC_CHECK_SIZEOF(long long)
751 AC_CHECK_SIZEOF(__int64)
752 AC_CHECK_SIZEOF(void *)
753 AC_CHECK_SIZEOF(time_t)
754 AC_CHECK_SIZEOF(size_t)
756 AC_CHECK_TYPES([uint, u_char, ssize_t])
758 dnl used to include sockaddr_storage, but everybody has that.
759 AC_CHECK_TYPES([struct in6_addr, struct sockaddr_in6, sa_family_t], , ,
760 [#ifdef HAVE_SYS_TYPES_H
761 #include <sys/types.h>
763 #ifdef HAVE_NETINET_IN_H
764 #include <netinet/in.h>
766 #ifdef HAVE_NETINET_IN6_H
767 #include <netinet/in6.h>
769 #ifdef HAVE_SYS_SOCKET_H
770 #include <sys/socket.h>
773 #define WIN32_WINNT 0x400
774 #define _WIN32_WINNT 0x400
775 #define WIN32_LEAN_AND_MEAN
776 #if defined(_MSC_VER) && (_MSC_VER < 1300)
779 #include <winsock2.h>
780 #include <ws2tcpip.h>
784 AC_CHECK_MEMBERS([struct in6_addr.s6_addr32, struct in6_addr.s6_addr16, struct sockaddr_in.sin_len, struct sockaddr_in6.sin6_len], , ,
785 [#ifdef HAVE_SYS_TYPES_H
786 #include <sys/types.h>
788 #ifdef HAVE_NETINET_IN_H
789 #include <netinet/in.h>
791 #ifdef HAVE_NETINET_IN6_H
792 #include <netinet/in6.h>
794 #ifdef HAVE_SYS_SOCKET_H
795 #include <sys/socket.h>
798 #define WIN32_WINNT 0x400
799 #define _WIN32_WINNT 0x400
800 #define WIN32_LEAN_AND_MEAN
801 #if defined(_MSC_VER) && (_MSC_VER < 1300)
804 #include <winsock2.h>
805 #include <ws2tcpip.h>
810 AC_CHECK_TYPES([rlim_t], , ,
811 [#ifdef HAVE_SYS_TYPES_H
812 #include <sys/types.h>
814 #ifdef HAVE_SYS_TIME_H
815 #include <sys/time.h>
817 #ifdef HAVE_SYS_RESOURCE_H
818 #include <sys/resource.h>
822 AC_CACHE_CHECK([whether time_t is signed], tor_cv_time_t_signed, [
823 AC_RUN_IFELSE([AC_LANG_SOURCE([
824 #ifdef HAVE_SYS_TYPES_H
825 #include <sys/types.h>
827 #ifdef HAVE_SYS_TIME_H
828 #include <sys/time.h>
833 int main(int c, char**v) { if (((time_t)-1)<0) return 1; else return 0; }])],
834 tor_cv_time_t_signed=no, tor_cv_time_t_signed=yes, tor_cv_time_t_signed=cross)
837 if test "$tor_cv_time_t_signed" = cross; then
838 AC_MSG_NOTICE([Cross compiling: assuming that time_t is signed.])
841 if test "$tor_cv_time_t_signed" != no; then
842 AC_DEFINE([TIME_T_IS_SIGNED], 1,
843 [Define to 1 iff time_t is signed])
846 AC_CACHE_CHECK([whether size_t is signed], tor_cv_size_t_signed, [
847 AC_RUN_IFELSE([AC_LANG_SOURCE([
848 #ifdef HAVE_SYS_TYPES_H
849 #include <sys/types.h>
851 int main(int c, char**v) { if (((size_t)-1)<0) return 1; else return 0; }])],
852 tor_cv_size_t_signed=no, tor_cv_size_t_signed=yes, tor_cv_size_t_signed=cross)
855 if test "$tor_cv_size_t_signed" = cross; then
856 AC_MSG_NOTICE([Cross compiling: assuming that size_t is not signed.])
859 if test "$tor_cv_size_t_signed" = yes; then
860 AC_MSG_ERROR([You have a signed size_t; that's grossly nonconformant.])
863 AC_CHECK_SIZEOF(socklen_t, , [AC_INCLUDES_DEFAULT()
864 #ifdef HAVE_SYS_SOCKET_H
865 #include <sys/socket.h>
869 # We want to make sure that we _don't_ have a cell_t defined, like IRIX does.
871 AC_CHECK_SIZEOF(cell_t)
873 # Now make sure that NULL can be represented as zero bytes.
874 AC_CACHE_CHECK([whether memset(0) sets pointers to NULL], tor_cv_null_is_zero,
875 [AC_RUN_IFELSE([AC_LANG_SOURCE(
876 [[#include <stdlib.h>
882 int main () { char *p1,*p2; p1=NULL; memset(&p2,0,sizeof(p2));
883 return memcmp(&p1,&p2,sizeof(char*))?1:0; }]])],
884 [tor_cv_null_is_zero=yes],
885 [tor_cv_null_is_zero=no],
886 [tor_cv_null_is_zero=cross])])
888 if test "$tor_cv_null_is_zero" = cross ; then
889 # Cross-compiling; let's hope that the target isn't raving mad.
890 AC_MSG_NOTICE([Cross-compiling: we'll assume that NULL is represented as a sequence of 0-valued bytes.])
893 if test "$tor_cv_null_is_zero" != no; then
894 AC_DEFINE([NULL_REP_IS_ZERO_BYTES], 1,
895 [Define to 1 iff memset(0) sets pointers to NULL])
898 # And what happens when we malloc zero?
899 AC_CACHE_CHECK([whether we can malloc(0) safely.], tor_cv_malloc_zero_works,
900 [AC_RUN_IFELSE([AC_LANG_SOURCE(
901 [[#include <stdlib.h>
907 int main () { return malloc(0)?0:1; }]])],
908 [tor_cv_malloc_zero_works=yes],
909 [tor_cv_malloc_zero_works=no],
910 [tor_cv_malloc_zero_works=cross])])
912 if test "$tor_cv_malloc_zero_works" = cross; then
913 # Cross-compiling; let's hope that the target isn't raving mad.
914 AC_MSG_NOTICE([Cross-compiling: we'll assume that we need to check malloc() arguments for 0.])
917 if test "$tor_cv_malloc_zero_works" = yes; then
918 AC_DEFINE([MALLOC_ZERO_WORKS], 1,
919 [Define to 1 iff malloc(0) returns a pointer])
922 # whether we seem to be in a 2s-complement world.
923 AC_CACHE_CHECK([whether we are using 2s-complement arithmetic], tor_cv_twos_complement,
924 [AC_RUN_IFELSE([AC_LANG_SOURCE(
925 [[int main () { int problem = ((-99) != (~99)+1);
926 return problem ? 1 : 0; }]])],
927 [tor_cv_twos_complement=yes],
928 [tor_cv_twos_complement=no],
929 [tor_cv_twos_complement=cross])])
931 if test "$tor_cv_twos_complement" = cross ; then
932 # Cross-compiling; let's hope that the target isn't raving mad.
933 AC_MSG_NOTICE([Cross-compiling: we'll assume that negative integers are represented with two's complement.])
936 if test "$tor_cv_twos_complement" != no ; then
937 AC_DEFINE([USING_TWOS_COMPLEMENT], 1,
938 [Define to 1 iff we represent negative integers with two's complement])
941 # What does shifting a negative value do?
942 AC_CACHE_CHECK([whether right-shift on negative values does sign-extension], tor_cv_sign_extend,
943 [AC_RUN_IFELSE([AC_LANG_SOURCE(
944 [[int main () { int okay = (-60 >> 8) == -1; return okay ? 0 : 1; }]])],
945 [tor_cv_sign_extend=yes],
946 [tor_cv_sign_extend=no],
947 [tor_cv_sign_extend=cross])])
949 if test "$tor_cv_sign_extend" = cross ; then
950 # Cross-compiling; let's hope that the target isn't raving mad.
951 AC_MSG_NOTICE([Cross-compiling: we'll assume that right-shifting negative integers causes sign-extension])
954 if test "$tor_cv_sign_extend" != no ; then
955 AC_DEFINE([RSHIFT_DOES_SIGN_EXTEND], 1,
956 [Define to 1 iff right-shifting a negative value performs sign-extension])
959 # Whether we should use the dmalloc memory allocation debugging library.
960 AC_MSG_CHECKING(whether to use dmalloc (debug memory allocation library))
962 [ --with-dmalloc Use debug memory allocation library. ],
963 [if [[ "$withval" = "yes" ]]; then
969 fi], [ dmalloc=0; AC_MSG_RESULT(no) ]
972 if [[ $dmalloc -eq 1 ]]; then
973 AC_CHECK_HEADERS(dmalloc.h, , AC_MSG_ERROR(dmalloc header file not found. Do you have the development files for dmalloc installed?))
974 AC_SEARCH_LIBS(dmalloc_malloc, [dmallocth dmalloc], , AC_MSG_ERROR(Libdmalloc library not found. If you enable it you better have it installed.))
975 AC_DEFINE(USE_DMALLOC, 1, [Debug memory allocation library])
976 AC_DEFINE(DMALLOC_FUNC_CHECK, 1, [Enable dmalloc's malloc function check])
977 AC_CHECK_FUNCS(dmalloc_strdup dmalloc_strndup)
980 AC_ARG_WITH(tcmalloc,
981 [ --with-tcmalloc Use tcmalloc memory allocation library. ],
982 [ tcmalloc=yes ], [ tcmalloc=no ])
984 if test x$tcmalloc = xyes ; then
985 LDFLAGS="-ltcmalloc $LDFLAGS"
988 # By default, we're going to assume we don't have mlockall()
989 # bionic and other platforms have various broken mlockall subsystems.
990 # Some systems don't have a working mlockall, some aren't linkable,
991 # and some have it but don't declare it.
992 AC_CHECK_FUNCS(mlockall)
993 AC_CHECK_DECLS([mlockall], , , [
994 #ifdef HAVE_SYS_MMAN_H
995 #include <sys/mman.h>
998 # Allow user to specify an alternate syslog facility
999 AC_ARG_WITH(syslog-facility,
1000 [ --with-syslog-facility=LOG syslog facility to use (default=LOG_DAEMON)],
1001 syslog_facility="$withval", syslog_facility="LOG_DAEMON")
1002 AC_DEFINE_UNQUOTED(LOGFACILITY,$syslog_facility,[name of the syslog facility])
1003 AC_SUBST(LOGFACILITY)
1005 # Check if we have getresuid and getresgid
1006 AC_CHECK_FUNCS(getresuid getresgid)
1008 # Check for gethostbyname_r in all its glorious incompatible versions.
1009 # (This logic is based on that in Python's configure.in)
1010 AH_TEMPLATE(HAVE_GETHOSTBYNAME_R,
1011 [Define this if you have any gethostbyname_r()])
1013 AC_CHECK_FUNC(gethostbyname_r, [
1014 AC_MSG_CHECKING([how many arguments gethostbyname_r() wants])
1016 CFLAGS="$CFLAGS $MY_CPPFLAGS $MY_THREAD_CPPFLAGS $MY_CFLAGS"
1017 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
1021 struct hostent *h1, *h2;
1023 (void)gethostbyname_r(cp1,h1,cp2,i1,&h2,&i2);
1025 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1026 AC_DEFINE(HAVE_GETHOSTBYNAME_R_6_ARG, 1,
1027 [Define this if gethostbyname_r takes 6 arguments])
1036 (void)gethostbyname_r(cp1,h1,cp2,i1,&i2);
1038 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1039 AC_DEFINE(HAVE_GETHOSTBYNAME_R_5_ARG, 1,
1040 [Define this if gethostbyname_r takes 5 arguments])
1048 struct hostent_data hd;
1049 (void) gethostbyname_r(cp1,h1,&hd);
1051 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1052 AC_DEFINE(HAVE_GETHOSTBYNAME_R_3_ARG, 1,
1053 [Define this if gethostbyname_r takes 3 arguments])
1063 AC_CACHE_CHECK([whether the C compiler supports __func__],
1064 tor_cv_have_func_macro,
1065 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1067 int main(int c, char **v) { puts(__func__); }])],
1068 tor_cv_have_func_macro=yes,
1069 tor_cv_have_func_macro=no))
1071 AC_CACHE_CHECK([whether the C compiler supports __FUNC__],
1072 tor_cv_have_FUNC_macro,
1073 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1075 int main(int c, char **v) { puts(__FUNC__); }])],
1076 tor_cv_have_FUNC_macro=yes,
1077 tor_cv_have_FUNC_macro=no))
1079 AC_CACHE_CHECK([whether the C compiler supports __FUNCTION__],
1080 tor_cv_have_FUNCTION_macro,
1081 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1083 int main(int c, char **v) { puts(__FUNCTION__); }])],
1084 tor_cv_have_FUNCTION_macro=yes,
1085 tor_cv_have_FUNCTION_macro=no))
1087 if test "$tor_cv_have_func_macro" = 'yes'; then
1088 AC_DEFINE(HAVE_MACRO__func__, 1, [Defined if the compiler supports __func__])
1091 if test "$tor_cv_have_FUNC_macro" = 'yes'; then
1092 AC_DEFINE(HAVE_MACRO__FUNC__, 1, [Defined if the compiler supports __FUNC__])
1095 if test "$tor_cv_have_FUNCTION_macro" = 'yes'; then
1096 AC_DEFINE(HAVE_MACRO__FUNCTION__, 1,
1097 [Defined if the compiler supports __FUNCTION__])
1100 # $prefix stores the value of the --prefix command line option, or
1101 # NONE if the option wasn't set. In the case that it wasn't set, make
1102 # it be the default, so that we can use it to expand directories now.
1103 if test "x$prefix" = "xNONE"; then
1104 prefix=$ac_default_prefix
1107 # and similarly for $exec_prefix
1108 if test "x$exec_prefix" = "xNONE"; then
1112 if test "x$BUILDDIR" = "x"; then
1116 AH_TEMPLATE([BUILDDIR],[tor's build directory])
1117 AC_DEFINE_UNQUOTED(BUILDDIR,"$BUILDDIR")
1119 if test "x$CONFDIR" = "x"; then
1120 CONFDIR=`eval echo $sysconfdir/tor`
1123 AH_TEMPLATE([CONFDIR],[tor's configuration directory])
1124 AC_DEFINE_UNQUOTED(CONFDIR,"$CONFDIR")
1126 BINDIR=`eval echo $bindir`
1128 LOCALSTATEDIR=`eval echo $localstatedir`
1129 AC_SUBST(LOCALSTATEDIR)
1131 if test "$bwin32" = true; then
1132 # Test if the linker supports the --nxcompat and --dynamicbase options
1134 save_LDFLAGS="$LDFLAGS"
1135 LDFLAGS="-Wl,--nxcompat -Wl,--dynamicbase"
1136 AC_MSG_CHECKING([whether the linker supports DllCharacteristics])
1137 AC_LINK_IFELSE([AC_LANG_PROGRAM([])],
1138 [AC_MSG_RESULT([yes])]
1139 [save_LDFLAGS="$save_LDFLAGS $LDFLAGS"],
1140 [AC_MSG_RESULT([no])]
1142 LDFLAGS="$save_LDFLAGS"
1145 # Set CFLAGS _after_ all the above checks, since our warnings are stricter
1146 # than autoconf's macros like.
1147 if test "$GCC" = yes; then
1148 # Disable GCC's strict aliasing checks. They are an hours-to-debug
1149 # accident waiting to happen.
1150 CFLAGS="$CFLAGS -Wall -fno-strict-aliasing"
1152 # Autoconf sets -g -O2 by default. Override optimization level
1153 # for non-gcc compilers
1155 enable_gcc_warnings=no
1156 enable_gcc_warnings_advisory=no
1159 # OS X Lion started deprecating the system openssl. Let's just disable
1160 # all deprecation warnings on OS X. Also, to potentially make the binary
1161 # a little smaller, let's enable dead_strip.
1165 CFLAGS="$CFLAGS -Wno-deprecated-declarations"
1166 LDFLAGS="$LDFLAGS -dead_strip" ;;
1169 # Add some more warnings which we use in development but not in the
1170 # released versions. (Some relevant gcc versions can't handle these.)
1171 if test x$enable_gcc_warnings = xyes || test x$enable_gcc_warnings_advisory = xyes; then
1173 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1174 #if !defined(__GNUC__) || (__GNUC__ < 4)
1176 #endif])], have_gcc4=yes, have_gcc4=no)
1178 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1179 #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 2)
1181 #endif])], have_gcc42=yes, have_gcc42=no)
1183 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1184 #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 3)
1186 #endif])], have_gcc43=yes, have_gcc43=no)
1188 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1189 #if !defined(__clang__)
1191 #endif])], have_clang=yes, have_clang=no)
1193 save_CFLAGS="$CFLAGS"
1194 CFLAGS="$CFLAGS -Wshorten-64-to-32"
1195 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], have_shorten64_flag=yes,
1196 have_shorten64_flag=no)
1197 CFLAGS="$save_CFLAGS"
1201 # Some OpenBSD versions (like 4.8) have -Wsystem-headers by default.
1202 # That's fine, except that the headers don't pass -Wredundant-decls.
1203 # Therefore, let's disable -Wsystem-headers when we're building
1204 # with maximal warnings on OpenBSD.
1205 CFLAGS="$CFLAGS -Wno-system-headers" ;;
1208 CFLAGS="$CFLAGS -W -Wfloat-equal -Wundef -Wpointer-arith"
1209 CFLAGS="$CFLAGS -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings"
1210 CFLAGS="$CFLAGS -Wredundant-decls -Wchar-subscripts -Wcomment -Wformat=2"
1211 CFLAGS="$CFLAGS -Wwrite-strings -Wmissing-declarations -Wredundant-decls"
1212 CFLAGS="$CFLAGS -Wnested-externs -Wbad-function-cast -Wswitch-enum"
1214 if test x$enable_gcc_warnings = xyes; then
1215 CFLAGS="$CFLAGS -Werror"
1218 # Disabled, so we can use mallinfo(): -Waggregate-return
1220 if test x$have_gcc4 = xyes ; then
1221 # These warnings break gcc 3.3.5 and work on gcc 4.0.2
1222 CFLAGS="$CFLAGS -Winit-self -Wmissing-field-initializers -Wdeclaration-after-statement -Wold-style-definition"
1225 if test x$have_gcc42 = xyes ; then
1226 # These warnings break gcc 4.0.2 and work on gcc 4.2
1227 # XXXX020 See if any of these work with earlier versions.
1228 CFLAGS="$CFLAGS -Waddress -Wmissing-noreturn -Wstrict-overflow=1"
1230 # We used to use -Wstrict-overflow=5, but that breaks us heavily under 4.3.
1233 if test x$have_gcc42 = xyes && test x$have_clang = xno; then
1234 # These warnings break gcc 4.0.2 and clang, but work on gcc 4.2
1235 CFLAGS="$CFLAGS -Wnormalized=id -Woverride-init"
1238 if test x$have_gcc43 = xyes ; then
1239 # These warnings break gcc 4.2 and work on gcc 4.3
1240 # XXXX020 See if any of these work with earlier versions.
1241 CFLAGS="$CFLAGS -Wextra -Warray-bounds"
1244 if test x$have_shorten64_flag = xyes ; then
1245 CFLAGS="$CFLAGS -Wshorten-64-to-32"
1248 ##This will break the world on some 64-bit architectures
1249 # CFLAGS="$CFLAGS -Winline"
1254 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent $TOR_CPPFLAGS_openssl $TOR_CPPFLAGS_zlib"
1260 contrib/suse/Makefile
1262 contrib/tor.logrotate
1270 src/config/torrc.sample
1274 src/tools/tor-fw-helper/Makefile
1281 if test -x /usr/bin/perl && test -x ./contrib/updateVersions.pl ; then
1282 ./contrib/updateVersions.pl