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.2-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])
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 # Some of the cargo-cults recommend -lwsock32 as well, but I don't
329 # think it's actually necessary.
335 AC_SUBST(TOR_LIB_WS32)
336 AC_SUBST(TOR_LIB_GDI)
338 dnl We need to do this before we try our disgusting hack below.
339 AC_CHECK_HEADERS([sys/types.h])
341 dnl This is a disgusting hack so we safely include older libevent headers.
342 AC_CHECK_TYPE(u_int64_t, unsigned long long)
343 AC_CHECK_TYPE(u_int32_t, unsigned long)
344 AC_CHECK_TYPE(u_int16_t, unsigned short)
345 AC_CHECK_TYPE(u_int8_t, unsigned char)
347 tor_libevent_pkg_redhat="libevent"
348 tor_libevent_pkg_debian="libevent-dev"
349 tor_libevent_devpkg_redhat="libevent-devel"
350 tor_libevent_devpkg_debian="libevent-dev"
352 dnl On Gnu/Linux or any place we require it, we'll add librt to the Libevent
353 dnl linking for static builds.
354 STATIC_LIBEVENT_FLAGS=""
355 if test "$enable_static_libevent" = "yes"; then
356 dnl Determine if we have clock_gettime in librt
357 AC_SEARCH_LIBS([clock_gettime], [rt],
359 if test "$have_rt" = yes; then
360 STATIC_LIBEVENT_FLAGS=" -lrt "
364 TOR_SEARCH_LIBRARY(libevent, $trylibeventdir, [-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32], [
366 #include <winsock2.h>
369 #include <sys/time.h>
370 #include <sys/types.h>
371 #include <event.h>], [
373 #include <winsock2.h>
375 void exit(int); void *event_init(void);],
378 {WSADATA d; WSAStartup(0x101,&d); }
380 event_init(); exit(0);
381 ], [--with-libevent-dir], [/opt/libevent])
383 dnl Now check for particular libevent functions.
385 save_LDFLAGS="$LDFLAGS"
386 save_CPPFLAGS="$CPPFLAGS"
387 LIBS="-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32 $LIBS"
388 LDFLAGS="$TOR_LDFLAGS_libevent $LDFLAGS"
389 CPPFLAGS="$TOR_CPPFLAGS_libevent $CPPFLAGS"
390 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)
391 AC_CHECK_MEMBERS([struct event.min_heap_idx], , ,
395 AC_CHECK_HEADERS(event2/event.h event2/dns.h event2/bufferevent_ssl.h)
398 LDFLAGS="$save_LDFLAGS"
399 CPPFLAGS="$save_CPPFLAGS"
402 AM_CONDITIONAL(USE_EXTERNAL_EVDNS, test x$ac_cv_header_event2_dns_h = xyes)
404 if test "$enable_static_libevent" = "yes"; then
405 if test "$tor_cv_library_libevent_dir" = "(system)"; then
406 AC_MSG_ERROR("You must specify an explicit --with-libevent-dir=x option when using --enable-static-libevent")
408 TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent.a $STATIC_LIBEVENT_FLAGS"
411 TOR_LIBEVENT_LIBS="-levent"
414 dnl This isn't the best test for Libevent 2.0.3-alpha. Once it's released,
415 dnl we can do much better.
416 if test "$enable_bufferevents" = "yes" ; then
417 if test "$ac_cv_header_event2_bufferevent_ssl_h" != "yes" ; then
418 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.])
421 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent"
423 # Check for the right version. First see if version detection works.
424 AC_MSG_CHECKING([whether we can detect the Libevent version])
425 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
426 #include <event2/event.h>
427 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 10
433 ])], [event_version_number_works=yes; AC_MSG_RESULT([yes]) ],
434 [event_version_number_works=no; AC_MSG_RESULT([no])])
435 if test "$event_version_number_works" != 'yes'; then
436 AC_MSG_WARN([Version detection on Libevent seems broken. Your Libevent installation is probably screwed up or very old.])
438 AC_MSG_CHECKING([whether Libevent is new enough for bufferevents])
439 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
440 #include <event2/event.h>
441 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 0x02000800
447 ])], [ AC_MSG_RESULT([yes]) ],
448 [ AC_MSG_RESULT([no])
449 AC_MSG_ERROR([Libevent does not seem new enough to support bufferevents. We require 2.0.8-rc or later]) ] )
455 LDFLAGS="$save_LDFLAGS"
456 CPPFLAGS="$save_CPPFLAGS"
458 AM_CONDITIONAL(USE_BUFFEREVENTS, test "$enable_bufferevents" = "yes")
459 if test "$enable_bufferevents" = "yes"; then
460 AC_DEFINE(USE_BUFFEREVENTS, 1, [Defined if we're going to use Libevent's buffered IO API])
461 if test "$enable_static_libevent" = "yes"; then
462 TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent_openssl.a $TOR_LIBEVENT_LIBS"
464 TOR_LIBEVENT_LIBS="-levent_openssl $TOR_LIBEVENT_LIBS"
467 AC_SUBST(TOR_LIBEVENT_LIBS)
469 dnl ------------------------------------------------------
470 dnl Where do you live, openssl? And how do we call you?
472 tor_openssl_pkg_redhat="openssl"
473 tor_openssl_pkg_debian="libssl"
474 tor_openssl_devpkg_redhat="openssl-devel"
475 tor_openssl_devpkg_debian="libssl-dev"
477 ALT_openssl_WITHVAL=""
479 [ --with-ssl-dir=PATH Obsolete alias for --with-openssl-dir ],
481 if test "x$withval" != xno && test "x$withval" != "x" ; then
482 ALT_openssl_WITHVAL="$withval"
486 TOR_SEARCH_LIBRARY(openssl, $tryssldir, [-lssl -lcrypto $TOR_LIB_GDI],
487 [#include <openssl/rand.h>],
488 [void RAND_add(const void *buf, int num, double entropy);],
489 [RAND_add((void*)0,0,0); exit(0);], [],
490 [/usr/local/openssl /usr/lib/openssl /usr/local/ssl /usr/lib/ssl /usr/local /usr/athena /opt/openssl])
492 dnl XXXX check for OPENSSL_VERSION_NUMBER == SSLeay()
494 echo "tor_cv_library_openssl_dir is $tor_cv_library_openssl_dir"
495 if test "$enable_static_openssl" = "yes"; then
496 if test "$tor_cv_library_openssl_dir" = "(system)"; then
497 AC_MSG_ERROR("You must specify an explicit --with-openssl-dir=x option when using --enable-static-openssl")
499 TOR_OPENSSL_LIBS="$TOR_LIBDIR_openssl/libssl.a $TOR_LIBDIR_openssl/libcrypto.a"
502 TOR_OPENSSL_LIBS="-lssl -lcrypto"
504 AC_SUBST(TOR_OPENSSL_LIBS)
506 dnl ------------------------------------------------------
507 dnl Where do you live, zlib? And how do we call you?
509 tor_zlib_pkg_redhat="zlib"
510 tor_zlib_pkg_debian="zlib1g"
511 tor_zlib_devpkg_redhat="zlib-devel"
512 tor_zlib_devpkg_debian="zlib1g-dev"
514 TOR_SEARCH_LIBRARY(zlib, $tryzlibdir, [-lz],
516 [const char * zlibVersion(void);],
517 [zlibVersion(); exit(0);], [--with-zlib-dir],
520 if test "$enable_static_zlib" = "yes"; then
521 if test "$tor_cv_library_zlib_dir" = "(system)"; then
522 AC_MSG_ERROR("You must specify an explicit --with-zlib-dir=x option when
523 using --enable-static-zlib")
525 TOR_ZLIB_LIBS="$TOR_LIBDIR_zlib/libz.a"
526 echo "$TOR_LIBDIR_zlib/libz.a"
531 AC_SUBST(TOR_ZLIB_LIBS)
533 dnl Make sure to enable support for large off_t if available.
536 dnl ------------------------------------------------------
537 dnl Where do you live, libnatpmp? And how do we call you?
538 dnl There are no packages for Debian or Redhat as of this patch
540 if test "$natpmp" = "true"; then
541 AC_DEFINE(NAT_PMP, 1, [Define to 1 if we are building with nat-pmp.])
542 TOR_SEARCH_LIBRARY(libnatpmp, $trylibnatpmpdir, [-lnatpmp],
543 [#include <natpmp.h>],
544 [#include <natpmp.h>],
547 natpmpresp_t response;
548 r = initnatpmp(&natpmp, 0, 0);],
549 [printf("initnatpmp() returned %d (%s)\n", r, r?"FAILED":"SUCCESS");
551 [--with-libnatpmp-dir],
556 dnl ------------------------------------------------------
557 dnl Where do you live, libminiupnpc? And how do we call you?
558 dnl There are no packages for Debian or Redhat as of this patch
560 if test "$upnp" = "true"; then
561 AC_DEFINE(MINIUPNPC, 1, [Define to 1 if we are building with UPnP.])
562 TOR_SEARCH_LIBRARY(libminiupnpc, $trylibminiupnpcdir, [-lminiupnpc],
563 [#include <miniupnpc/miniwget.h>
564 #include <miniupnpc/miniupnpc.h>
565 #include <miniupnpc/upnpcommands.h>],
566 [void upnpDiscover(int delay, const char * multicastif,
567 const char * minissdpdsock, int sameport);],
568 [upnpDiscover(1, 0, 0, 0); exit(0);],
569 [--with-libminiupnpc-dir],
587 , , 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.))
589 dnl These headers are not essential
624 TOR_CHECK_PROTOTYPE(malloc_good_size, HAVE_MALLOC_GOOD_SIZE_PROTOTYPE,
625 [#ifdef HAVE_MALLOC_H
628 #ifdef HAVE_MALLOC_MALLOC_H
629 #include <malloc/malloc.h>
632 AC_CHECK_HEADERS(net/if.h, net_if_found=1, net_if_found=0,
633 [#ifdef HAVE_SYS_TYPES_H
634 #include <sys/types.h>
636 #ifdef HAVE_SYS_SOCKET_H
637 #include <sys/socket.h>
639 AC_CHECK_HEADERS(net/pfvar.h, net_pfvar_found=1, net_pfvar_found=0,
640 [#ifdef HAVE_SYS_TYPES_H
641 #include <sys/types.h>
643 #ifdef HAVE_SYS_SOCKET_H
644 #include <sys/socket.h>
649 AC_CHECK_HEADERS(linux/netfilter_ipv4.h,
650 linux_netfilter_ipv4=1, linux_netfilter_ipv4=0,
651 [#ifdef HAVE_SYS_TYPES_H
652 #include <sys/types.h>
654 #ifdef HAVE_SYS_SOCKET_H
655 #include <sys/socket.h>
660 #ifdef HAVE_LINUX_TYPES_H
661 #include <linux/types.h>
663 #ifdef HAVE_NETINET_IN6_H
664 #include <netinet/in6.h>
666 #ifdef HAVE_NETINET_IN_H
667 #include <netinet/in.h>
670 if test x$transparent = xtrue ; then
672 if test x$net_if_found = x1 && test x$net_pfvar_found = x1 ; then
675 if test x$linux_netfilter_ipv4 = x1 ; then
678 if test x$transparent_ok = x1 ; then
679 AC_DEFINE(USE_TRANSPARENT, 1, "Define to enable transparent proxy support")
682 AC_DEFINE(OPENBSD, 1, "Define to handle pf on OpenBSD properly") ;;
685 AC_MSG_NOTICE([Transparent proxy support enabled, but missing headers.])
689 AC_CHECK_MEMBERS([struct timeval.tv_sec], , ,
690 [#ifdef HAVE_SYS_TYPES_H
691 #include <sys/types.h>
693 #ifdef HAVE_SYS_TIME_H
694 #include <sys/time.h>
697 dnl In case we aren't given a working stdint.h, we'll need to grow our own.
700 AC_CHECK_SIZEOF(int8_t)
701 AC_CHECK_SIZEOF(int16_t)
702 AC_CHECK_SIZEOF(int32_t)
703 AC_CHECK_SIZEOF(int64_t)
704 AC_CHECK_SIZEOF(uint8_t)
705 AC_CHECK_SIZEOF(uint16_t)
706 AC_CHECK_SIZEOF(uint32_t)
707 AC_CHECK_SIZEOF(uint64_t)
708 AC_CHECK_SIZEOF(intptr_t)
709 AC_CHECK_SIZEOF(uintptr_t)
711 dnl AC_CHECK_TYPES([int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t, uint64_t, intptr_t, uintptr_t])
713 AC_CHECK_SIZEOF(char)
714 AC_CHECK_SIZEOF(short)
716 AC_CHECK_SIZEOF(long)
717 AC_CHECK_SIZEOF(long long)
718 AC_CHECK_SIZEOF(__int64)
719 AC_CHECK_SIZEOF(void *)
720 AC_CHECK_SIZEOF(time_t)
721 AC_CHECK_SIZEOF(size_t)
723 AC_CHECK_TYPES([uint, u_char, ssize_t])
725 dnl used to include sockaddr_storage, but everybody has that.
726 AC_CHECK_TYPES([struct in6_addr, struct sockaddr_in6, sa_family_t], , ,
727 [#ifdef HAVE_SYS_TYPES_H
728 #include <sys/types.h>
730 #ifdef HAVE_NETINET_IN_H
731 #include <netinet/in.h>
733 #ifdef HAVE_NETINET_IN6_H
734 #include <netinet/in6.h>
736 #ifdef HAVE_SYS_SOCKET_H
737 #include <sys/socket.h>
740 #define WIN32_WINNT 0x400
741 #define _WIN32_WINNT 0x400
742 #define WIN32_LEAN_AND_MEAN
743 #if defined(_MSC_VER) && (_MSC_VER < 1300)
746 #include <winsock2.h>
747 #include <ws2tcpip.h>
751 AC_CHECK_MEMBERS([struct in6_addr.s6_addr32, struct in6_addr.s6_addr16, struct sockaddr_in.sin_len, struct sockaddr_in6.sin6_len], , ,
752 [#ifdef HAVE_SYS_TYPES_H
753 #include <sys/types.h>
755 #ifdef HAVE_NETINET_IN_H
756 #include <netinet/in.h>
758 #ifdef HAVE_NETINET_IN6_H
759 #include <netinet/in6.h>
761 #ifdef HAVE_SYS_SOCKET_H
762 #include <sys/socket.h>
765 #define WIN32_WINNT 0x400
766 #define _WIN32_WINNT 0x400
767 #define WIN32_LEAN_AND_MEAN
768 #if defined(_MSC_VER) && (_MSC_VER < 1300)
771 #include <winsock2.h>
772 #include <ws2tcpip.h>
777 AC_CHECK_TYPES([rlim_t], , ,
778 [#ifdef HAVE_SYS_TYPES_H
779 #include <sys/types.h>
781 #ifdef HAVE_SYS_TIME_H
782 #include <sys/time.h>
784 #ifdef HAVE_SYS_RESOURCE_H
785 #include <sys/resource.h>
789 AC_CACHE_CHECK([whether time_t is signed], tor_cv_time_t_signed, [
790 AC_RUN_IFELSE([AC_LANG_SOURCE([
791 #ifdef HAVE_SYS_TYPES_H
792 #include <sys/types.h>
794 #ifdef HAVE_SYS_TIME_H
795 #include <sys/time.h>
800 int main(int c, char**v) { if (((time_t)-1)<0) return 1; else return 0; }])],
801 tor_cv_time_t_signed=no, tor_cv_time_t_signed=yes, tor_cv_time_t_signed=cross)
804 if test "$tor_cv_time_t_signed" = cross; then
805 AC_MSG_NOTICE([Cross compiling: assuming that time_t is signed.])
808 if test "$tor_cv_time_t_signed" != no; then
809 AC_DEFINE([TIME_T_IS_SIGNED], 1,
810 [Define to 1 iff time_t is signed])
813 AC_CACHE_CHECK([whether size_t is signed], tor_cv_size_t_signed, [
814 AC_RUN_IFELSE([AC_LANG_SOURCE([
815 #ifdef HAVE_SYS_TYPES_H
816 #include <sys/types.h>
818 int main(int c, char**v) { if (((size_t)-1)<0) return 1; else return 0; }])],
819 tor_cv_size_t_signed=no, tor_cv_size_t_signed=yes, tor_cv_size_t_signed=cross)
822 if test "$tor_cv_size_t_signed" = cross; then
823 AC_MSG_NOTICE([Cross compiling: assuming that size_t is not signed.])
826 if test "$tor_cv_size_t_signed" = yes; then
827 AC_MSG_ERROR([You have a signed size_t; that's grossly nonconformant.])
830 AC_CHECK_SIZEOF(socklen_t, , [AC_INCLUDES_DEFAULT()
831 #ifdef HAVE_SYS_SOCKET_H
832 #include <sys/socket.h>
836 # We want to make sure that we _don't_ have a cell_t defined, like IRIX does.
838 AC_CHECK_SIZEOF(cell_t)
840 # Now make sure that NULL can be represented as zero bytes.
841 AC_CACHE_CHECK([whether memset(0) sets pointers to NULL], tor_cv_null_is_zero,
842 [AC_RUN_IFELSE([AC_LANG_SOURCE(
843 [[#include <stdlib.h>
849 int main () { char *p1,*p2; p1=NULL; memset(&p2,0,sizeof(p2));
850 return memcmp(&p1,&p2,sizeof(char*))?1:0; }]])],
851 [tor_cv_null_is_zero=yes],
852 [tor_cv_null_is_zero=no],
853 [tor_cv_null_is_zero=cross])])
855 if test "$tor_cv_null_is_zero" = cross ; then
856 # Cross-compiling; let's hope that the target isn't raving mad.
857 AC_MSG_NOTICE([Cross-compiling: we'll assume that NULL is represented as a sequence of 0-valued bytes.])
860 if test "$tor_cv_null_is_zero" != no; then
861 AC_DEFINE([NULL_REP_IS_ZERO_BYTES], 1,
862 [Define to 1 iff memset(0) sets pointers to NULL])
865 # And what happens when we malloc zero?
866 AC_CACHE_CHECK([whether we can malloc(0) safely.], tor_cv_malloc_zero_works,
867 [AC_RUN_IFELSE([AC_LANG_SOURCE(
868 [[#include <stdlib.h>
874 int main () { return malloc(0)?0:1; }]])],
875 [tor_cv_malloc_zero_works=yes],
876 [tor_cv_malloc_zero_works=no],
877 [tor_cv_malloc_zero_works=cross])])
879 if test "$tor_cv_malloc_zero_works" = cross; then
880 # Cross-compiling; let's hope that the target isn't raving mad.
881 AC_MSG_NOTICE([Cross-compiling: we'll assume that we need to check malloc() arguments for 0.])
884 if test "$tor_cv_malloc_zero_works" = yes; then
885 AC_DEFINE([MALLOC_ZERO_WORKS], 1,
886 [Define to 1 iff malloc(0) returns a pointer])
889 # whether we seem to be in a 2s-complement world.
890 AC_CACHE_CHECK([whether we are using 2s-complement arithmetic], tor_cv_twos_complement,
891 [AC_RUN_IFELSE([AC_LANG_SOURCE(
892 [[int main () { int problem = ((-99) != (~99)+1);
893 return problem ? 1 : 0; }]])],
894 [tor_cv_twos_complement=yes],
895 [tor_cv_twos_complement=no],
896 [tor_cv_twos_complement=cross])])
898 if test "$tor_cv_twos_complement" = cross ; then
899 # Cross-compiling; let's hope that the target isn't raving mad.
900 AC_MSG_NOTICE([Cross-compiling: we'll assume that negative integers are represented with two's complement.])
903 if test "$tor_cv_twos_complement" != no ; then
904 AC_DEFINE([USING_TWOS_COMPLEMENT], 1,
905 [Define to 1 iff we represent negative integers with two's complement])
908 # What does shifting a negative value do?
909 AC_CACHE_CHECK([whether right-shift on negative values does sign-extension], tor_cv_sign_extend,
910 [AC_RUN_IFELSE([AC_LANG_SOURCE(
911 [[int main () { int okay = (-60 >> 8) == -1; return okay ? 0 : 1; }]])],
912 [tor_cv_sign_extend=yes],
913 [tor_cv_sign_extend=no],
914 [tor_cv_sign_extend=cross])])
916 if test "$tor_cv_sign_extend" = cross ; then
917 # Cross-compiling; let's hope that the target isn't raving mad.
918 AC_MSG_NOTICE([Cross-compiling: we'll assume that right-shifting negative integers causes sign-extension])
921 if test "$tor_cv_sign_extend" != no ; then
922 AC_DEFINE([RSHIFT_DOES_SIGN_EXTEND], 1,
923 [Define to 1 iff right-shifting a negative value performs sign-extension])
926 # Whether we should use the dmalloc memory allocation debugging library.
927 AC_MSG_CHECKING(whether to use dmalloc (debug memory allocation library))
929 [ --with-dmalloc Use debug memory allocation library. ],
930 [if [[ "$withval" = "yes" ]]; then
936 fi], [ dmalloc=0; AC_MSG_RESULT(no) ]
939 if [[ $dmalloc -eq 1 ]]; then
940 AC_CHECK_HEADERS(dmalloc.h, , AC_MSG_ERROR(dmalloc header file not found. Do you have the development files for dmalloc installed?))
941 AC_SEARCH_LIBS(dmalloc_malloc, [dmallocth dmalloc], , AC_MSG_ERROR(Libdmalloc library not found. If you enable it you better have it installed.))
942 AC_DEFINE(USE_DMALLOC, 1, [Debug memory allocation library])
943 AC_DEFINE(DMALLOC_FUNC_CHECK, 1, [Enable dmalloc's malloc function check])
944 AC_CHECK_FUNCS(dmalloc_strdup dmalloc_strndup)
947 AC_ARG_WITH(tcmalloc,
948 [ --with-tcmalloc Use tcmalloc memory allocation library. ],
949 [ tcmalloc=yes ], [ tcmalloc=no ])
951 if test x$tcmalloc = xyes ; then
952 LDFLAGS="-ltcmalloc $LDFLAGS"
955 # By default, we're going to assume we don't have mlockall()
956 # bionic and other platforms have various broken mlockall subsystems.
957 # Some systems don't have a working mlockall, some aren't linkable,
958 # and some have it but don't declare it.
959 AC_CHECK_FUNCS(mlockall)
960 AC_CHECK_DECLS([mlockall], , , [
961 #ifdef HAVE_SYS_MMAN_H
962 #include <sys/mman.h>
965 # Allow user to specify an alternate syslog facility
966 AC_ARG_WITH(syslog-facility,
967 [ --with-syslog-facility=LOG syslog facility to use (default=LOG_DAEMON)],
968 syslog_facility="$withval", syslog_facility="LOG_DAEMON")
969 AC_DEFINE_UNQUOTED(LOGFACILITY,$syslog_facility,[name of the syslog facility])
970 AC_SUBST(LOGFACILITY)
972 # Check if we have getresuid and getresgid
973 AC_CHECK_FUNCS(getresuid getresgid)
975 # Check for gethostbyname_r in all its glorious incompatible versions.
976 # (This logic is based on that in Python's configure.in)
977 AH_TEMPLATE(HAVE_GETHOSTBYNAME_R,
978 [Define this if you have any gethostbyname_r()])
980 AC_CHECK_FUNC(gethostbyname_r, [
981 AC_MSG_CHECKING([how many arguments gethostbyname_r() wants])
983 CFLAGS="$CFLAGS $MY_CPPFLAGS $MY_THREAD_CPPFLAGS $MY_CFLAGS"
984 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
988 struct hostent *h1, *h2;
990 (void)gethostbyname_r(cp1,h1,cp2,i1,&h2,&i2);
992 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
993 AC_DEFINE(HAVE_GETHOSTBYNAME_R_6_ARG, 1,
994 [Define this if gethostbyname_r takes 6 arguments])
1003 (void)gethostbyname_r(cp1,h1,cp2,i1,&i2);
1005 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1006 AC_DEFINE(HAVE_GETHOSTBYNAME_R_5_ARG, 1,
1007 [Define this if gethostbyname_r takes 5 arguments])
1015 struct hostent_data hd;
1016 (void) gethostbyname_r(cp1,h1,&hd);
1018 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1019 AC_DEFINE(HAVE_GETHOSTBYNAME_R_3_ARG, 1,
1020 [Define this if gethostbyname_r takes 3 arguments])
1030 AC_CACHE_CHECK([whether the C compiler supports __func__],
1031 tor_cv_have_func_macro,
1032 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1034 int main(int c, char **v) { puts(__func__); }])],
1035 tor_cv_have_func_macro=yes,
1036 tor_cv_have_func_macro=no))
1038 AC_CACHE_CHECK([whether the C compiler supports __FUNC__],
1039 tor_cv_have_FUNC_macro,
1040 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1042 int main(int c, char **v) { puts(__FUNC__); }])],
1043 tor_cv_have_FUNC_macro=yes,
1044 tor_cv_have_FUNC_macro=no))
1046 AC_CACHE_CHECK([whether the C compiler supports __FUNCTION__],
1047 tor_cv_have_FUNCTION_macro,
1048 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1050 int main(int c, char **v) { puts(__FUNCTION__); }])],
1051 tor_cv_have_FUNCTION_macro=yes,
1052 tor_cv_have_FUNCTION_macro=no))
1054 if test "$tor_cv_have_func_macro" = 'yes'; then
1055 AC_DEFINE(HAVE_MACRO__func__, 1, [Defined if the compiler supports __func__])
1058 if test "$tor_cv_have_FUNC_macro" = 'yes'; then
1059 AC_DEFINE(HAVE_MACRO__FUNC__, 1, [Defined if the compiler supports __FUNC__])
1062 if test "$tor_cv_have_FUNCTION_macro" = 'yes'; then
1063 AC_DEFINE(HAVE_MACRO__FUNCTION__, 1,
1064 [Defined if the compiler supports __FUNCTION__])
1067 # $prefix stores the value of the --prefix command line option, or
1068 # NONE if the option wasn't set. In the case that it wasn't set, make
1069 # it be the default, so that we can use it to expand directories now.
1070 if test "x$prefix" = "xNONE"; then
1071 prefix=$ac_default_prefix
1074 # and similarly for $exec_prefix
1075 if test "x$exec_prefix" = "xNONE"; then
1079 if test "x$BUILDDIR" = "x"; then
1083 AH_TEMPLATE([BUILDDIR],[tor's build directory])
1084 AC_DEFINE_UNQUOTED(BUILDDIR,"$BUILDDIR")
1086 if test "x$CONFDIR" = "x"; then
1087 CONFDIR=`eval echo $sysconfdir/tor`
1090 AH_TEMPLATE([CONFDIR],[tor's configuration directory])
1091 AC_DEFINE_UNQUOTED(CONFDIR,"$CONFDIR")
1093 BINDIR=`eval echo $bindir`
1095 LOCALSTATEDIR=`eval echo $localstatedir`
1096 AC_SUBST(LOCALSTATEDIR)
1098 if test "$bwin32" = true; then
1099 # Test if the linker supports the --nxcompat and --dynamicbase options
1101 save_LDFLAGS="$LDFLAGS"
1102 LDFLAGS="-Wl,--nxcompat -Wl,--dynamicbase"
1103 AC_MSG_CHECKING([whether the linker supports DllCharacteristics])
1104 AC_LINK_IFELSE([AC_LANG_PROGRAM([])],
1105 [AC_MSG_RESULT([yes])]
1106 [save_LDFLAGS="$save_LDFLAGS $LDFLAGS"],
1107 [AC_MSG_RESULT([no])]
1109 LDFLAGS="$save_LDFLAGS"
1112 # Set CFLAGS _after_ all the above checks, since our warnings are stricter
1113 # than autoconf's macros like.
1114 if test "$GCC" = yes; then
1115 # Disable GCC's strict aliasing checks. They are an hours-to-debug
1116 # accident waiting to happen.
1117 CFLAGS="$CFLAGS -Wall -fno-strict-aliasing"
1119 # Autoconf sets -g -O2 by default. Override optimization level
1120 # for non-gcc compilers
1122 enable_gcc_warnings=no
1123 enable_gcc_warnings_advisory=no
1126 # Add some more warnings which we use in development but not in the
1127 # released versions. (Some relevant gcc versions can't handle these.)
1128 if test x$enable_gcc_warnings = xyes || test x$enable_gcc_warnings_advisory = xyes; then
1130 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1131 #if !defined(__GNUC__) || (__GNUC__ < 4)
1133 #endif])], have_gcc4=yes, have_gcc4=no)
1135 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1136 #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 2)
1138 #endif])], have_gcc42=yes, have_gcc42=no)
1140 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1141 #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 3)
1143 #endif])], have_gcc43=yes, have_gcc43=no)
1145 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1146 #if !defined(__clang__) || (__clang_major__ > 2) || (__clang_major__ == 2 && __clang_minor__ > 9)
1148 #endif])], have_clang29orlower=yes, have_clang29orlower=no)
1150 save_CFLAGS="$CFLAGS"
1151 CFLAGS="$CFLAGS -Wshorten-64-to-32"
1152 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], have_shorten64_flag=yes,
1153 have_shorten64_flag=no)
1154 CFLAGS="$save_CFLAGS"
1158 # Some OpenBSD versions (like 4.8) have -Wsystem-headers by default.
1159 # That's fine, except that the headers don't pass -Wredundant-decls.
1160 # Therefore, let's disable -Wsystem-headers when we're building
1161 # with maximal warnings on OpenBSD.
1162 CFLAGS="$CFLAGS -Wno-system-headers" ;;
1165 CFLAGS="$CFLAGS -W -Wfloat-equal -Wundef -Wpointer-arith"
1166 CFLAGS="$CFLAGS -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings"
1167 CFLAGS="$CFLAGS -Wredundant-decls -Wchar-subscripts -Wcomment -Wformat=2"
1168 CFLAGS="$CFLAGS -Wwrite-strings -Wmissing-declarations -Wredundant-decls"
1169 CFLAGS="$CFLAGS -Wnested-externs -Wbad-function-cast -Wswitch-enum"
1171 if test x$enable_gcc_warnings = xyes; then
1172 CFLAGS="$CFLAGS -Werror"
1175 # Disabled, so we can use mallinfo(): -Waggregate-return
1177 if test x$have_gcc4 = xyes ; then
1178 # These warnings break gcc 3.3.5 and work on gcc 4.0.2
1179 CFLAGS="$CFLAGS -Winit-self -Wmissing-field-initializers -Wdeclaration-after-statement -Wold-style-definition"
1182 if test x$have_gcc42 = xyes ; then
1183 # These warnings break gcc 4.0.2 and work on gcc 4.2
1184 # XXXX020 See if any of these work with earlier versions.
1185 CFLAGS="$CFLAGS -Waddress -Wmissing-noreturn -Wstrict-overflow=1"
1187 # We used to use -Wstrict-overflow=5, but that breaks us heavily under 4.3.
1190 if test x$have_gcc42 = xyes && test x$have_clang29orlower = xno; then
1191 # These warnings break gcc 4.0.2 and clang, but work on gcc 4.2
1192 # We only disable these for clang 2.9 and lower, in case they are
1193 # supported in later versions.
1194 CFLAGS="$CFLAGS -Wnormalized=id -Woverride-init"
1197 if test x$have_gcc43 = xyes ; then
1198 # These warnings break gcc 4.2 and work on gcc 4.3
1199 # XXXX020 See if any of these work with earlier versions.
1200 CFLAGS="$CFLAGS -Wextra -Warray-bounds"
1203 if test x$have_shorten64_flag = xyes ; then
1204 CFLAGS="$CFLAGS -Wshorten-64-to-32"
1207 ##This will break the world on some 64-bit architectures
1208 # CFLAGS="$CFLAGS -Winline"
1213 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent $TOR_CPPFLAGS_openssl $TOR_CPPFLAGS_zlib"
1219 contrib/suse/Makefile
1221 contrib/tor.logrotate
1229 src/config/torrc.sample
1233 src/tools/tor-fw-helper/Makefile
1240 if test -x /usr/bin/perl && test -x ./contrib/updateVersions.pl ; then
1241 ./contrib/updateVersions.pl