Document some transports.c behaviors and assumptions
[tor/neena.git] / configure.in
blobf4e0fea7042cf1f89297240fb9fb8f4497041290
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
6 AC_INIT
7 AM_INIT_AUTOMAKE(tor, 0.2.3.15-alpha-dev)
8 AM_CONFIG_HEADER(orconfig.h)
10 AC_CANONICAL_HOST
12 if test -f /etc/redhat-release ; then
13   if test -f /usr/kerberos/include ; then
14     CPPFLAGS="$CPPFLAGS -I/usr/kerberos/include"
15   fi
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
66         yes) asciidoc=true ;;
67         no)  asciidoc=false ;;
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
75         yes) natpmp=true ;;
76         no)  natpmp=false ;;
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
81 AC_ARG_ENABLE(upnp,
82      AS_HELP_STRING(--enable-upnp, enable UPnP support),
83      [case "${enableval}" in
84         yes) upnp=true ;;
85         no)  upnp=false ;;
86         * ) AC_MSG_ERROR(bad value for --enable-upnp) ;;
87       esac], [upnp=false])
90 AC_ARG_ENABLE(threads,
91      AS_HELP_STRING(--disable-threads, disable multi-threading support))
93 if test x$enable_threads = x; then
94    case $host in
95     *-*-solaris* )
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.])
99      enable_threads="no";;
100     *)
101      enable_threads="yes";;
102    esac
105 if test "$enable_threads" = "yes"; then
106   AC_DEFINE(ENABLE_THREADS, 1, [Defined if we will try to use multithreading])
109 case $host in
110    *-*-solaris* )
111      AC_DEFINE(_REENTRANT, 1, [Define on some platforms to activate x_r() functions in time.h])
112      ;;
113 esac
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"
131 fi])
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"
139 fi])
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 # Tor2web mode flag
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"
153 fi])
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])])
162 AC_PROG_AR
164 AC_PROG_CC
165 AC_PROG_CPP
166 AC_PROG_MAKE_SET
167 AC_PROG_RANLIB
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)
181 AM_PROG_CC_C_O
183 ifdef([AC_C_FLEXIBLE_ARRAY_MEMBER], [
184 AC_C_FLEXIBLE_ARRAY_MEMBER
185 ], [
186  dnl Maybe we've got an old autoconf...
187  AC_CACHE_CHECK([for flexible array members],
188      tor_cv_c_flexarray,
189      [AC_COMPILE_IFELSE(
190        AC_LANG_PROGRAM([
191  struct abc { int a; char b[]; };
192 ], [
193  struct abc *def = malloc(sizeof(struct abc)+sizeof(char));
194  def->b[0] = 33;
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.])
200  else
201    AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [1], [Define to nothing if C supports flexible array members, and to 1 if it does not.])
202  fi
205 AC_PATH_PROG([SHA1SUM], [sha1sum], none)
206 AC_PATH_PROG([OPENSSL], [openssl], none)
208 TORUSER=_tor
209 AC_ARG_WITH(tor-user,
210         [  --with-tor-user=NAME    Specify username for tor daemon ],
211         [
212            TORUSER=$withval
213         ]
215 AC_SUBST(TORUSER)
217 TORGROUP=_tor
218 AC_ARG_WITH(tor-group,
219         [  --with-tor-group=NAME   Specify group name for tor daemon ],
220         [
221            TORGROUP=$withval
222         ]
224 AC_SUBST(TORGROUP)
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) {
231 #ifdef _WIN32
232 #if _WIN32
233   return 0;
234 #else
235   return 1;
236 #endif
237 #else
238   return 2;
239 #endif
240 }])],
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([
249 #ifdef _WIN32
250 int main(int c, char **v) {return 0;}
251 #else
252 #error
253 int main(int c, char **v) {return x(y);}
254 #endif
255 ])],
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))
266 #error
267   return x(y);
268 #endif
269 ])],
270 bmipspro=false; AC_MSG_RESULT(no),
271 bmipspro=true; AC_MSG_RESULT(yes))
273 if test "$bmipspro" = true; then
274   CFLAGS="$CFLAGS -c99"
277 AC_C_BIGENDIAN
279 AC_SEARCH_LIBS(socket, [socket network])
280 AC_SEARCH_LIBS(gethostbyname, [nsl])
281 AC_SEARCH_LIBS(dlopen, [dl])
282 AC_SEARCH_LIBS(inet_aton, [resolv])
283 saved_LIBS="$LIBS"
284 AC_SEARCH_LIBS([clock_gettime], [rt])
285 if test "$LIBS" != "$saved_LIBS"; then
286    # Looks like we need -lrt for clock_gettime().
287    have_rt=yes
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.
299 AC_CHECK_FUNCS(
300         _NSGetEnviron \
301         accept4 \
302         clock_gettime \
303         flock \
304         ftime \
305         getaddrinfo \
306         getifaddrs \
307         getrlimit \
308         gettimeofday \
309         gmtime_r \
310         inet_aton \
311         ioctl \
312         localtime_r \
313         lround \
314         memmem \
315         prctl \
316         rint \
317         socketpair \
318         strlcat \
319         strlcpy \
320         strptime \
321         strtok_r \
322         strtoull \
323         sysconf \
324         uname \
325         vasprintf \
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.
353   TOR_LIB_GDI=-lgdi32
354 else
355   TOR_LIB_WS32=
356   TOR_LIB_GDI=
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 "
382     fi
385 TOR_SEARCH_LIBRARY(libevent, $trylibeventdir, [-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32], [
386 #ifdef _WIN32
387 #include <winsock2.h>
388 #endif
389 #include <stdlib.h>
390 #include <sys/time.h>
391 #include <sys/types.h>
392 #include <event.h>], [
393 #ifdef _WIN32
394 #include <winsock2.h>
395 #endif
396 void exit(int); void *event_init(void);],
397     [
398 #ifdef _WIN32
399 {WSADATA d; WSAStartup(0x101,&d); }
400 #endif
401 event_init(); exit(0);
402 ], [--with-libevent-dir], [/opt/libevent])
404 dnl Now check for particular libevent functions.
405 save_LIBS="$LIBS"
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], , ,
413 [#include <event.h>
416 AC_CHECK_HEADERS(event2/event.h event2/dns.h event2/bufferevent_ssl.h)
418 LIBS="$save_LIBS"
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")
428    else
429      TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent.a $STATIC_LIBEVENT_FLAGS"
430    fi
431 else
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.])
440   else
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
449 #error
450 int x = y(zz);
451 #else
452 int x = 1;
453 #endif
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.])
458     else
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
463 #error
464 int x = y(zz);
465 #else
466 int x = 1;
467 #endif
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]) ] )
471     fi
472   fi
475 LIBS="$save_LIBS"
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"
484   else
485     TOR_LIBEVENT_LIBS="-levent_openssl $TOR_LIBEVENT_LIBS"
486   fi
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
495 TOR_LIB_MATH=""
496 save_LIBS="$LIBS"
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"
501 LIBS="$save_LIBS"
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=""
513 AC_ARG_WITH(ssl-dir,
514   [  --with-ssl-dir=PATH    Obsolete alias for --with-openssl-dir ],
515   [
516       if test "x$withval" != xno && test "x$withval" != "x" ; then
517          ALT_openssl_WITHVAL="$withval"
518       fi
519   ])
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 echo "tor_cv_library_openssl_dir is $tor_cv_library_openssl_dir"
530 if test "$enable_static_openssl" = "yes"; then
531    if test "$tor_cv_library_openssl_dir" = "(system)"; then
532      AC_MSG_ERROR("You must specify an explicit --with-openssl-dir=x option when using --enable-static-openssl")
533    else
534      TOR_OPENSSL_LIBS="$TOR_LIBDIR_openssl/libssl.a $TOR_LIBDIR_openssl/libcrypto.a"
535    fi
536 else
537      TOR_OPENSSL_LIBS="-lssl -lcrypto"
539 AC_SUBST(TOR_OPENSSL_LIBS)
541 dnl ------------------------------------------------------
542 dnl Where do you live, zlib?  And how do we call you?
544 tor_zlib_pkg_redhat="zlib"
545 tor_zlib_pkg_debian="zlib1g"
546 tor_zlib_devpkg_redhat="zlib-devel"
547 tor_zlib_devpkg_debian="zlib1g-dev"
549 TOR_SEARCH_LIBRARY(zlib, $tryzlibdir, [-lz],
550     [#include <zlib.h>],
551     [const char * zlibVersion(void);],
552     [zlibVersion(); exit(0);], [--with-zlib-dir],
553     [/opt/zlib])
555 if test "$enable_static_zlib" = "yes"; then
556    if test "$tor_cv_library_zlib_dir" = "(system)"; then
557      AC_MSG_ERROR("You must specify an explicit --with-zlib-dir=x option when
558  using --enable-static-zlib")
559    else
560      TOR_ZLIB_LIBS="$TOR_LIBDIR_zlib/libz.a"
561      echo "$TOR_LIBDIR_zlib/libz.a"
562    fi
563 else
564      TOR_ZLIB_LIBS="-lz"
566 AC_SUBST(TOR_ZLIB_LIBS)
568 dnl Make sure to enable support for large off_t if available.
571 dnl ------------------------------------------------------
572 dnl Where do you live, libnatpmp?  And how do we call you?
573 dnl There are no packages for Debian or Redhat as of this patch
575 if test "$natpmp" = "true"; then
576     AC_DEFINE(NAT_PMP, 1, [Define to 1 if we are building with nat-pmp.])
577     TOR_SEARCH_LIBRARY(libnatpmp, $trylibnatpmpdir, [-lnatpmp $TOR_LIB_WS32 $TOR_LIB_IPHLPAPI],
578         [#include <natpmp.h>],
579         [#ifdef _WIN32
580          #define STATICLIB
581          #endif
582          #include <natpmp.h>],
583         [   int r;
584             natpmp_t natpmp;
585             natpmpresp_t response;
586             r = initnatpmp(&natpmp, 0, 0);],
587             [printf("initnatpmp() returned %d (%s)\n", r, r?"FAILED":"SUCCESS");
588             exit(0);],
589         [--with-libnatpmp-dir],
590         [/usr/lib/])
594 dnl ------------------------------------------------------
595 dnl Where do you live, libminiupnpc?  And how do we call you?
596 dnl There are no packages for Debian or Redhat as of this patch
598 if test "$upnp" = "true"; then
599     AC_DEFINE(MINIUPNPC, 1, [Define to 1 if we are building with UPnP.])
601     dnl Before we call TOR_SEARCH_LIBRARY we'll do a quick compile test
602     dnl to see if we have miniupnpc-1.5 or -1.6
603     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include <miniupnpc/miniupnpc.h>],
604         [upnpDiscover(1, 0, 0, 0);exit(0);])],[miniupnpc15="true"],[miniupnpc15="false"])
606     if test "$miniupnpc15" = "true" ; then
607         AC_DEFINE([MINIUPNPC15],[1],[libminiupnpc version 1.5 found])
608         TOR_SEARCH_LIBRARY(libminiupnpc, $trylibminiupnpcdir, [-lminiupnpc $TOR_LIB_WS32 $TOR_LIB_IPHLPAPI],
609             [#include <miniupnpc/miniwget.h>
610              #include <miniupnpc/miniupnpc.h>
611              #include <miniupnpc/upnpcommands.h>],
612             [void upnpDiscover(int delay, const char * multicastif,
613              const char * minissdpdsock, int sameport);],
614             [upnpDiscover(1, 0, 0, 0); exit(0);],
615             [--with-libminiupnpc-dir],
616             [/usr/lib/])
617     else
618         TOR_SEARCH_LIBRARY(libminiupnpc, $trylibminiupnpcdir, [-lminiupnpc $TOR_LIB_WS32 $TOR_LIB_IPHLPAPI],
619             [#include <miniupnpc/miniwget.h>
620              #include <miniupnpc/miniupnpc.h>
621              #include <miniupnpc/upnpcommands.h>],
622             [void upnpDiscover(int delay, const char * multicastif,
623              const char * minissdpdsock, int sameport, int ipv6, int * error);],
624             [upnpDiscover(1, 0, 0, 0, 0, 0); exit(0);],
625             [--with-libminiupnpc-dir],
626             [/usr/lib/])
627     fi
630 AC_SYS_LARGEFILE
632 AC_CHECK_HEADERS(
633         assert.h \
634         errno.h \
635         fcntl.h \
636         signal.h \
637         string.h \
638         sys/fcntl.h \
639         sys/stat.h \
640         sys/time.h \
641         sys/types.h \
642         time.h \
643         unistd.h
644  , , 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.))
646 dnl These headers are not essential
648 AC_CHECK_HEADERS(
649         arpa/inet.h \
650         crt_externs.h \
651         grp.h \
652         ifaddrs.h \
653         inttypes.h \
654         limits.h \
655         linux/types.h \
656         machine/limits.h \
657         malloc.h \
658         malloc/malloc.h \
659         malloc_np.h \
660         netdb.h \
661         netinet/in.h \
662         netinet/in6.h \
663         pwd.h \
664         stdint.h \
665         sys/file.h \
666         sys/ioctl.h \
667         sys/limits.h \
668         sys/mman.h \
669         sys/param.h \
670         sys/prctl.h \
671         sys/resource.h \
672         sys/socket.h \
673         sys/syslimits.h \
674         sys/time.h \
675         sys/types.h \
676         sys/un.h \
677         sys/utime.h \
678         sys/wait.h \
679         syslog.h \
680         utime.h
683 TOR_CHECK_PROTOTYPE(malloc_good_size, HAVE_MALLOC_GOOD_SIZE_PROTOTYPE,
684 [#ifdef HAVE_MALLOC_H
685 #include <malloc.h>
686 #endif
687 #ifdef HAVE_MALLOC_MALLOC_H
688 #include <malloc/malloc.h>
689 #endif])
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>
694 #endif
695 #ifdef HAVE_SYS_SOCKET_H
696 #include <sys/socket.h>
697 #endif])
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>
701 #endif
702 #ifdef HAVE_SYS_SOCKET_H
703 #include <sys/socket.h>
704 #endif
705 #ifdef HAVE_NET_IF_H
706 #include <net/if.h>
707 #endif])
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>
712 #endif
713 #ifdef HAVE_SYS_SOCKET_H
714 #include <sys/socket.h>
715 #endif
716 #ifdef HAVE_LIMITS_H
717 #include <limits.h>
718 #endif
719 #ifdef HAVE_LINUX_TYPES_H
720 #include <linux/types.h>
721 #endif
722 #ifdef HAVE_NETINET_IN6_H
723 #include <netinet/in6.h>
724 #endif
725 #ifdef HAVE_NETINET_IN_H
726 #include <netinet/in.h>
727 #endif])
729 if test x$transparent = xtrue ; then
730    transparent_ok=0
731    if test x$net_if_found = x1 && test x$net_pfvar_found = x1 ; then
732      transparent_ok=1
733    fi
734    if test x$linux_netfilter_ipv4 = x1 ; then
735      transparent_ok=1
736    fi
737    if test x$transparent_ok = x1 ; then
738      AC_DEFINE(USE_TRANSPARENT, 1, "Define to enable transparent proxy support")
739      case $host in
740        *-*-openbsd*)
741          AC_DEFINE(OPENBSD, 1, "Define to handle pf on OpenBSD properly") ;;
742      esac
743    else
744      AC_MSG_NOTICE([Transparent proxy support enabled, but missing headers.])
745    fi
748 AC_CHECK_MEMBERS([struct timeval.tv_sec], , ,
749 [#ifdef HAVE_SYS_TYPES_H
750 #include <sys/types.h>
751 #endif
752 #ifdef HAVE_SYS_TIME_H
753 #include <sys/time.h>
754 #endif])
756 dnl In case we aren't given a working stdint.h, we'll need to grow our own.
757 dnl Watch out.
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)
774 AC_CHECK_SIZEOF(int)
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>
788 #endif
789 #ifdef HAVE_NETINET_IN_H
790 #include <netinet/in.h>
791 #endif
792 #ifdef HAVE_NETINET_IN6_H
793 #include <netinet/in6.h>
794 #endif
795 #ifdef HAVE_SYS_SOCKET_H
796 #include <sys/socket.h>
797 #endif
798 #ifdef _WIN32
799 #define WIN32_WINNT 0x400
800 #define _WIN32_WINNT 0x400
801 #define WIN32_LEAN_AND_MEAN
802 #if defined(_MSC_VER) && (_MSC_VER < 1300)
803 #include <winsock.h>
804 #else
805 #include <winsock2.h>
806 #include <ws2tcpip.h>
807 #endif
808 #endif
810 AC_CHECK_MEMBERS([struct in6_addr.s6_addr32, struct in6_addr.s6_addr16, struct sockaddr_in.sin_len, struct sockaddr_in6.sin6_len], , ,
811 [#ifdef HAVE_SYS_TYPES_H
812 #include <sys/types.h>
813 #endif
814 #ifdef HAVE_NETINET_IN_H
815 #include <netinet/in.h>
816 #endif
817 #ifdef HAVE_NETINET_IN6_H
818 #include <netinet/in6.h>
819 #endif
820 #ifdef HAVE_SYS_SOCKET_H
821 #include <sys/socket.h>
822 #endif
823 #ifdef _WIN32
824 #define WIN32_WINNT 0x400
825 #define _WIN32_WINNT 0x400
826 #define WIN32_LEAN_AND_MEAN
827 #if defined(_MSC_VER) && (_MSC_VER < 1300)
828 #include <winsock.h>
829 #else
830 #include <winsock2.h>
831 #include <ws2tcpip.h>
832 #endif
833 #endif
836 AC_CHECK_TYPES([rlim_t], , ,
837 [#ifdef HAVE_SYS_TYPES_H
838 #include <sys/types.h>
839 #endif
840 #ifdef HAVE_SYS_TIME_H
841 #include <sys/time.h>
842 #endif
843 #ifdef HAVE_SYS_RESOURCE_H
844 #include <sys/resource.h>
845 #endif
848 AC_CACHE_CHECK([whether time_t is signed], tor_cv_time_t_signed, [
849 AC_RUN_IFELSE([AC_LANG_SOURCE([
850 #ifdef HAVE_SYS_TYPES_H
851 #include <sys/types.h>
852 #endif
853 #ifdef HAVE_SYS_TIME_H
854 #include <sys/time.h>
855 #endif
856 #ifdef HAVE_TIME_H
857 #include <time.h>
858 #endif
859 int main(int c, char**v) { if (((time_t)-1)<0) return 1; else return 0; }])],
860   tor_cv_time_t_signed=no, tor_cv_time_t_signed=yes, tor_cv_time_t_signed=cross)
863 if test "$tor_cv_time_t_signed" = cross; then
864   AC_MSG_NOTICE([Cross compiling: assuming that time_t is signed.])
867 if test "$tor_cv_time_t_signed" != no; then
868   AC_DEFINE([TIME_T_IS_SIGNED], 1,
869             [Define to 1 iff time_t is signed])
872 AC_CACHE_CHECK([whether size_t is signed], tor_cv_size_t_signed, [
873 AC_RUN_IFELSE([AC_LANG_SOURCE([
874 #ifdef HAVE_SYS_TYPES_H
875 #include <sys/types.h>
876 #endif
877 int main(int c, char**v) { if (((size_t)-1)<0) return 1; else return 0; }])],
878   tor_cv_size_t_signed=no, tor_cv_size_t_signed=yes, tor_cv_size_t_signed=cross)
881 if test "$tor_cv_size_t_signed" = cross; then
882   AC_MSG_NOTICE([Cross compiling: assuming that size_t is not signed.])
885 if test "$tor_cv_size_t_signed" = yes; then
886   AC_MSG_ERROR([You have a signed size_t; that's grossly nonconformant.])
889 AC_CHECK_SIZEOF(socklen_t, , [AC_INCLUDES_DEFAULT()
890 #ifdef HAVE_SYS_SOCKET_H
891 #include <sys/socket.h>
892 #endif
895 # We want to make sure that we _don't_ have a cell_t defined, like IRIX does.
897 AC_CHECK_SIZEOF(cell_t)
899 # Now make sure that NULL can be represented as zero bytes.
900 AC_CACHE_CHECK([whether memset(0) sets pointers to NULL], tor_cv_null_is_zero,
901 [AC_RUN_IFELSE([AC_LANG_SOURCE(
902 [[#include <stdlib.h>
903 #include <string.h>
904 #include <stdio.h>
905 #ifdef HAVE_STDDEF_H
906 #include <stddef.h>
907 #endif
908 int main () { char *p1,*p2; p1=NULL; memset(&p2,0,sizeof(p2));
909 return memcmp(&p1,&p2,sizeof(char*))?1:0; }]])],
910        [tor_cv_null_is_zero=yes],
911        [tor_cv_null_is_zero=no],
912        [tor_cv_null_is_zero=cross])])
914 if test "$tor_cv_null_is_zero" = cross ; then
915   # Cross-compiling; let's hope that the target isn't raving mad.
916   AC_MSG_NOTICE([Cross-compiling: we'll assume that NULL is represented as a sequence of 0-valued bytes.])
919 if test "$tor_cv_null_is_zero" != no; then
920   AC_DEFINE([NULL_REP_IS_ZERO_BYTES], 1,
921             [Define to 1 iff memset(0) sets pointers to NULL])
924 # And what happens when we malloc zero?
925 AC_CACHE_CHECK([whether we can malloc(0) safely.], tor_cv_malloc_zero_works,
926 [AC_RUN_IFELSE([AC_LANG_SOURCE(
927 [[#include <stdlib.h>
928 #include <string.h>
929 #include <stdio.h>
930 #ifdef HAVE_STDDEF_H
931 #include <stddef.h>
932 #endif
933 int main () { return malloc(0)?0:1; }]])],
934        [tor_cv_malloc_zero_works=yes],
935        [tor_cv_malloc_zero_works=no],
936        [tor_cv_malloc_zero_works=cross])])
938 if test "$tor_cv_malloc_zero_works" = cross; then
939   # Cross-compiling; let's hope that the target isn't raving mad.
940   AC_MSG_NOTICE([Cross-compiling: we'll assume that we need to check malloc() arguments for 0.])
943 if test "$tor_cv_malloc_zero_works" = yes; then
944   AC_DEFINE([MALLOC_ZERO_WORKS], 1,
945             [Define to 1 iff malloc(0) returns a pointer])
948 # whether we seem to be in a 2s-complement world.
949 AC_CACHE_CHECK([whether we are using 2s-complement arithmetic], tor_cv_twos_complement,
950 [AC_RUN_IFELSE([AC_LANG_SOURCE(
951 [[int main () { int problem = ((-99) != (~99)+1);
952 return problem ? 1 : 0; }]])],
953        [tor_cv_twos_complement=yes],
954        [tor_cv_twos_complement=no],
955        [tor_cv_twos_complement=cross])])
957 if test "$tor_cv_twos_complement" = cross ; then
958   # Cross-compiling; let's hope that the target isn't raving mad.
959   AC_MSG_NOTICE([Cross-compiling: we'll assume that negative integers are represented with two's complement.])
962 if test "$tor_cv_twos_complement" != no ; then
963   AC_DEFINE([USING_TWOS_COMPLEMENT], 1,
964             [Define to 1 iff we represent negative integers with two's complement])
967 # What does shifting a negative value do?
968 AC_CACHE_CHECK([whether right-shift on negative values does sign-extension], tor_cv_sign_extend,
969 [AC_RUN_IFELSE([AC_LANG_SOURCE(
970 [[int main () { int okay = (-60 >> 8) == -1; return okay ? 0 : 1; }]])],
971        [tor_cv_sign_extend=yes],
972        [tor_cv_sign_extend=no],
973        [tor_cv_sign_extend=cross])])
975 if test "$tor_cv_sign_extend" = cross ; then
976   # Cross-compiling; let's hope that the target isn't raving mad.
977   AC_MSG_NOTICE([Cross-compiling: we'll assume that right-shifting negative integers causes sign-extension])
980 if test "$tor_cv_sign_extend" != no ; then
981   AC_DEFINE([RSHIFT_DOES_SIGN_EXTEND], 1,
982             [Define to 1 iff right-shifting a negative value performs sign-extension])
985 # Whether we should use the dmalloc memory allocation debugging library.
986 AC_MSG_CHECKING(whether to use dmalloc (debug memory allocation library))
987 AC_ARG_WITH(dmalloc,
988 [  --with-dmalloc          Use debug memory allocation library. ],
989 [if [[ "$withval" = "yes" ]]; then
990   dmalloc=1
991   AC_MSG_RESULT(yes)
992 else
993   dmalloc=1
994   AC_MSG_RESULT(no)
995 fi], [ dmalloc=0; AC_MSG_RESULT(no) ]
998 if [[ $dmalloc -eq 1 ]]; then
999   AC_CHECK_HEADERS(dmalloc.h, , AC_MSG_ERROR(dmalloc header file not found. Do you have the development files for dmalloc installed?))
1000   AC_SEARCH_LIBS(dmalloc_malloc, [dmallocth dmalloc], , AC_MSG_ERROR(Libdmalloc library not found. If you enable it you better have it installed.))
1001   AC_DEFINE(USE_DMALLOC, 1, [Debug memory allocation library])
1002   AC_DEFINE(DMALLOC_FUNC_CHECK, 1, [Enable dmalloc's malloc function check])
1003   AC_CHECK_FUNCS(dmalloc_strdup dmalloc_strndup)
1006 AC_ARG_WITH(tcmalloc,
1007 [  --with-tcmalloc         Use tcmalloc memory allocation library. ],
1008 [ tcmalloc=yes ], [ tcmalloc=no ])
1010 if test x$tcmalloc = xyes ; then
1011    LDFLAGS="-ltcmalloc $LDFLAGS"
1014 # By default, we're going to assume we don't have mlockall()
1015 # bionic and other platforms have various broken mlockall subsystems.
1016 # Some systems don't have a working mlockall, some aren't linkable,
1017 # and some have it but don't declare it.
1018 AC_CHECK_FUNCS(mlockall)
1019 AC_CHECK_DECLS([mlockall], , , [
1020 #ifdef HAVE_SYS_MMAN_H
1021 #include <sys/mman.h>
1022 #endif])
1024 # Allow user to specify an alternate syslog facility
1025 AC_ARG_WITH(syslog-facility,
1026 [  --with-syslog-facility=LOG syslog facility to use (default=LOG_DAEMON)],
1027 syslog_facility="$withval", syslog_facility="LOG_DAEMON")
1028 AC_DEFINE_UNQUOTED(LOGFACILITY,$syslog_facility,[name of the syslog facility])
1029 AC_SUBST(LOGFACILITY)
1031 # Check if we have getresuid and getresgid
1032 AC_CHECK_FUNCS(getresuid getresgid)
1034 # Check for gethostbyname_r in all its glorious incompatible versions.
1035 #   (This logic is based on that in Python's configure.in)
1036 AH_TEMPLATE(HAVE_GETHOSTBYNAME_R,
1037   [Define this if you have any gethostbyname_r()])
1039 AC_CHECK_FUNC(gethostbyname_r, [
1040   AC_MSG_CHECKING([how many arguments gethostbyname_r() wants])
1041   OLD_CFLAGS=$CFLAGS
1042   CFLAGS="$CFLAGS $MY_CPPFLAGS $MY_THREAD_CPPFLAGS $MY_CFLAGS"
1043   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
1044 #include <netdb.h>
1045   ], [[
1046     char *cp1, *cp2;
1047     struct hostent *h1, *h2;
1048     int i1, i2;
1049     (void)gethostbyname_r(cp1,h1,cp2,i1,&h2,&i2);
1050   ]])],[
1051     AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1052     AC_DEFINE(HAVE_GETHOSTBYNAME_R_6_ARG, 1,
1053      [Define this if gethostbyname_r takes 6 arguments])
1054     AC_MSG_RESULT(6)
1055   ], [
1056     AC_TRY_COMPILE([
1057 #include <netdb.h>
1058     ], [
1059       char *cp1, *cp2;
1060       struct hostent *h1;
1061       int i1, i2;
1062       (void)gethostbyname_r(cp1,h1,cp2,i1,&i2);
1063     ], [
1064       AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1065       AC_DEFINE(HAVE_GETHOSTBYNAME_R_5_ARG, 1,
1066         [Define this if gethostbyname_r takes 5 arguments])
1067       AC_MSG_RESULT(5)
1068    ], [
1069       AC_TRY_COMPILE([
1070 #include <netdb.h>
1071      ], [
1072        char *cp1;
1073        struct hostent *h1;
1074        struct hostent_data hd;
1075        (void) gethostbyname_r(cp1,h1,&hd);
1076      ], [
1077        AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1078        AC_DEFINE(HAVE_GETHOSTBYNAME_R_3_ARG, 1,
1079          [Define this if gethostbyname_r takes 3 arguments])
1080        AC_MSG_RESULT(3)
1081      ], [
1082        AC_MSG_RESULT(0)
1083      ])
1084   ])
1085  ])
1086  CFLAGS=$OLD_CFLAGS
1089 AC_CACHE_CHECK([whether the C compiler supports __func__],
1090   tor_cv_have_func_macro,
1091   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1092 #include <stdio.h>
1093 int main(int c, char **v) { puts(__func__); }])],
1094   tor_cv_have_func_macro=yes,
1095   tor_cv_have_func_macro=no))
1097 AC_CACHE_CHECK([whether the C compiler supports __FUNC__],
1098   tor_cv_have_FUNC_macro,
1099   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1100 #include <stdio.h>
1101 int main(int c, char **v) { puts(__FUNC__); }])],
1102   tor_cv_have_FUNC_macro=yes,
1103   tor_cv_have_FUNC_macro=no))
1105 AC_CACHE_CHECK([whether the C compiler supports __FUNCTION__],
1106   tor_cv_have_FUNCTION_macro,
1107   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1108 #include <stdio.h>
1109 int main(int c, char **v) { puts(__FUNCTION__); }])],
1110   tor_cv_have_FUNCTION_macro=yes,
1111   tor_cv_have_FUNCTION_macro=no))
1113 AC_CACHE_CHECK([whether we have extern char **environ already declared],
1114   tor_cv_have_environ_declared,
1115   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1116 /* We define _GNU_SOURCE here because it is also defined in compat.c.
1117  * Without it environ doesn't get declared. */
1118 #define _GNU_SOURCE
1119 #ifdef HAVE_UNISTD_H
1120 #include <unistd.h>
1121 #endif
1122 #include <stdlib.h>
1123 int main(int c, char **v) { char **t = environ; }])],
1124   tor_cv_have_environ_declared=yes,
1125   tor_cv_have_environ_declared=no))
1127 if test "$tor_cv_have_func_macro" = 'yes'; then
1128   AC_DEFINE(HAVE_MACRO__func__, 1, [Defined if the compiler supports __func__])
1131 if test "$tor_cv_have_FUNC_macro" = 'yes'; then
1132   AC_DEFINE(HAVE_MACRO__FUNC__, 1, [Defined if the compiler supports __FUNC__])
1135 if test "$tor_cv_have_FUNCTION_macro" = 'yes'; then
1136   AC_DEFINE(HAVE_MACRO__FUNCTION__, 1,
1137            [Defined if the compiler supports __FUNCTION__])
1140 if test "$tor_cv_have_environ_declared" = 'yes'; then
1141   AC_DEFINE(HAVE_EXTERN_ENVIRON_DECLARED, 1,
1142            [Defined if we have extern char **environ already declared])
1145 # $prefix stores the value of the --prefix command line option, or
1146 # NONE if the option wasn't set.  In the case that it wasn't set, make
1147 # it be the default, so that we can use it to expand directories now.
1148 if test "x$prefix" = "xNONE"; then
1149   prefix=$ac_default_prefix
1152 # and similarly for $exec_prefix
1153 if test "x$exec_prefix" = "xNONE"; then
1154   exec_prefix=$prefix
1157 if test "x$BUILDDIR" = "x"; then
1158   BUILDDIR=`pwd`
1160 AC_SUBST(BUILDDIR)
1161 AH_TEMPLATE([BUILDDIR],[tor's build directory])
1162 AC_DEFINE_UNQUOTED(BUILDDIR,"$BUILDDIR")
1164 if test "x$CONFDIR" = "x"; then
1165   CONFDIR=`eval echo $sysconfdir/tor`
1167 AC_SUBST(CONFDIR)
1168 AH_TEMPLATE([CONFDIR],[tor's configuration directory])
1169 AC_DEFINE_UNQUOTED(CONFDIR,"$CONFDIR")
1171 BINDIR=`eval echo $bindir`
1172 AC_SUBST(BINDIR)
1173 LOCALSTATEDIR=`eval echo $localstatedir`
1174 AC_SUBST(LOCALSTATEDIR)
1176 if test "$bwin32" = true; then
1177   # Test if the linker supports the --nxcompat and --dynamicbase options
1178   # for Windows
1179   save_LDFLAGS="$LDFLAGS"
1180   LDFLAGS="-Wl,--nxcompat -Wl,--dynamicbase"
1181   AC_MSG_CHECKING([whether the linker supports DllCharacteristics])
1182   AC_LINK_IFELSE([AC_LANG_PROGRAM([])],
1183     [AC_MSG_RESULT([yes])]
1184     [save_LDFLAGS="$save_LDFLAGS $LDFLAGS"],
1185     [AC_MSG_RESULT([no])]
1186   )
1187   LDFLAGS="$save_LDFLAGS"
1190 # Set CFLAGS _after_ all the above checks, since our warnings are stricter
1191 # than autoconf's macros like.
1192 if test "$GCC" = yes; then
1193   # Disable GCC's strict aliasing checks.  They are an hours-to-debug
1194   # accident waiting to happen.
1195   CFLAGS="$CFLAGS -Wall -fno-strict-aliasing"
1196 else
1197   # Autoconf sets -g -O2 by default. Override optimization level
1198   # for non-gcc compilers
1199   CFLAGS="$CFLAGS -O"
1200   enable_gcc_warnings=no
1201   enable_gcc_warnings_advisory=no
1204 # OS X Lion started deprecating the system openssl. Let's just disable
1205 # all deprecation warnings on OS X. Also, to potentially make the binary
1206 # a little smaller, let's enable dead_strip.
1207 case "$host_os" in
1209  darwin*)
1210     CFLAGS="$CFLAGS -Wno-deprecated-declarations"
1211     LDFLAGS="$LDFLAGS -dead_strip" ;;
1212 esac
1214 # Add some more warnings which we use in development but not in the
1215 # released versions.  (Some relevant gcc versions can't handle these.)
1216 if test x$enable_gcc_warnings = xyes || test x$enable_gcc_warnings_advisory = xyes; then
1218   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1219 #if !defined(__GNUC__) || (__GNUC__ < 4)
1220 #error
1221 #endif])], have_gcc4=yes, have_gcc4=no)
1223   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1224 #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 2)
1225 #error
1226 #endif])], have_gcc42=yes, have_gcc42=no)
1228   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1229 #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 3)
1230 #error
1231 #endif])], have_gcc43=yes, have_gcc43=no)
1233 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1234 #if !defined(__clang__)
1235 #error
1236 #endif])], have_clang=yes, have_clang=no)
1238   save_CFLAGS="$CFLAGS"
1239   CFLAGS="$CFLAGS -Wshorten-64-to-32"
1240   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], have_shorten64_flag=yes,
1241                     have_shorten64_flag=no)
1242   CFLAGS="$save_CFLAGS"
1244   case $host in
1245     *-*-openbsd*)
1246       # Some OpenBSD versions (like 4.8) have -Wsystem-headers by default.
1247       # That's fine, except that the headers don't pass -Wredundant-decls.
1248       # Therefore, let's disable -Wsystem-headers when we're building
1249       # with maximal warnings on OpenBSD.
1250       CFLAGS="$CFLAGS -Wno-system-headers" ;;
1251   esac
1253   CFLAGS="$CFLAGS -W -Wfloat-equal -Wundef -Wpointer-arith"
1254   CFLAGS="$CFLAGS -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings"
1255   CFLAGS="$CFLAGS -Wredundant-decls -Wchar-subscripts -Wcomment -Wformat=2"
1256   CFLAGS="$CFLAGS -Wwrite-strings -Wmissing-declarations -Wredundant-decls"
1257   CFLAGS="$CFLAGS -Wnested-externs -Wbad-function-cast -Wswitch-enum"
1259   if test x$enable_gcc_warnings = xyes; then
1260     CFLAGS="$CFLAGS -Werror"
1261   fi
1263   # Disabled, so we can use mallinfo(): -Waggregate-return
1265   if test x$have_gcc4 = xyes ; then
1266     # These warnings break gcc 3.3.5 and work on gcc 4.0.2
1267     CFLAGS="$CFLAGS -Winit-self -Wmissing-field-initializers -Wdeclaration-after-statement -Wold-style-definition"
1268   fi
1270   if test x$have_gcc42 = xyes ; then
1271     # These warnings break gcc 4.0.2 and work on gcc 4.2
1272     # XXXX020 See if any of these work with earlier versions.
1273     CFLAGS="$CFLAGS -Waddress -Wmissing-noreturn -Wstrict-overflow=1"
1275     # We used to use -Wstrict-overflow=5, but that breaks us heavily under 4.3.
1276   fi
1278   if test x$have_gcc42 = xyes && test x$have_clang = xno; then
1279     # These warnings break gcc 4.0.2 and clang, but work on gcc 4.2
1280     CFLAGS="$CFLAGS -Wnormalized=id -Woverride-init"
1281   fi
1283   if test x$have_gcc43 = xyes ; then
1284     # These warnings break gcc 4.2 and work on gcc 4.3
1285     # XXXX020 See if any of these work with earlier versions.
1286     CFLAGS="$CFLAGS -Wextra -Warray-bounds"
1287   fi
1289   if test x$have_shorten64_flag = xyes ; then
1290     CFLAGS="$CFLAGS -Wshorten-64-to-32"
1291   fi
1293 ##This will break the world on some 64-bit architectures
1294 # CFLAGS="$CFLAGS -Winline"
1299 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent $TOR_CPPFLAGS_openssl $TOR_CPPFLAGS_zlib"
1301 AC_CONFIG_FILES([
1302         Doxyfile
1303         Makefile
1304         contrib/Makefile
1305         contrib/suse/Makefile
1306         contrib/suse/tor.sh
1307         contrib/tor.logrotate
1308         contrib/tor.sh
1309         contrib/torctl
1310         contrib/torify
1311         doc/Makefile
1312         src/Makefile
1313         src/common/Makefile
1314         src/config/Makefile
1315         src/config/torrc.sample
1316         src/or/Makefile
1317         src/test/Makefile
1318         src/tools/Makefile
1319         src/tools/tor-fw-helper/Makefile
1320         src/win32/Makefile
1321         tor.spec
1324 AC_OUTPUT
1326 if test -x /usr/bin/perl && test -x ./contrib/updateVersions.pl ; then
1327   ./contrib/updateVersions.pl