1 dnl Copyright (c) 2001-2004, Roger Dingledine
2 dnl Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson
3 dnl Copyright (c) 2007-2012, The Tor Project, Inc.
4 dnl See LICENSE for licensing information
7 AM_INIT_AUTOMAKE(tor, 0.2.3.16-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])
284 AC_SEARCH_LIBS([clock_gettime], [rt])
285 if test "$LIBS" != "$saved_LIBS"; then
286 # Looks like we need -lrt for clock_gettime().
290 if test "$enable_threads" = "yes"; then
291 AC_SEARCH_LIBS(pthread_create, [pthread])
292 AC_SEARCH_LIBS(pthread_detach, [pthread])
295 dnl -------------------------------------------------------------------
296 dnl Check for functions before libevent, since libevent-1.2 apparently
297 dnl exports strlcpy without defining it in a header.
328 using_custom_malloc=no
329 if test x$enable_openbsd_malloc = xyes ; then
330 AC_DEFINE(HAVE_MALLOC_GOOD_SIZE, 1, [Defined if we have the malloc_good_size function])
331 using_custom_malloc=yes
333 if test x$tcmalloc = xyes ; then
334 using_custom_malloc=yes
336 if test $using_custom_malloc = no ; then
337 AC_CHECK_FUNCS(mallinfo malloc_good_size malloc_usable_size)
340 if test "$enable_threads" = "yes"; then
341 AC_CHECK_HEADERS(pthread.h)
342 AC_CHECK_FUNCS(pthread_create)
345 dnl ------------------------------------------------------
346 dnl Where do you live, libevent? And how do we call you?
348 if test "$bwin32" = true; then
349 TOR_LIB_WS32=-lws2_32
350 TOR_LIB_IPHLPAPI=-liphlpapi
351 # Some of the cargo-cults recommend -lwsock32 as well, but I don't
352 # think it's actually necessary.
358 AC_SUBST(TOR_LIB_WS32)
359 AC_SUBST(TOR_LIB_GDI)
360 AC_SUBST(TOR_LIB_IPHLPAPI)
362 dnl We need to do this before we try our disgusting hack below.
363 AC_CHECK_HEADERS([sys/types.h])
365 dnl This is a disgusting hack so we safely include older libevent headers.
366 AC_CHECK_TYPE(u_int64_t, unsigned long long)
367 AC_CHECK_TYPE(u_int32_t, unsigned long)
368 AC_CHECK_TYPE(u_int16_t, unsigned short)
369 AC_CHECK_TYPE(u_int8_t, unsigned char)
371 tor_libevent_pkg_redhat="libevent"
372 tor_libevent_pkg_debian="libevent-dev"
373 tor_libevent_devpkg_redhat="libevent-devel"
374 tor_libevent_devpkg_debian="libevent-dev"
376 dnl On Gnu/Linux or any place we require it, we'll add librt to the Libevent
377 dnl linking for static builds.
378 STATIC_LIBEVENT_FLAGS=""
379 if test "$enable_static_libevent" = "yes"; then
380 if test "$have_rt" = yes; then
381 STATIC_LIBEVENT_FLAGS=" -lrt "
385 TOR_SEARCH_LIBRARY(libevent, $trylibeventdir, [-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32], [
387 #include <winsock2.h>
390 #include <sys/time.h>
391 #include <sys/types.h>
392 #include <event.h>], [
394 #include <winsock2.h>
396 void exit(int); void *event_init(void);],
399 {WSADATA d; WSAStartup(0x101,&d); }
401 event_init(); exit(0);
402 ], [--with-libevent-dir], [/opt/libevent])
404 dnl Now check for particular libevent functions.
406 save_LDFLAGS="$LDFLAGS"
407 save_CPPFLAGS="$CPPFLAGS"
408 LIBS="-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32 $LIBS"
409 LDFLAGS="$TOR_LDFLAGS_libevent $LDFLAGS"
410 CPPFLAGS="$TOR_CPPFLAGS_libevent $CPPFLAGS"
411 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)
412 AC_CHECK_MEMBERS([struct event.min_heap_idx], , ,
416 AC_CHECK_HEADERS(event2/event.h event2/dns.h event2/bufferevent_ssl.h)
419 LDFLAGS="$save_LDFLAGS"
420 CPPFLAGS="$save_CPPFLAGS"
423 AM_CONDITIONAL(USE_EXTERNAL_EVDNS, test x$ac_cv_header_event2_dns_h = xyes)
425 if test "$enable_static_libevent" = "yes"; then
426 if test "$tor_cv_library_libevent_dir" = "(system)"; then
427 AC_MSG_ERROR("You must specify an explicit --with-libevent-dir=x option when using --enable-static-libevent")
429 TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent.a $STATIC_LIBEVENT_FLAGS"
432 TOR_LIBEVENT_LIBS="-levent"
435 dnl This isn't the best test for Libevent 2.0.3-alpha. Once it's released,
436 dnl we can do much better.
437 if test "$enable_bufferevents" = "yes" ; then
438 if test "$ac_cv_header_event2_bufferevent_ssl_h" != "yes" ; then
439 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.])
442 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent"
444 # Check for the right version. First see if version detection works.
445 AC_MSG_CHECKING([whether we can detect the Libevent version])
446 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
447 #include <event2/event.h>
448 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 10
454 ])], [event_version_number_works=yes; AC_MSG_RESULT([yes]) ],
455 [event_version_number_works=no; AC_MSG_RESULT([no])])
456 if test "$event_version_number_works" != 'yes'; then
457 AC_MSG_WARN([Version detection on Libevent seems broken. Your Libevent installation is probably screwed up or very old.])
459 AC_MSG_CHECKING([whether Libevent is new enough for bufferevents])
460 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
461 #include <event2/event.h>
462 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 0x02000d00
468 ])], [ AC_MSG_RESULT([yes]) ],
469 [ AC_MSG_RESULT([no])
470 AC_MSG_ERROR([Libevent does not seem new enough to support bufferevents. We require 2.0.13-stable or later]) ] )
476 LDFLAGS="$save_LDFLAGS"
477 CPPFLAGS="$save_CPPFLAGS"
479 AM_CONDITIONAL(USE_BUFFEREVENTS, test "$enable_bufferevents" = "yes")
480 if test "$enable_bufferevents" = "yes"; then
481 AC_DEFINE(USE_BUFFEREVENTS, 1, [Defined if we're going to use Libevent's buffered IO API])
482 if test "$enable_static_libevent" = "yes"; then
483 TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent_openssl.a $TOR_LIBEVENT_LIBS"
485 TOR_LIBEVENT_LIBS="-levent_openssl $TOR_LIBEVENT_LIBS"
488 AC_SUBST(TOR_LIBEVENT_LIBS)
490 dnl ------------------------------------------------------
491 dnl Where do you live, libm?
493 dnl On some platforms (Haiku/BeOS) the math library is
494 dnl part of libroot. In which case don't link against lm
497 AC_SEARCH_LIBS(pow, [m], , AC_MSG_ERROR([Could not find pow in libm or libc.]))
498 if test "$ac_cv_search_pow" != "none required"; then
499 TOR_LIB_MATH="$ac_cv_search_pow"
502 AC_SUBST(TOR_LIB_MATH)
504 dnl ------------------------------------------------------
505 dnl Where do you live, openssl? And how do we call you?
507 tor_openssl_pkg_redhat="openssl"
508 tor_openssl_pkg_debian="libssl"
509 tor_openssl_devpkg_redhat="openssl-devel"
510 tor_openssl_devpkg_debian="libssl-dev"
512 ALT_openssl_WITHVAL=""
514 [ --with-ssl-dir=PATH Obsolete alias for --with-openssl-dir ],
516 if test "x$withval" != xno && test "x$withval" != "x" ; then
517 ALT_openssl_WITHVAL="$withval"
521 TOR_SEARCH_LIBRARY(openssl, $tryssldir, [-lssl -lcrypto $TOR_LIB_GDI],
522 [#include <openssl/rand.h>],
523 [void RAND_add(const void *buf, int num, double entropy);],
524 [RAND_add((void*)0,0,0); exit(0);], [],
525 [/usr/local/openssl /usr/lib/openssl /usr/local/ssl /usr/lib/ssl /usr/local /usr/athena /opt/openssl])
527 dnl XXXX check for OPENSSL_VERSION_NUMBER == SSLeay()
529 if test "$enable_static_openssl" = "yes"; then
530 if test "$tor_cv_library_openssl_dir" = "(system)"; then
531 AC_MSG_ERROR("You must specify an explicit --with-openssl-dir=x option when using --enable-static-openssl")
533 TOR_OPENSSL_LIBS="$TOR_LIBDIR_openssl/libssl.a $TOR_LIBDIR_openssl/libcrypto.a"
536 TOR_OPENSSL_LIBS="-lssl -lcrypto"
538 AC_SUBST(TOR_OPENSSL_LIBS)
540 dnl ------------------------------------------------------
541 dnl Where do you live, zlib? And how do we call you?
543 tor_zlib_pkg_redhat="zlib"
544 tor_zlib_pkg_debian="zlib1g"
545 tor_zlib_devpkg_redhat="zlib-devel"
546 tor_zlib_devpkg_debian="zlib1g-dev"
548 TOR_SEARCH_LIBRARY(zlib, $tryzlibdir, [-lz],
550 [const char * zlibVersion(void);],
551 [zlibVersion(); exit(0);], [--with-zlib-dir],
554 if test "$enable_static_zlib" = "yes"; then
555 if test "$tor_cv_library_zlib_dir" = "(system)"; then
556 AC_MSG_ERROR("You must specify an explicit --with-zlib-dir=x option when
557 using --enable-static-zlib")
559 TOR_ZLIB_LIBS="$TOR_LIBDIR_zlib/libz.a"
564 AC_SUBST(TOR_ZLIB_LIBS)
566 dnl Make sure to enable support for large off_t if available.
569 dnl ------------------------------------------------------
570 dnl Where do you live, libnatpmp? And how do we call you?
571 dnl There are no packages for Debian or Redhat as of this patch
573 if test "$natpmp" = "true"; then
574 AC_DEFINE(NAT_PMP, 1, [Define to 1 if we are building with nat-pmp.])
575 TOR_SEARCH_LIBRARY(libnatpmp, $trylibnatpmpdir, [-lnatpmp $TOR_LIB_WS32 $TOR_LIB_IPHLPAPI],
576 [#include <natpmp.h>],
580 #include <natpmp.h>],
583 natpmpresp_t response;
584 r = initnatpmp(&natpmp, 0, 0);],
585 [printf("initnatpmp() returned %d (%s)\n", r, r?"FAILED":"SUCCESS");
587 [--with-libnatpmp-dir],
592 dnl ------------------------------------------------------
593 dnl Where do you live, libminiupnpc? And how do we call you?
594 dnl There are no packages for Debian or Redhat as of this patch
596 if test "$upnp" = "true"; then
597 AC_DEFINE(MINIUPNPC, 1, [Define to 1 if we are building with UPnP.])
599 dnl Before we call TOR_SEARCH_LIBRARY we'll do a quick compile test
600 dnl to see if we have miniupnpc-1.5 or -1.6
601 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include <miniupnpc/miniupnpc.h>],
602 [upnpDiscover(1, 0, 0, 0);exit(0);])],[miniupnpc15="true"],[miniupnpc15="false"])
604 if test "$miniupnpc15" = "true" ; then
605 AC_DEFINE([MINIUPNPC15],[1],[libminiupnpc version 1.5 found])
606 TOR_SEARCH_LIBRARY(libminiupnpc, $trylibminiupnpcdir, [-lminiupnpc $TOR_LIB_WS32 $TOR_LIB_IPHLPAPI],
607 [#include <miniupnpc/miniwget.h>
608 #include <miniupnpc/miniupnpc.h>
609 #include <miniupnpc/upnpcommands.h>],
610 [void upnpDiscover(int delay, const char * multicastif,
611 const char * minissdpdsock, int sameport);],
612 [upnpDiscover(1, 0, 0, 0); exit(0);],
613 [--with-libminiupnpc-dir],
616 TOR_SEARCH_LIBRARY(libminiupnpc, $trylibminiupnpcdir, [-lminiupnpc $TOR_LIB_WS32 $TOR_LIB_IPHLPAPI],
617 [#include <miniupnpc/miniwget.h>
618 #include <miniupnpc/miniupnpc.h>
619 #include <miniupnpc/upnpcommands.h>],
620 [void upnpDiscover(int delay, const char * multicastif,
621 const char * minissdpdsock, int sameport, int ipv6, int * error);],
622 [upnpDiscover(1, 0, 0, 0, 0, 0); exit(0);],
623 [--with-libminiupnpc-dir],
642 , , 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.))
644 dnl These headers are not essential
681 AC_CHECK_HEADERS(sys/param.h)
683 TOR_CHECK_PROTOTYPE(malloc_good_size, HAVE_MALLOC_GOOD_SIZE_PROTOTYPE,
684 [#ifdef HAVE_MALLOC_H
687 #ifdef HAVE_MALLOC_MALLOC_H
688 #include <malloc/malloc.h>
691 AC_CHECK_HEADERS(net/if.h, net_if_found=1, net_if_found=0,
692 [#ifdef HAVE_SYS_TYPES_H
693 #include <sys/types.h>
695 #ifdef HAVE_SYS_SOCKET_H
696 #include <sys/socket.h>
698 AC_CHECK_HEADERS(net/pfvar.h, net_pfvar_found=1, net_pfvar_found=0,
699 [#ifdef HAVE_SYS_TYPES_H
700 #include <sys/types.h>
702 #ifdef HAVE_SYS_SOCKET_H
703 #include <sys/socket.h>
708 AC_CHECK_HEADERS(linux/netfilter_ipv4.h,
709 linux_netfilter_ipv4=1, linux_netfilter_ipv4=0,
710 [#ifdef HAVE_SYS_TYPES_H
711 #include <sys/types.h>
713 #ifdef HAVE_SYS_SOCKET_H
714 #include <sys/socket.h>
719 #ifdef HAVE_LINUX_TYPES_H
720 #include <linux/types.h>
722 #ifdef HAVE_NETINET_IN6_H
723 #include <netinet/in6.h>
725 #ifdef HAVE_NETINET_IN_H
726 #include <netinet/in.h>
729 if test x$transparent = xtrue ; then
731 if test x$net_if_found = x1 && test x$net_pfvar_found = x1 ; then
734 if test x$linux_netfilter_ipv4 = x1 ; then
737 if test x$transparent_ok = x1 ; then
738 AC_DEFINE(USE_TRANSPARENT, 1, "Define to enable transparent proxy support")
741 AC_DEFINE(OPENBSD, 1, "Define to handle pf on OpenBSD properly") ;;
744 AC_MSG_NOTICE([Transparent proxy support enabled, but missing headers.])
748 AC_CHECK_MEMBERS([struct timeval.tv_sec], , ,
749 [#ifdef HAVE_SYS_TYPES_H
750 #include <sys/types.h>
752 #ifdef HAVE_SYS_TIME_H
753 #include <sys/time.h>
756 dnl In case we aren't given a working stdint.h, we'll need to grow our own.
759 AC_CHECK_SIZEOF(int8_t)
760 AC_CHECK_SIZEOF(int16_t)
761 AC_CHECK_SIZEOF(int32_t)
762 AC_CHECK_SIZEOF(int64_t)
763 AC_CHECK_SIZEOF(uint8_t)
764 AC_CHECK_SIZEOF(uint16_t)
765 AC_CHECK_SIZEOF(uint32_t)
766 AC_CHECK_SIZEOF(uint64_t)
767 AC_CHECK_SIZEOF(intptr_t)
768 AC_CHECK_SIZEOF(uintptr_t)
770 dnl AC_CHECK_TYPES([int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t, uint64_t, intptr_t, uintptr_t])
772 AC_CHECK_SIZEOF(char)
773 AC_CHECK_SIZEOF(short)
775 AC_CHECK_SIZEOF(long)
776 AC_CHECK_SIZEOF(long long)
777 AC_CHECK_SIZEOF(__int64)
778 AC_CHECK_SIZEOF(void *)
779 AC_CHECK_SIZEOF(time_t)
780 AC_CHECK_SIZEOF(size_t)
782 AC_CHECK_TYPES([uint, u_char, ssize_t])
784 dnl used to include sockaddr_storage, but everybody has that.
785 AC_CHECK_TYPES([struct in6_addr, struct sockaddr_in6, sa_family_t], , ,
786 [#ifdef HAVE_SYS_TYPES_H
787 #include <sys/types.h>
789 #ifdef HAVE_NETINET_IN_H
790 #include <netinet/in.h>
792 #ifdef HAVE_NETINET_IN6_H
793 #include <netinet/in6.h>
795 #ifdef HAVE_SYS_SOCKET_H
796 #include <sys/socket.h>
799 #define _WIN32_WINNT 0x0501
800 #define WIN32_LEAN_AND_MEAN
801 #if defined(_MSC_VER) && (_MSC_VER < 1300)
804 #include <winsock2.h>
805 #include <ws2tcpip.h>
809 AC_CHECK_MEMBERS([struct in6_addr.s6_addr32, struct in6_addr.s6_addr16, struct sockaddr_in.sin_len, struct sockaddr_in6.sin6_len], , ,
810 [#ifdef HAVE_SYS_TYPES_H
811 #include <sys/types.h>
813 #ifdef HAVE_NETINET_IN_H
814 #include <netinet/in.h>
816 #ifdef HAVE_NETINET_IN6_H
817 #include <netinet/in6.h>
819 #ifdef HAVE_SYS_SOCKET_H
820 #include <sys/socket.h>
823 #define _WIN32_WINNT 0x0501
824 #define WIN32_LEAN_AND_MEAN
825 #if defined(_MSC_VER) && (_MSC_VER < 1300)
828 #include <winsock2.h>
829 #include <ws2tcpip.h>
834 AC_CHECK_TYPES([rlim_t], , ,
835 [#ifdef HAVE_SYS_TYPES_H
836 #include <sys/types.h>
838 #ifdef HAVE_SYS_TIME_H
839 #include <sys/time.h>
841 #ifdef HAVE_SYS_RESOURCE_H
842 #include <sys/resource.h>
846 AC_CACHE_CHECK([whether time_t is signed], tor_cv_time_t_signed, [
847 AC_RUN_IFELSE([AC_LANG_SOURCE([
848 #ifdef HAVE_SYS_TYPES_H
849 #include <sys/types.h>
851 #ifdef HAVE_SYS_TIME_H
852 #include <sys/time.h>
857 int main(int c, char**v) { if (((time_t)-1)<0) return 1; else return 0; }])],
858 tor_cv_time_t_signed=no, tor_cv_time_t_signed=yes, tor_cv_time_t_signed=cross)
861 if test "$tor_cv_time_t_signed" = cross; then
862 AC_MSG_NOTICE([Cross compiling: assuming that time_t is signed.])
865 if test "$tor_cv_time_t_signed" != no; then
866 AC_DEFINE([TIME_T_IS_SIGNED], 1,
867 [Define to 1 iff time_t is signed])
870 AC_CACHE_CHECK([whether size_t is signed], tor_cv_size_t_signed, [
871 AC_RUN_IFELSE([AC_LANG_SOURCE([
872 #ifdef HAVE_SYS_TYPES_H
873 #include <sys/types.h>
875 int main(int c, char**v) { if (((size_t)-1)<0) return 1; else return 0; }])],
876 tor_cv_size_t_signed=no, tor_cv_size_t_signed=yes, tor_cv_size_t_signed=cross)
879 if test "$tor_cv_size_t_signed" = cross; then
880 AC_MSG_NOTICE([Cross compiling: assuming that size_t is not signed.])
883 if test "$tor_cv_size_t_signed" = yes; then
884 AC_MSG_ERROR([You have a signed size_t; that's grossly nonconformant.])
887 AC_CHECK_SIZEOF(socklen_t, , [AC_INCLUDES_DEFAULT()
888 #ifdef HAVE_SYS_SOCKET_H
889 #include <sys/socket.h>
893 # We want to make sure that we _don't_ have a cell_t defined, like IRIX does.
895 AC_CHECK_SIZEOF(cell_t)
897 # Now make sure that NULL can be represented as zero bytes.
898 AC_CACHE_CHECK([whether memset(0) sets pointers to NULL], tor_cv_null_is_zero,
899 [AC_RUN_IFELSE([AC_LANG_SOURCE(
900 [[#include <stdlib.h>
906 int main () { char *p1,*p2; p1=NULL; memset(&p2,0,sizeof(p2));
907 return memcmp(&p1,&p2,sizeof(char*))?1:0; }]])],
908 [tor_cv_null_is_zero=yes],
909 [tor_cv_null_is_zero=no],
910 [tor_cv_null_is_zero=cross])])
912 if test "$tor_cv_null_is_zero" = 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 NULL is represented as a sequence of 0-valued bytes.])
917 if test "$tor_cv_null_is_zero" != no; then
918 AC_DEFINE([NULL_REP_IS_ZERO_BYTES], 1,
919 [Define to 1 iff memset(0) sets pointers to NULL])
922 # And what happens when we malloc zero?
923 AC_CACHE_CHECK([whether we can malloc(0) safely.], tor_cv_malloc_zero_works,
924 [AC_RUN_IFELSE([AC_LANG_SOURCE(
925 [[#include <stdlib.h>
931 int main () { return malloc(0)?0:1; }]])],
932 [tor_cv_malloc_zero_works=yes],
933 [tor_cv_malloc_zero_works=no],
934 [tor_cv_malloc_zero_works=cross])])
936 if test "$tor_cv_malloc_zero_works" = cross; then
937 # Cross-compiling; let's hope that the target isn't raving mad.
938 AC_MSG_NOTICE([Cross-compiling: we'll assume that we need to check malloc() arguments for 0.])
941 if test "$tor_cv_malloc_zero_works" = yes; then
942 AC_DEFINE([MALLOC_ZERO_WORKS], 1,
943 [Define to 1 iff malloc(0) returns a pointer])
946 # whether we seem to be in a 2s-complement world.
947 AC_CACHE_CHECK([whether we are using 2s-complement arithmetic], tor_cv_twos_complement,
948 [AC_RUN_IFELSE([AC_LANG_SOURCE(
949 [[int main () { int problem = ((-99) != (~99)+1);
950 return problem ? 1 : 0; }]])],
951 [tor_cv_twos_complement=yes],
952 [tor_cv_twos_complement=no],
953 [tor_cv_twos_complement=cross])])
955 if test "$tor_cv_twos_complement" = cross ; then
956 # Cross-compiling; let's hope that the target isn't raving mad.
957 AC_MSG_NOTICE([Cross-compiling: we'll assume that negative integers are represented with two's complement.])
960 if test "$tor_cv_twos_complement" != no ; then
961 AC_DEFINE([USING_TWOS_COMPLEMENT], 1,
962 [Define to 1 iff we represent negative integers with two's complement])
965 # What does shifting a negative value do?
966 AC_CACHE_CHECK([whether right-shift on negative values does sign-extension], tor_cv_sign_extend,
967 [AC_RUN_IFELSE([AC_LANG_SOURCE(
968 [[int main () { int okay = (-60 >> 8) == -1; return okay ? 0 : 1; }]])],
969 [tor_cv_sign_extend=yes],
970 [tor_cv_sign_extend=no],
971 [tor_cv_sign_extend=cross])])
973 if test "$tor_cv_sign_extend" = cross ; then
974 # Cross-compiling; let's hope that the target isn't raving mad.
975 AC_MSG_NOTICE([Cross-compiling: we'll assume that right-shifting negative integers causes sign-extension])
978 if test "$tor_cv_sign_extend" != no ; then
979 AC_DEFINE([RSHIFT_DOES_SIGN_EXTEND], 1,
980 [Define to 1 iff right-shifting a negative value performs sign-extension])
983 # Whether we should use the dmalloc memory allocation debugging library.
984 AC_MSG_CHECKING(whether to use dmalloc (debug memory allocation library))
986 [ --with-dmalloc Use debug memory allocation library. ],
987 [if [[ "$withval" = "yes" ]]; then
993 fi], [ dmalloc=0; AC_MSG_RESULT(no) ]
996 if [[ $dmalloc -eq 1 ]]; then
997 AC_CHECK_HEADERS(dmalloc.h, , AC_MSG_ERROR(dmalloc header file not found. Do you have the development files for dmalloc installed?))
998 AC_SEARCH_LIBS(dmalloc_malloc, [dmallocth dmalloc], , AC_MSG_ERROR(Libdmalloc library not found. If you enable it you better have it installed.))
999 AC_DEFINE(USE_DMALLOC, 1, [Debug memory allocation library])
1000 AC_DEFINE(DMALLOC_FUNC_CHECK, 1, [Enable dmalloc's malloc function check])
1001 AC_CHECK_FUNCS(dmalloc_strdup dmalloc_strndup)
1004 AC_ARG_WITH(tcmalloc,
1005 [ --with-tcmalloc Use tcmalloc memory allocation library. ],
1006 [ tcmalloc=yes ], [ tcmalloc=no ])
1008 if test x$tcmalloc = xyes ; then
1009 LDFLAGS="-ltcmalloc $LDFLAGS"
1012 # By default, we're going to assume we don't have mlockall()
1013 # bionic and other platforms have various broken mlockall subsystems.
1014 # Some systems don't have a working mlockall, some aren't linkable,
1015 # and some have it but don't declare it.
1016 AC_CHECK_FUNCS(mlockall)
1017 AC_CHECK_DECLS([mlockall], , , [
1018 #ifdef HAVE_SYS_MMAN_H
1019 #include <sys/mman.h>
1022 # Allow user to specify an alternate syslog facility
1023 AC_ARG_WITH(syslog-facility,
1024 [ --with-syslog-facility=LOG syslog facility to use (default=LOG_DAEMON)],
1025 syslog_facility="$withval", syslog_facility="LOG_DAEMON")
1026 AC_DEFINE_UNQUOTED(LOGFACILITY,$syslog_facility,[name of the syslog facility])
1027 AC_SUBST(LOGFACILITY)
1029 # Check if we have getresuid and getresgid
1030 AC_CHECK_FUNCS(getresuid getresgid)
1032 # Check for gethostbyname_r in all its glorious incompatible versions.
1033 # (This logic is based on that in Python's configure.in)
1034 AH_TEMPLATE(HAVE_GETHOSTBYNAME_R,
1035 [Define this if you have any gethostbyname_r()])
1037 AC_CHECK_FUNC(gethostbyname_r, [
1038 AC_MSG_CHECKING([how many arguments gethostbyname_r() wants])
1040 CFLAGS="$CFLAGS $MY_CPPFLAGS $MY_THREAD_CPPFLAGS $MY_CFLAGS"
1041 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
1045 struct hostent *h1, *h2;
1047 (void)gethostbyname_r(cp1,h1,cp2,i1,&h2,&i2);
1049 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1050 AC_DEFINE(HAVE_GETHOSTBYNAME_R_6_ARG, 1,
1051 [Define this if gethostbyname_r takes 6 arguments])
1060 (void)gethostbyname_r(cp1,h1,cp2,i1,&i2);
1062 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1063 AC_DEFINE(HAVE_GETHOSTBYNAME_R_5_ARG, 1,
1064 [Define this if gethostbyname_r takes 5 arguments])
1072 struct hostent_data hd;
1073 (void) gethostbyname_r(cp1,h1,&hd);
1075 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1076 AC_DEFINE(HAVE_GETHOSTBYNAME_R_3_ARG, 1,
1077 [Define this if gethostbyname_r takes 3 arguments])
1087 AC_CACHE_CHECK([whether the C compiler supports __func__],
1088 tor_cv_have_func_macro,
1089 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1091 int main(int c, char **v) { puts(__func__); }])],
1092 tor_cv_have_func_macro=yes,
1093 tor_cv_have_func_macro=no))
1095 AC_CACHE_CHECK([whether the C compiler supports __FUNC__],
1096 tor_cv_have_FUNC_macro,
1097 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1099 int main(int c, char **v) { puts(__FUNC__); }])],
1100 tor_cv_have_FUNC_macro=yes,
1101 tor_cv_have_FUNC_macro=no))
1103 AC_CACHE_CHECK([whether the C compiler supports __FUNCTION__],
1104 tor_cv_have_FUNCTION_macro,
1105 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1107 int main(int c, char **v) { puts(__FUNCTION__); }])],
1108 tor_cv_have_FUNCTION_macro=yes,
1109 tor_cv_have_FUNCTION_macro=no))
1111 AC_CACHE_CHECK([whether we have extern char **environ already declared],
1112 tor_cv_have_environ_declared,
1113 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1114 /* We define _GNU_SOURCE here because it is also defined in compat.c.
1115 * Without it environ doesn't get declared. */
1117 #ifdef HAVE_UNISTD_H
1121 int main(int c, char **v) { char **t = environ; }])],
1122 tor_cv_have_environ_declared=yes,
1123 tor_cv_have_environ_declared=no))
1125 if test "$tor_cv_have_func_macro" = 'yes'; then
1126 AC_DEFINE(HAVE_MACRO__func__, 1, [Defined if the compiler supports __func__])
1129 if test "$tor_cv_have_FUNC_macro" = 'yes'; then
1130 AC_DEFINE(HAVE_MACRO__FUNC__, 1, [Defined if the compiler supports __FUNC__])
1133 if test "$tor_cv_have_FUNCTION_macro" = 'yes'; then
1134 AC_DEFINE(HAVE_MACRO__FUNCTION__, 1,
1135 [Defined if the compiler supports __FUNCTION__])
1138 if test "$tor_cv_have_environ_declared" = 'yes'; then
1139 AC_DEFINE(HAVE_EXTERN_ENVIRON_DECLARED, 1,
1140 [Defined if we have extern char **environ already declared])
1143 # $prefix stores the value of the --prefix command line option, or
1144 # NONE if the option wasn't set. In the case that it wasn't set, make
1145 # it be the default, so that we can use it to expand directories now.
1146 if test "x$prefix" = "xNONE"; then
1147 prefix=$ac_default_prefix
1150 # and similarly for $exec_prefix
1151 if test "x$exec_prefix" = "xNONE"; then
1155 if test "x$BUILDDIR" = "x"; then
1159 AH_TEMPLATE([BUILDDIR],[tor's build directory])
1160 AC_DEFINE_UNQUOTED(BUILDDIR,"$BUILDDIR")
1162 if test "x$CONFDIR" = "x"; then
1163 CONFDIR=`eval echo $sysconfdir/tor`
1166 AH_TEMPLATE([CONFDIR],[tor's configuration directory])
1167 AC_DEFINE_UNQUOTED(CONFDIR,"$CONFDIR")
1169 BINDIR=`eval echo $bindir`
1171 LOCALSTATEDIR=`eval echo $localstatedir`
1172 AC_SUBST(LOCALSTATEDIR)
1174 if test "$bwin32" = true; then
1175 # Test if the linker supports the --nxcompat and --dynamicbase options
1177 save_LDFLAGS="$LDFLAGS"
1178 LDFLAGS="-Wl,--nxcompat -Wl,--dynamicbase"
1179 AC_MSG_CHECKING([whether the linker supports DllCharacteristics])
1180 AC_LINK_IFELSE([AC_LANG_PROGRAM([])],
1181 [AC_MSG_RESULT([yes])]
1182 [save_LDFLAGS="$save_LDFLAGS $LDFLAGS"],
1183 [AC_MSG_RESULT([no])]
1185 LDFLAGS="$save_LDFLAGS"
1188 # Set CFLAGS _after_ all the above checks, since our warnings are stricter
1189 # than autoconf's macros like.
1190 if test "$GCC" = yes; then
1191 # Disable GCC's strict aliasing checks. They are an hours-to-debug
1192 # accident waiting to happen.
1193 CFLAGS="$CFLAGS -Wall -fno-strict-aliasing"
1195 # Autoconf sets -g -O2 by default. Override optimization level
1196 # for non-gcc compilers
1198 enable_gcc_warnings=no
1199 enable_gcc_warnings_advisory=no
1202 # OS X Lion started deprecating the system openssl. Let's just disable
1203 # all deprecation warnings on OS X. Also, to potentially make the binary
1204 # a little smaller, let's enable dead_strip.
1208 CFLAGS="$CFLAGS -Wno-deprecated-declarations"
1209 LDFLAGS="$LDFLAGS -dead_strip" ;;
1212 # Add some more warnings which we use in development but not in the
1213 # released versions. (Some relevant gcc versions can't handle these.)
1214 if test x$enable_gcc_warnings = xyes || test x$enable_gcc_warnings_advisory = xyes; then
1216 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1217 #if !defined(__GNUC__) || (__GNUC__ < 4)
1219 #endif])], have_gcc4=yes, have_gcc4=no)
1221 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1222 #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 2)
1224 #endif])], have_gcc42=yes, have_gcc42=no)
1226 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1227 #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 3)
1229 #endif])], have_gcc43=yes, have_gcc43=no)
1231 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1232 #if !defined(__clang__)
1234 #endif])], have_clang=yes, have_clang=no)
1236 save_CFLAGS="$CFLAGS"
1237 CFLAGS="$CFLAGS -Wshorten-64-to-32"
1238 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], have_shorten64_flag=yes,
1239 have_shorten64_flag=no)
1240 CFLAGS="$save_CFLAGS"
1244 # Some OpenBSD versions (like 4.8) have -Wsystem-headers by default.
1245 # That's fine, except that the headers don't pass -Wredundant-decls.
1246 # Therefore, let's disable -Wsystem-headers when we're building
1247 # with maximal warnings on OpenBSD.
1248 CFLAGS="$CFLAGS -Wno-system-headers" ;;
1251 CFLAGS="$CFLAGS -W -Wfloat-equal -Wundef -Wpointer-arith"
1252 CFLAGS="$CFLAGS -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings"
1253 CFLAGS="$CFLAGS -Wredundant-decls -Wchar-subscripts -Wcomment -Wformat=2"
1254 CFLAGS="$CFLAGS -Wwrite-strings -Wmissing-declarations -Wredundant-decls"
1255 CFLAGS="$CFLAGS -Wnested-externs -Wbad-function-cast -Wswitch-enum"
1257 if test x$enable_gcc_warnings = xyes; then
1258 CFLAGS="$CFLAGS -Werror"
1261 # Disabled, so we can use mallinfo(): -Waggregate-return
1263 if test x$have_gcc4 = xyes ; then
1264 # These warnings break gcc 3.3.5 and work on gcc 4.0.2
1265 CFLAGS="$CFLAGS -Winit-self -Wmissing-field-initializers -Wdeclaration-after-statement -Wold-style-definition"
1268 if test x$have_gcc42 = xyes ; then
1269 # These warnings break gcc 4.0.2 and work on gcc 4.2
1270 # XXXX020 See if any of these work with earlier versions.
1271 CFLAGS="$CFLAGS -Waddress -Wmissing-noreturn -Wstrict-overflow=1"
1273 # We used to use -Wstrict-overflow=5, but that breaks us heavily under 4.3.
1276 if test x$have_gcc42 = xyes && test x$have_clang = xno; then
1277 # These warnings break gcc 4.0.2 and clang, but work on gcc 4.2
1278 CFLAGS="$CFLAGS -Wnormalized=id -Woverride-init"
1281 if test x$have_gcc43 = xyes ; then
1282 # These warnings break gcc 4.2 and work on gcc 4.3
1283 # XXXX020 See if any of these work with earlier versions.
1284 CFLAGS="$CFLAGS -Wextra -Warray-bounds"
1287 if test x$have_shorten64_flag = xyes ; then
1288 CFLAGS="$CFLAGS -Wshorten-64-to-32"
1291 ##This will break the world on some 64-bit architectures
1292 # CFLAGS="$CFLAGS -Winline"
1297 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent $TOR_CPPFLAGS_openssl $TOR_CPPFLAGS_zlib"
1303 contrib/suse/Makefile
1305 contrib/tor.logrotate
1313 src/config/torrc.sample
1317 src/tools/tor-fw-helper/Makefile
1324 if test -x /usr/bin/perl && test -x ./contrib/updateVersions.pl ; then
1325 ./contrib/updateVersions.pl