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.3-alpha)
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])
148 AC_ARG_ENABLE(bufferevents,
149 AS_HELP_STRING(--enable-bufferevents, use Libevent's buffered IO.))
156 dnl autoconf 2.59 appears not to support AC_PROG_SED
157 AC_CHECK_PROG([SED],[sed],[sed],[/bin/false])
159 dnl check for asciidoc and a2x
160 AC_PATH_PROG([ASCIIDOC], [asciidoc], none)
161 AC_PATH_PROG([A2X], [a2x], none)
163 AM_CONDITIONAL(USE_ASCIIDOC, test x$asciidoc = xtrue)
165 AM_CONDITIONAL(USE_FW_HELPER, test x$natpmp = xtrue || test x$upnp = xtrue)
166 AM_CONDITIONAL(NAT_PMP, test x$natpmp = xtrue)
167 AM_CONDITIONAL(MINIUPNPC, test x$upnp = xtrue)
170 ifdef([AC_C_FLEXIBLE_ARRAY_MEMBER], [
171 AC_C_FLEXIBLE_ARRAY_MEMBER
173 dnl Maybe we've got an old autoconf...
174 AC_CACHE_CHECK([for flexible array members],
178 struct abc { int a; char b[]; };
180 struct abc *def = malloc(sizeof(struct abc)+sizeof(char));
183 [tor_cv_c_flexarray=yes],
184 [tor_cv_c_flexarray=no])])
185 if test $tor_cv_flexarray = yes ; then
186 AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [])
188 AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [1])
192 AC_PATH_PROG([SHA1SUM], [sha1sum], none)
193 AC_PATH_PROG([OPENSSL], [openssl], none)
196 AC_ARG_WITH(tor-user,
197 [ --with-tor-user=NAME Specify username for tor daemon ],
205 AC_ARG_WITH(tor-group,
206 [ --with-tor-group=NAME Specify group name for tor daemon ],
214 dnl If WIN32 is defined and non-zero, we are building for win32
215 AC_MSG_CHECKING([for win32])
216 AC_RUN_IFELSE([AC_LANG_SOURCE([
217 int main(int c, char **v) {
228 bwin32=true; AC_MSG_RESULT([yes]),
229 bwin32=false; AC_MSG_RESULT([no]),
230 bwin32=cross; AC_MSG_RESULT([cross])
233 if test "$bwin32" = cross; then
234 AC_MSG_CHECKING([for win32 (cross)])
235 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
237 int main(int c, char **v) {return 0;}
240 int main(int c, char **v) {return x(y);}
243 bwin32=true; AC_MSG_RESULT([yes]),
244 bwin32=false; AC_MSG_RESULT([no]))
247 if test "$bwin32" = true; then
248 AC_DEFINE(MS_WINDOWS, 1, [Define to 1 if we are building for Windows.])
250 AM_CONDITIONAL(BUILD_NT_SERVICES, test x$bwin32 = xtrue)
252 dnl Enable C99 when compiling with MIPSpro
253 AC_MSG_CHECKING([for MIPSpro compiler])
254 AC_COMPILE_IFELSE([AC_LANG_PROGRAM(, [
255 #if (defined(__sgi) && defined(_COMPILER_VERSION))
260 bmipspro=false; AC_MSG_RESULT(no),
261 bmipspro=true; AC_MSG_RESULT(yes))
263 if test "$bmipspro" = true; then
264 CFLAGS="$CFLAGS -c99"
269 AC_SEARCH_LIBS(socket, [socket])
270 AC_SEARCH_LIBS(gethostbyname, [nsl])
271 AC_SEARCH_LIBS(dlopen, [dl])
272 AC_SEARCH_LIBS(inet_aton, [resolv])
274 if test "$enable_threads" = "yes"; then
275 AC_SEARCH_LIBS(pthread_create, [pthread])
276 AC_SEARCH_LIBS(pthread_detach, [pthread])
279 dnl -------------------------------------------------------------------
280 dnl Check for functions before libevent, since libevent-1.2 apparently
281 dnl exports strlcpy without defining it in a header.
306 using_custom_malloc=no
307 if test x$enable_openbsd_malloc = xyes ; then
308 AC_DEFINE(HAVE_MALLOC_GOOD_SIZE, 1, [Defined if we have the malloc_good_size function])
309 using_custom_malloc=yes
311 if test x$tcmalloc = xyes ; then
312 using_custom_malloc=yes
314 if test $using_custom_malloc = no ; then
315 AC_CHECK_FUNCS(mallinfo malloc_good_size malloc_usable_size)
318 if test "$enable_threads" = "yes"; then
319 AC_CHECK_HEADERS(pthread.h)
320 AC_CHECK_FUNCS(pthread_create)
323 dnl ------------------------------------------------------
324 dnl Where do you live, libevent? And how do we call you?
326 if test "$bwin32" = true; then
327 TOR_LIB_WS32=-lws2_32
328 TOR_LIB_IPHLPAPI=-liphlpapi
329 # Some of the cargo-cults recommend -lwsock32 as well, but I don't
330 # think it's actually necessary.
336 AC_SUBST(TOR_LIB_WS32)
337 AC_SUBST(TOR_LIB_GDI)
338 AC_SUBST(TOR_LIB_IPHLPAPI)
340 dnl We need to do this before we try our disgusting hack below.
341 AC_CHECK_HEADERS([sys/types.h])
343 dnl This is a disgusting hack so we safely include older libevent headers.
344 AC_CHECK_TYPE(u_int64_t, unsigned long long)
345 AC_CHECK_TYPE(u_int32_t, unsigned long)
346 AC_CHECK_TYPE(u_int16_t, unsigned short)
347 AC_CHECK_TYPE(u_int8_t, unsigned char)
349 tor_libevent_pkg_redhat="libevent"
350 tor_libevent_pkg_debian="libevent-dev"
351 tor_libevent_devpkg_redhat="libevent-devel"
352 tor_libevent_devpkg_debian="libevent-dev"
354 dnl On Gnu/Linux or any place we require it, we'll add librt to the Libevent
355 dnl linking for static builds.
356 STATIC_LIBEVENT_FLAGS=""
357 if test "$enable_static_libevent" = "yes"; then
358 dnl Determine if we have clock_gettime in librt
359 AC_SEARCH_LIBS([clock_gettime], [rt],
361 if test "$have_rt" = yes; then
362 STATIC_LIBEVENT_FLAGS=" -lrt "
366 TOR_SEARCH_LIBRARY(libevent, $trylibeventdir, [-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32], [
368 #include <winsock2.h>
371 #include <sys/time.h>
372 #include <sys/types.h>
373 #include <event.h>], [
375 #include <winsock2.h>
377 void exit(int); void *event_init(void);],
380 {WSADATA d; WSAStartup(0x101,&d); }
382 event_init(); exit(0);
383 ], [--with-libevent-dir], [/opt/libevent])
385 dnl Now check for particular libevent functions.
387 save_LDFLAGS="$LDFLAGS"
388 save_CPPFLAGS="$CPPFLAGS"
389 LIBS="-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32 $LIBS"
390 LDFLAGS="$TOR_LDFLAGS_libevent $LDFLAGS"
391 CPPFLAGS="$TOR_CPPFLAGS_libevent $CPPFLAGS"
392 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)
393 AC_CHECK_MEMBERS([struct event.min_heap_idx], , ,
397 AC_CHECK_HEADERS(event2/event.h event2/dns.h event2/bufferevent_ssl.h)
400 LDFLAGS="$save_LDFLAGS"
401 CPPFLAGS="$save_CPPFLAGS"
404 AM_CONDITIONAL(USE_EXTERNAL_EVDNS, test x$ac_cv_header_event2_dns_h = xyes)
406 if test "$enable_static_libevent" = "yes"; then
407 if test "$tor_cv_library_libevent_dir" = "(system)"; then
408 AC_MSG_ERROR("You must specify an explicit --with-libevent-dir=x option when using --enable-static-libevent")
410 TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent.a $STATIC_LIBEVENT_FLAGS"
413 TOR_LIBEVENT_LIBS="-levent"
416 dnl This isn't the best test for Libevent 2.0.3-alpha. Once it's released,
417 dnl we can do much better.
418 if test "$enable_bufferevents" = "yes" ; then
419 if test "$ac_cv_header_event2_bufferevent_ssl_h" != "yes" ; then
420 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.])
423 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent"
425 # Check for the right version. First see if version detection works.
426 AC_MSG_CHECKING([whether we can detect the Libevent version])
427 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
428 #include <event2/event.h>
429 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 10
435 ])], [event_version_number_works=yes; AC_MSG_RESULT([yes]) ],
436 [event_version_number_works=no; AC_MSG_RESULT([no])])
437 if test "$event_version_number_works" != 'yes'; then
438 AC_MSG_WARN([Version detection on Libevent seems broken. Your Libevent installation is probably screwed up or very old.])
440 AC_MSG_CHECKING([whether Libevent is new enough for bufferevents])
441 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
442 #include <event2/event.h>
443 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 0x02000d00
449 ])], [ AC_MSG_RESULT([yes]) ],
450 [ AC_MSG_RESULT([no])
451 AC_MSG_ERROR([Libevent does not seem new enough to support bufferevents. We require 2.0.13-stable or later]) ] )
457 LDFLAGS="$save_LDFLAGS"
458 CPPFLAGS="$save_CPPFLAGS"
460 AM_CONDITIONAL(USE_BUFFEREVENTS, test "$enable_bufferevents" = "yes")
461 if test "$enable_bufferevents" = "yes"; then
462 AC_DEFINE(USE_BUFFEREVENTS, 1, [Defined if we're going to use Libevent's buffered IO API])
463 if test "$enable_static_libevent" = "yes"; then
464 TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent_openssl.a $TOR_LIBEVENT_LIBS"
466 TOR_LIBEVENT_LIBS="-levent_openssl $TOR_LIBEVENT_LIBS"
469 AC_SUBST(TOR_LIBEVENT_LIBS)
471 dnl ------------------------------------------------------
472 dnl Where do you live, openssl? And how do we call you?
474 tor_openssl_pkg_redhat="openssl"
475 tor_openssl_pkg_debian="libssl"
476 tor_openssl_devpkg_redhat="openssl-devel"
477 tor_openssl_devpkg_debian="libssl-dev"
479 ALT_openssl_WITHVAL=""
481 [ --with-ssl-dir=PATH Obsolete alias for --with-openssl-dir ],
483 if test "x$withval" != xno && test "x$withval" != "x" ; then
484 ALT_openssl_WITHVAL="$withval"
488 TOR_SEARCH_LIBRARY(openssl, $tryssldir, [-lssl -lcrypto $TOR_LIB_GDI],
489 [#include <openssl/rand.h>],
490 [void RAND_add(const void *buf, int num, double entropy);],
491 [RAND_add((void*)0,0,0); exit(0);], [],
492 [/usr/local/openssl /usr/lib/openssl /usr/local/ssl /usr/lib/ssl /usr/local /usr/athena /opt/openssl])
494 dnl XXXX check for OPENSSL_VERSION_NUMBER == SSLeay()
496 echo "tor_cv_library_openssl_dir is $tor_cv_library_openssl_dir"
497 if test "$enable_static_openssl" = "yes"; then
498 if test "$tor_cv_library_openssl_dir" = "(system)"; then
499 AC_MSG_ERROR("You must specify an explicit --with-openssl-dir=x option when using --enable-static-openssl")
501 TOR_OPENSSL_LIBS="$TOR_LIBDIR_openssl/libssl.a $TOR_LIBDIR_openssl/libcrypto.a"
504 TOR_OPENSSL_LIBS="-lssl -lcrypto"
506 AC_SUBST(TOR_OPENSSL_LIBS)
508 dnl ------------------------------------------------------
509 dnl Where do you live, zlib? And how do we call you?
511 tor_zlib_pkg_redhat="zlib"
512 tor_zlib_pkg_debian="zlib1g"
513 tor_zlib_devpkg_redhat="zlib-devel"
514 tor_zlib_devpkg_debian="zlib1g-dev"
516 TOR_SEARCH_LIBRARY(zlib, $tryzlibdir, [-lz],
518 [const char * zlibVersion(void);],
519 [zlibVersion(); exit(0);], [--with-zlib-dir],
522 if test "$enable_static_zlib" = "yes"; then
523 if test "$tor_cv_library_zlib_dir" = "(system)"; then
524 AC_MSG_ERROR("You must specify an explicit --with-zlib-dir=x option when
525 using --enable-static-zlib")
527 TOR_ZLIB_LIBS="$TOR_LIBDIR_zlib/libz.a"
528 echo "$TOR_LIBDIR_zlib/libz.a"
533 AC_SUBST(TOR_ZLIB_LIBS)
535 dnl Make sure to enable support for large off_t if available.
538 dnl ------------------------------------------------------
539 dnl Where do you live, libnatpmp? And how do we call you?
540 dnl There are no packages for Debian or Redhat as of this patch
542 if test "$natpmp" = "true"; then
543 AC_DEFINE(NAT_PMP, 1, [Define to 1 if we are building with nat-pmp.])
544 TOR_SEARCH_LIBRARY(libnatpmp, $trylibnatpmpdir, [-lnatpmp],
545 [#include <natpmp.h>],
546 [#include <natpmp.h>],
549 natpmpresp_t response;
550 r = initnatpmp(&natpmp, 0, 0);],
551 [printf("initnatpmp() returned %d (%s)\n", r, r?"FAILED":"SUCCESS");
553 [--with-libnatpmp-dir],
558 dnl ------------------------------------------------------
559 dnl Where do you live, libminiupnpc? And how do we call you?
560 dnl There are no packages for Debian or Redhat as of this patch
562 if test "$upnp" = "true"; then
563 AC_DEFINE(MINIUPNPC, 1, [Define to 1 if we are building with UPnP.])
564 TOR_SEARCH_LIBRARY(libminiupnpc, $trylibminiupnpcdir, [-lminiupnpc $TOR_LIB_WS32 $TOR_LIB_IPHLPAPI],
565 [#include <miniupnpc/miniwget.h>
566 #include <miniupnpc/miniupnpc.h>
567 #include <miniupnpc/upnpcommands.h>],
568 [void upnpDiscover(int delay, const char * multicastif,
569 const char * minissdpdsock, int sameport);],
570 [upnpDiscover(1, 0, 0, 0); exit(0);],
571 [--with-libminiupnpc-dir],
589 , , 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.))
591 dnl These headers are not essential
626 TOR_CHECK_PROTOTYPE(malloc_good_size, HAVE_MALLOC_GOOD_SIZE_PROTOTYPE,
627 [#ifdef HAVE_MALLOC_H
630 #ifdef HAVE_MALLOC_MALLOC_H
631 #include <malloc/malloc.h>
634 AC_CHECK_HEADERS(net/if.h, net_if_found=1, net_if_found=0,
635 [#ifdef HAVE_SYS_TYPES_H
636 #include <sys/types.h>
638 #ifdef HAVE_SYS_SOCKET_H
639 #include <sys/socket.h>
641 AC_CHECK_HEADERS(net/pfvar.h, net_pfvar_found=1, net_pfvar_found=0,
642 [#ifdef HAVE_SYS_TYPES_H
643 #include <sys/types.h>
645 #ifdef HAVE_SYS_SOCKET_H
646 #include <sys/socket.h>
651 AC_CHECK_HEADERS(linux/netfilter_ipv4.h,
652 linux_netfilter_ipv4=1, linux_netfilter_ipv4=0,
653 [#ifdef HAVE_SYS_TYPES_H
654 #include <sys/types.h>
656 #ifdef HAVE_SYS_SOCKET_H
657 #include <sys/socket.h>
662 #ifdef HAVE_LINUX_TYPES_H
663 #include <linux/types.h>
665 #ifdef HAVE_NETINET_IN6_H
666 #include <netinet/in6.h>
668 #ifdef HAVE_NETINET_IN_H
669 #include <netinet/in.h>
672 if test x$transparent = xtrue ; then
674 if test x$net_if_found = x1 && test x$net_pfvar_found = x1 ; then
677 if test x$linux_netfilter_ipv4 = x1 ; then
680 if test x$transparent_ok = x1 ; then
681 AC_DEFINE(USE_TRANSPARENT, 1, "Define to enable transparent proxy support")
684 AC_DEFINE(OPENBSD, 1, "Define to handle pf on OpenBSD properly") ;;
687 AC_MSG_NOTICE([Transparent proxy support enabled, but missing headers.])
691 AC_CHECK_MEMBERS([struct timeval.tv_sec], , ,
692 [#ifdef HAVE_SYS_TYPES_H
693 #include <sys/types.h>
695 #ifdef HAVE_SYS_TIME_H
696 #include <sys/time.h>
699 dnl In case we aren't given a working stdint.h, we'll need to grow our own.
702 AC_CHECK_SIZEOF(int8_t)
703 AC_CHECK_SIZEOF(int16_t)
704 AC_CHECK_SIZEOF(int32_t)
705 AC_CHECK_SIZEOF(int64_t)
706 AC_CHECK_SIZEOF(uint8_t)
707 AC_CHECK_SIZEOF(uint16_t)
708 AC_CHECK_SIZEOF(uint32_t)
709 AC_CHECK_SIZEOF(uint64_t)
710 AC_CHECK_SIZEOF(intptr_t)
711 AC_CHECK_SIZEOF(uintptr_t)
713 dnl AC_CHECK_TYPES([int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t, uint64_t, intptr_t, uintptr_t])
715 AC_CHECK_SIZEOF(char)
716 AC_CHECK_SIZEOF(short)
718 AC_CHECK_SIZEOF(long)
719 AC_CHECK_SIZEOF(long long)
720 AC_CHECK_SIZEOF(__int64)
721 AC_CHECK_SIZEOF(void *)
722 AC_CHECK_SIZEOF(time_t)
723 AC_CHECK_SIZEOF(size_t)
725 AC_CHECK_TYPES([uint, u_char, ssize_t])
727 dnl used to include sockaddr_storage, but everybody has that.
728 AC_CHECK_TYPES([struct in6_addr, struct sockaddr_in6, sa_family_t], , ,
729 [#ifdef HAVE_SYS_TYPES_H
730 #include <sys/types.h>
732 #ifdef HAVE_NETINET_IN_H
733 #include <netinet/in.h>
735 #ifdef HAVE_NETINET_IN6_H
736 #include <netinet/in6.h>
738 #ifdef HAVE_SYS_SOCKET_H
739 #include <sys/socket.h>
742 #define WIN32_WINNT 0x400
743 #define _WIN32_WINNT 0x400
744 #define WIN32_LEAN_AND_MEAN
745 #if defined(_MSC_VER) && (_MSC_VER < 1300)
748 #include <winsock2.h>
749 #include <ws2tcpip.h>
753 AC_CHECK_MEMBERS([struct in6_addr.s6_addr32, struct in6_addr.s6_addr16, struct sockaddr_in.sin_len, struct sockaddr_in6.sin6_len], , ,
754 [#ifdef HAVE_SYS_TYPES_H
755 #include <sys/types.h>
757 #ifdef HAVE_NETINET_IN_H
758 #include <netinet/in.h>
760 #ifdef HAVE_NETINET_IN6_H
761 #include <netinet/in6.h>
763 #ifdef HAVE_SYS_SOCKET_H
764 #include <sys/socket.h>
767 #define WIN32_WINNT 0x400
768 #define _WIN32_WINNT 0x400
769 #define WIN32_LEAN_AND_MEAN
770 #if defined(_MSC_VER) && (_MSC_VER < 1300)
773 #include <winsock2.h>
774 #include <ws2tcpip.h>
779 AC_CHECK_TYPES([rlim_t], , ,
780 [#ifdef HAVE_SYS_TYPES_H
781 #include <sys/types.h>
783 #ifdef HAVE_SYS_TIME_H
784 #include <sys/time.h>
786 #ifdef HAVE_SYS_RESOURCE_H
787 #include <sys/resource.h>
791 AC_CACHE_CHECK([whether time_t is signed], tor_cv_time_t_signed, [
792 AC_RUN_IFELSE([AC_LANG_SOURCE([
793 #ifdef HAVE_SYS_TYPES_H
794 #include <sys/types.h>
796 #ifdef HAVE_SYS_TIME_H
797 #include <sys/time.h>
802 int main(int c, char**v) { if (((time_t)-1)<0) return 1; else return 0; }])],
803 tor_cv_time_t_signed=no, tor_cv_time_t_signed=yes, tor_cv_time_t_signed=cross)
806 if test "$tor_cv_time_t_signed" = cross; then
807 AC_MSG_NOTICE([Cross compiling: assuming that time_t is signed.])
810 if test "$tor_cv_time_t_signed" != no; then
811 AC_DEFINE([TIME_T_IS_SIGNED], 1,
812 [Define to 1 iff time_t is signed])
815 AC_CACHE_CHECK([whether size_t is signed], tor_cv_size_t_signed, [
816 AC_RUN_IFELSE([AC_LANG_SOURCE([
817 #ifdef HAVE_SYS_TYPES_H
818 #include <sys/types.h>
820 int main(int c, char**v) { if (((size_t)-1)<0) return 1; else return 0; }])],
821 tor_cv_size_t_signed=no, tor_cv_size_t_signed=yes, tor_cv_size_t_signed=cross)
824 if test "$tor_cv_size_t_signed" = cross; then
825 AC_MSG_NOTICE([Cross compiling: assuming that size_t is not signed.])
828 if test "$tor_cv_size_t_signed" = yes; then
829 AC_MSG_ERROR([You have a signed size_t; that's grossly nonconformant.])
832 AC_CHECK_SIZEOF(socklen_t, , [AC_INCLUDES_DEFAULT()
833 #ifdef HAVE_SYS_SOCKET_H
834 #include <sys/socket.h>
838 # We want to make sure that we _don't_ have a cell_t defined, like IRIX does.
840 AC_CHECK_SIZEOF(cell_t)
842 # Now make sure that NULL can be represented as zero bytes.
843 AC_CACHE_CHECK([whether memset(0) sets pointers to NULL], tor_cv_null_is_zero,
844 [AC_RUN_IFELSE([AC_LANG_SOURCE(
845 [[#include <stdlib.h>
851 int main () { char *p1,*p2; p1=NULL; memset(&p2,0,sizeof(p2));
852 return memcmp(&p1,&p2,sizeof(char*))?1:0; }]])],
853 [tor_cv_null_is_zero=yes],
854 [tor_cv_null_is_zero=no],
855 [tor_cv_null_is_zero=cross])])
857 if test "$tor_cv_null_is_zero" = cross ; then
858 # Cross-compiling; let's hope that the target isn't raving mad.
859 AC_MSG_NOTICE([Cross-compiling: we'll assume that NULL is represented as a sequence of 0-valued bytes.])
862 if test "$tor_cv_null_is_zero" != no; then
863 AC_DEFINE([NULL_REP_IS_ZERO_BYTES], 1,
864 [Define to 1 iff memset(0) sets pointers to NULL])
867 # And what happens when we malloc zero?
868 AC_CACHE_CHECK([whether we can malloc(0) safely.], tor_cv_malloc_zero_works,
869 [AC_RUN_IFELSE([AC_LANG_SOURCE(
870 [[#include <stdlib.h>
876 int main () { return malloc(0)?0:1; }]])],
877 [tor_cv_malloc_zero_works=yes],
878 [tor_cv_malloc_zero_works=no],
879 [tor_cv_malloc_zero_works=cross])])
881 if test "$tor_cv_malloc_zero_works" = cross; then
882 # Cross-compiling; let's hope that the target isn't raving mad.
883 AC_MSG_NOTICE([Cross-compiling: we'll assume that we need to check malloc() arguments for 0.])
886 if test "$tor_cv_malloc_zero_works" = yes; then
887 AC_DEFINE([MALLOC_ZERO_WORKS], 1,
888 [Define to 1 iff malloc(0) returns a pointer])
891 # whether we seem to be in a 2s-complement world.
892 AC_CACHE_CHECK([whether we are using 2s-complement arithmetic], tor_cv_twos_complement,
893 [AC_RUN_IFELSE([AC_LANG_SOURCE(
894 [[int main () { int problem = ((-99) != (~99)+1);
895 return problem ? 1 : 0; }]])],
896 [tor_cv_twos_complement=yes],
897 [tor_cv_twos_complement=no],
898 [tor_cv_twos_complement=cross])])
900 if test "$tor_cv_twos_complement" = cross ; then
901 # Cross-compiling; let's hope that the target isn't raving mad.
902 AC_MSG_NOTICE([Cross-compiling: we'll assume that negative integers are represented with two's complement.])
905 if test "$tor_cv_twos_complement" != no ; then
906 AC_DEFINE([USING_TWOS_COMPLEMENT], 1,
907 [Define to 1 iff we represent negative integers with two's complement])
910 # What does shifting a negative value do?
911 AC_CACHE_CHECK([whether right-shift on negative values does sign-extension], tor_cv_sign_extend,
912 [AC_RUN_IFELSE([AC_LANG_SOURCE(
913 [[int main () { int okay = (-60 >> 8) == -1; return okay ? 0 : 1; }]])],
914 [tor_cv_sign_extend=yes],
915 [tor_cv_sign_extend=no],
916 [tor_cv_sign_extend=cross])])
918 if test "$tor_cv_sign_extend" = cross ; then
919 # Cross-compiling; let's hope that the target isn't raving mad.
920 AC_MSG_NOTICE([Cross-compiling: we'll assume that right-shifting negative integers causes sign-extension])
923 if test "$tor_cv_sign_extend" != no ; then
924 AC_DEFINE([RSHIFT_DOES_SIGN_EXTEND], 1,
925 [Define to 1 iff right-shifting a negative value performs sign-extension])
928 # Whether we should use the dmalloc memory allocation debugging library.
929 AC_MSG_CHECKING(whether to use dmalloc (debug memory allocation library))
931 [ --with-dmalloc Use debug memory allocation library. ],
932 [if [[ "$withval" = "yes" ]]; then
938 fi], [ dmalloc=0; AC_MSG_RESULT(no) ]
941 if [[ $dmalloc -eq 1 ]]; then
942 AC_CHECK_HEADERS(dmalloc.h, , AC_MSG_ERROR(dmalloc header file not found. Do you have the development files for dmalloc installed?))
943 AC_SEARCH_LIBS(dmalloc_malloc, [dmallocth dmalloc], , AC_MSG_ERROR(Libdmalloc library not found. If you enable it you better have it installed.))
944 AC_DEFINE(USE_DMALLOC, 1, [Debug memory allocation library])
945 AC_DEFINE(DMALLOC_FUNC_CHECK, 1, [Enable dmalloc's malloc function check])
946 AC_CHECK_FUNCS(dmalloc_strdup dmalloc_strndup)
949 AC_ARG_WITH(tcmalloc,
950 [ --with-tcmalloc Use tcmalloc memory allocation library. ],
951 [ tcmalloc=yes ], [ tcmalloc=no ])
953 if test x$tcmalloc = xyes ; then
954 LDFLAGS="-ltcmalloc $LDFLAGS"
957 # By default, we're going to assume we don't have mlockall()
958 # bionic and other platforms have various broken mlockall subsystems.
959 # Some systems don't have a working mlockall, some aren't linkable,
960 # and some have it but don't declare it.
961 AC_CHECK_FUNCS(mlockall)
962 AC_CHECK_DECLS([mlockall], , , [
963 #ifdef HAVE_SYS_MMAN_H
964 #include <sys/mman.h>
967 # Allow user to specify an alternate syslog facility
968 AC_ARG_WITH(syslog-facility,
969 [ --with-syslog-facility=LOG syslog facility to use (default=LOG_DAEMON)],
970 syslog_facility="$withval", syslog_facility="LOG_DAEMON")
971 AC_DEFINE_UNQUOTED(LOGFACILITY,$syslog_facility,[name of the syslog facility])
972 AC_SUBST(LOGFACILITY)
974 # Check if we have getresuid and getresgid
975 AC_CHECK_FUNCS(getresuid getresgid)
977 # Check for gethostbyname_r in all its glorious incompatible versions.
978 # (This logic is based on that in Python's configure.in)
979 AH_TEMPLATE(HAVE_GETHOSTBYNAME_R,
980 [Define this if you have any gethostbyname_r()])
982 AC_CHECK_FUNC(gethostbyname_r, [
983 AC_MSG_CHECKING([how many arguments gethostbyname_r() wants])
985 CFLAGS="$CFLAGS $MY_CPPFLAGS $MY_THREAD_CPPFLAGS $MY_CFLAGS"
986 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
990 struct hostent *h1, *h2;
992 (void)gethostbyname_r(cp1,h1,cp2,i1,&h2,&i2);
994 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
995 AC_DEFINE(HAVE_GETHOSTBYNAME_R_6_ARG, 1,
996 [Define this if gethostbyname_r takes 6 arguments])
1005 (void)gethostbyname_r(cp1,h1,cp2,i1,&i2);
1007 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1008 AC_DEFINE(HAVE_GETHOSTBYNAME_R_5_ARG, 1,
1009 [Define this if gethostbyname_r takes 5 arguments])
1017 struct hostent_data hd;
1018 (void) gethostbyname_r(cp1,h1,&hd);
1020 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1021 AC_DEFINE(HAVE_GETHOSTBYNAME_R_3_ARG, 1,
1022 [Define this if gethostbyname_r takes 3 arguments])
1032 AC_CACHE_CHECK([whether the C compiler supports __func__],
1033 tor_cv_have_func_macro,
1034 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1036 int main(int c, char **v) { puts(__func__); }])],
1037 tor_cv_have_func_macro=yes,
1038 tor_cv_have_func_macro=no))
1040 AC_CACHE_CHECK([whether the C compiler supports __FUNC__],
1041 tor_cv_have_FUNC_macro,
1042 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1044 int main(int c, char **v) { puts(__FUNC__); }])],
1045 tor_cv_have_FUNC_macro=yes,
1046 tor_cv_have_FUNC_macro=no))
1048 AC_CACHE_CHECK([whether the C compiler supports __FUNCTION__],
1049 tor_cv_have_FUNCTION_macro,
1050 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1052 int main(int c, char **v) { puts(__FUNCTION__); }])],
1053 tor_cv_have_FUNCTION_macro=yes,
1054 tor_cv_have_FUNCTION_macro=no))
1056 if test "$tor_cv_have_func_macro" = 'yes'; then
1057 AC_DEFINE(HAVE_MACRO__func__, 1, [Defined if the compiler supports __func__])
1060 if test "$tor_cv_have_FUNC_macro" = 'yes'; then
1061 AC_DEFINE(HAVE_MACRO__FUNC__, 1, [Defined if the compiler supports __FUNC__])
1064 if test "$tor_cv_have_FUNCTION_macro" = 'yes'; then
1065 AC_DEFINE(HAVE_MACRO__FUNCTION__, 1,
1066 [Defined if the compiler supports __FUNCTION__])
1069 # $prefix stores the value of the --prefix command line option, or
1070 # NONE if the option wasn't set. In the case that it wasn't set, make
1071 # it be the default, so that we can use it to expand directories now.
1072 if test "x$prefix" = "xNONE"; then
1073 prefix=$ac_default_prefix
1076 # and similarly for $exec_prefix
1077 if test "x$exec_prefix" = "xNONE"; then
1081 if test "x$BUILDDIR" = "x"; then
1085 AH_TEMPLATE([BUILDDIR],[tor's build directory])
1086 AC_DEFINE_UNQUOTED(BUILDDIR,"$BUILDDIR")
1088 if test "x$CONFDIR" = "x"; then
1089 CONFDIR=`eval echo $sysconfdir/tor`
1092 AH_TEMPLATE([CONFDIR],[tor's configuration directory])
1093 AC_DEFINE_UNQUOTED(CONFDIR,"$CONFDIR")
1095 BINDIR=`eval echo $bindir`
1097 LOCALSTATEDIR=`eval echo $localstatedir`
1098 AC_SUBST(LOCALSTATEDIR)
1100 if test "$bwin32" = true; then
1101 # Test if the linker supports the --nxcompat and --dynamicbase options
1103 save_LDFLAGS="$LDFLAGS"
1104 LDFLAGS="-Wl,--nxcompat -Wl,--dynamicbase"
1105 AC_MSG_CHECKING([whether the linker supports DllCharacteristics])
1106 AC_LINK_IFELSE([AC_LANG_PROGRAM([])],
1107 [AC_MSG_RESULT([yes])]
1108 [save_LDFLAGS="$save_LDFLAGS $LDFLAGS"],
1109 [AC_MSG_RESULT([no])]
1111 LDFLAGS="$save_LDFLAGS"
1114 # Set CFLAGS _after_ all the above checks, since our warnings are stricter
1115 # than autoconf's macros like.
1116 if test "$GCC" = yes; then
1117 # Disable GCC's strict aliasing checks. They are an hours-to-debug
1118 # accident waiting to happen.
1119 CFLAGS="$CFLAGS -Wall -fno-strict-aliasing"
1121 # Autoconf sets -g -O2 by default. Override optimization level
1122 # for non-gcc compilers
1124 enable_gcc_warnings=no
1125 enable_gcc_warnings_advisory=no
1128 # OS X Lion started deprecating the system openssl. Let's just disable
1129 # all deprecation warnings on OS X.
1133 CFLAGS="$CFLAGS -Wno-deprecated-declarations"
1137 # Add some more warnings which we use in development but not in the
1138 # released versions. (Some relevant gcc versions can't handle these.)
1139 if test x$enable_gcc_warnings = xyes || test x$enable_gcc_warnings_advisory = xyes; then
1141 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1142 #if !defined(__GNUC__) || (__GNUC__ < 4)
1144 #endif])], have_gcc4=yes, have_gcc4=no)
1146 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1147 #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 2)
1149 #endif])], have_gcc42=yes, have_gcc42=no)
1151 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1152 #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 3)
1154 #endif])], have_gcc43=yes, have_gcc43=no)
1156 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1157 #if !defined(__clang__) || (__clang_major__ > 2) || (__clang_major__ == 2 && __clang_minor__ > 9)
1159 #endif])], have_clang29orlower=yes, have_clang29orlower=no)
1161 save_CFLAGS="$CFLAGS"
1162 CFLAGS="$CFLAGS -Wshorten-64-to-32"
1163 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], have_shorten64_flag=yes,
1164 have_shorten64_flag=no)
1165 CFLAGS="$save_CFLAGS"
1169 # Some OpenBSD versions (like 4.8) have -Wsystem-headers by default.
1170 # That's fine, except that the headers don't pass -Wredundant-decls.
1171 # Therefore, let's disable -Wsystem-headers when we're building
1172 # with maximal warnings on OpenBSD.
1173 CFLAGS="$CFLAGS -Wno-system-headers" ;;
1176 CFLAGS="$CFLAGS -W -Wfloat-equal -Wundef -Wpointer-arith"
1177 CFLAGS="$CFLAGS -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings"
1178 CFLAGS="$CFLAGS -Wredundant-decls -Wchar-subscripts -Wcomment -Wformat=2"
1179 CFLAGS="$CFLAGS -Wwrite-strings -Wmissing-declarations -Wredundant-decls"
1180 CFLAGS="$CFLAGS -Wnested-externs -Wbad-function-cast -Wswitch-enum"
1182 if test x$enable_gcc_warnings = xyes; then
1183 CFLAGS="$CFLAGS -Werror"
1186 # Disabled, so we can use mallinfo(): -Waggregate-return
1188 if test x$have_gcc4 = xyes ; then
1189 # These warnings break gcc 3.3.5 and work on gcc 4.0.2
1190 CFLAGS="$CFLAGS -Winit-self -Wmissing-field-initializers -Wdeclaration-after-statement -Wold-style-definition"
1193 if test x$have_gcc42 = xyes ; then
1194 # These warnings break gcc 4.0.2 and work on gcc 4.2
1195 # XXXX020 See if any of these work with earlier versions.
1196 CFLAGS="$CFLAGS -Waddress -Wmissing-noreturn -Wstrict-overflow=1"
1198 # We used to use -Wstrict-overflow=5, but that breaks us heavily under 4.3.
1201 if test x$have_gcc42 = xyes && test x$have_clang29orlower = xno; then
1202 # These warnings break gcc 4.0.2 and clang, but work on gcc 4.2
1203 # We only disable these for clang 2.9 and lower, in case they are
1204 # supported in later versions.
1205 CFLAGS="$CFLAGS -Wnormalized=id -Woverride-init"
1208 if test x$have_gcc43 = xyes ; then
1209 # These warnings break gcc 4.2 and work on gcc 4.3
1210 # XXXX020 See if any of these work with earlier versions.
1211 CFLAGS="$CFLAGS -Wextra -Warray-bounds"
1214 if test x$have_shorten64_flag = xyes ; then
1215 CFLAGS="$CFLAGS -Wshorten-64-to-32"
1218 ##This will break the world on some 64-bit architectures
1219 # CFLAGS="$CFLAGS -Winline"
1224 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent $TOR_CPPFLAGS_openssl $TOR_CPPFLAGS_zlib"
1230 contrib/suse/Makefile
1232 contrib/tor.logrotate
1240 src/config/torrc.sample
1244 src/tools/tor-fw-helper/Makefile
1251 if test -x /usr/bin/perl && test -x ./contrib/updateVersions.pl ; then
1252 ./contrib/updateVersions.pl