revise changelog entry for 5097 too
[tor.git] / configure.in
blobef571b84d6acb91899d171246af74064e45f0323
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.11-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 AC_SEARCH_LIBS([clock_gettime], [rt], [have_rt=yes])
285 if test "$enable_threads" = "yes"; then
286   AC_SEARCH_LIBS(pthread_create, [pthread])
287   AC_SEARCH_LIBS(pthread_detach, [pthread])
290 dnl -------------------------------------------------------------------
291 dnl Check for functions before libevent, since libevent-1.2 apparently
292 dnl exports strlcpy without defining it in a header.
294 AC_CHECK_FUNCS(
295         accept4 \
296         clock_gettime \
297         flock \
298         ftime \
299         getaddrinfo \
300         getifaddrs \
301         getrlimit \
302         gettimeofday \
303         gmtime_r \
304         inet_aton \
305         ioctl \
306         localtime_r \
307         lround \
308         memmem \
309         prctl \
310         rint \
311         socketpair \
312         strlcat \
313         strlcpy \
314         strptime \
315         strtok_r \
316         strtoull \
317         sysconf \
318         uname \
319         vasprintf \
322 using_custom_malloc=no
323 if test x$enable_openbsd_malloc = xyes ; then
324    AC_DEFINE(HAVE_MALLOC_GOOD_SIZE, 1, [Defined if we have the malloc_good_size function])
325    using_custom_malloc=yes
327 if test x$tcmalloc = xyes ; then
328    using_custom_malloc=yes
330 if test $using_custom_malloc = no ; then
331    AC_CHECK_FUNCS(mallinfo malloc_good_size malloc_usable_size)
334 if test "$enable_threads" = "yes"; then
335   AC_CHECK_HEADERS(pthread.h)
336   AC_CHECK_FUNCS(pthread_create)
339 dnl ------------------------------------------------------
340 dnl Where do you live, libevent?  And how do we call you?
342 if test "$bwin32" = true; then
343   TOR_LIB_WS32=-lws2_32
344   TOR_LIB_IPHLPAPI=-liphlpapi
345   # Some of the cargo-cults recommend -lwsock32 as well, but I don't
346   # think it's actually necessary.
347   TOR_LIB_GDI=-lgdi32
348 else
349   TOR_LIB_WS32=
350   TOR_LIB_GDI=
352 AC_SUBST(TOR_LIB_WS32)
353 AC_SUBST(TOR_LIB_GDI)
354 AC_SUBST(TOR_LIB_IPHLPAPI)
356 dnl We need to do this before we try our disgusting hack below.
357 AC_CHECK_HEADERS([sys/types.h])
359 dnl This is a disgusting hack so we safely include older libevent headers.
360 AC_CHECK_TYPE(u_int64_t, unsigned long long)
361 AC_CHECK_TYPE(u_int32_t, unsigned long)
362 AC_CHECK_TYPE(u_int16_t, unsigned short)
363 AC_CHECK_TYPE(u_int8_t, unsigned char)
365 tor_libevent_pkg_redhat="libevent"
366 tor_libevent_pkg_debian="libevent-dev"
367 tor_libevent_devpkg_redhat="libevent-devel"
368 tor_libevent_devpkg_debian="libevent-dev"
370 dnl On Gnu/Linux or any place we require it, we'll add librt to the Libevent
371 dnl linking for static builds.
372 STATIC_LIBEVENT_FLAGS=""
373 if test "$enable_static_libevent" = "yes"; then
374     if test "$have_rt" = yes; then
375       STATIC_LIBEVENT_FLAGS=" -lrt "
376     fi
379 TOR_SEARCH_LIBRARY(libevent, $trylibeventdir, [-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32], [
380 #ifdef _WIN32
381 #include <winsock2.h>
382 #endif
383 #include <stdlib.h>
384 #include <sys/time.h>
385 #include <sys/types.h>
386 #include <event.h>], [
387 #ifdef _WIN32
388 #include <winsock2.h>
389 #endif
390 void exit(int); void *event_init(void);],
391     [
392 #ifdef _WIN32
393 {WSADATA d; WSAStartup(0x101,&d); }
394 #endif
395 event_init(); exit(0);
396 ], [--with-libevent-dir], [/opt/libevent])
398 dnl Now check for particular libevent functions.
399 save_LIBS="$LIBS"
400 save_LDFLAGS="$LDFLAGS"
401 save_CPPFLAGS="$CPPFLAGS"
402 LIBS="-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32 $LIBS"
403 LDFLAGS="$TOR_LDFLAGS_libevent $LDFLAGS"
404 CPPFLAGS="$TOR_CPPFLAGS_libevent $CPPFLAGS"
405 AC_CHECK_FUNCS(event_get_version event_get_version_number event_get_method event_set_log_callback evdns_set_outgoing_bind_address event_base_loopexit)
406 AC_CHECK_MEMBERS([struct event.min_heap_idx], , ,
407 [#include <event.h>
410 AC_CHECK_HEADERS(event2/event.h event2/dns.h event2/bufferevent_ssl.h)
412 LIBS="$save_LIBS"
413 LDFLAGS="$save_LDFLAGS"
414 CPPFLAGS="$save_CPPFLAGS"
417 AM_CONDITIONAL(USE_EXTERNAL_EVDNS, test x$ac_cv_header_event2_dns_h = xyes)
419 if test "$enable_static_libevent" = "yes"; then
420    if test "$tor_cv_library_libevent_dir" = "(system)"; then
421      AC_MSG_ERROR("You must specify an explicit --with-libevent-dir=x option when using --enable-static-libevent")
422    else
423      TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent.a $STATIC_LIBEVENT_FLAGS"
424    fi
425 else
426      TOR_LIBEVENT_LIBS="-levent"
429 dnl This isn't the best test for Libevent 2.0.3-alpha.  Once it's released,
430 dnl we can do much better.
431 if test "$enable_bufferevents" = "yes" ; then
432   if test "$ac_cv_header_event2_bufferevent_ssl_h" != "yes" ; then
433     AC_MSG_ERROR([You've asked for bufferevent support, but you're using a version of Libevent without SSL support.  This won't work.  We need Libevent 2.0.8-rc or later, and you don't seem to even have Libevent 2.0.3-alpha.])
434   else
436     CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent"
438     # Check for the right version.  First see if version detection works.
439     AC_MSG_CHECKING([whether we can detect the Libevent version])
440     AC_COMPILE_IFELSE([AC_LANG_SOURCE([
441 #include <event2/event.h>
442 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 10
443 #error
444 int x = y(zz);
445 #else
446 int x = 1;
447 #endif
448   ])], [event_version_number_works=yes; AC_MSG_RESULT([yes]) ],
449      [event_version_number_works=no;  AC_MSG_RESULT([no])])
450     if test "$event_version_number_works" != 'yes'; then
451       AC_MSG_WARN([Version detection on Libevent seems broken.  Your Libevent installation is probably screwed up or very old.])
452     else
453       AC_MSG_CHECKING([whether Libevent is new enough for bufferevents])
454       AC_COMPILE_IFELSE([AC_LANG_SOURCE([
455 #include <event2/event.h>
456 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 0x02000d00
457 #error
458 int x = y(zz);
459 #else
460 int x = 1;
461 #endif
462    ])], [ AC_MSG_RESULT([yes]) ],
463       [ AC_MSG_RESULT([no])
464         AC_MSG_ERROR([Libevent does not seem new enough to support bufferevents.  We require 2.0.13-stable or later]) ] )
465     fi
466   fi
469 LIBS="$save_LIBS"
470 LDFLAGS="$save_LDFLAGS"
471 CPPFLAGS="$save_CPPFLAGS"
473 AM_CONDITIONAL(USE_BUFFEREVENTS, test "$enable_bufferevents" = "yes")
474 if test "$enable_bufferevents" = "yes"; then
475   AC_DEFINE(USE_BUFFEREVENTS, 1, [Defined if we're going to use Libevent's buffered IO API])
476   if test "$enable_static_libevent" = "yes"; then
477     TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent_openssl.a $TOR_LIBEVENT_LIBS"
478   else
479     TOR_LIBEVENT_LIBS="-levent_openssl $TOR_LIBEVENT_LIBS"
480   fi
482 AC_SUBST(TOR_LIBEVENT_LIBS)
484 dnl ------------------------------------------------------
485 dnl Where do you live, libm?
487 dnl On some platforms (Haiku/BeOS) the math library is
488 dnl part of libroot. In which case don't link against lm
489 TOR_LIB_MATH=""
490 save_LIBS="$LIBS"
491 AC_SEARCH_LIBS(pow, [m], , AC_MSG_ERROR([Could not find pow in libm or libc.]))
492 if test "$ac_cv_search_pow" != "none required"; then
493     TOR_LIB_MATH="$ac_cv_search_pow"
495 LIBS="$save_LIBS"
496 AC_SUBST(TOR_LIB_MATH)
498 dnl ------------------------------------------------------
499 dnl Where do you live, openssl?  And how do we call you?
501 tor_openssl_pkg_redhat="openssl"
502 tor_openssl_pkg_debian="libssl"
503 tor_openssl_devpkg_redhat="openssl-devel"
504 tor_openssl_devpkg_debian="libssl-dev"
506 ALT_openssl_WITHVAL=""
507 AC_ARG_WITH(ssl-dir,
508   [  --with-ssl-dir=PATH    Obsolete alias for --with-openssl-dir ],
509   [
510       if test "x$withval" != xno && test "x$withval" != "x" ; then
511          ALT_openssl_WITHVAL="$withval"
512       fi
513   ])
515 TOR_SEARCH_LIBRARY(openssl, $tryssldir, [-lssl -lcrypto $TOR_LIB_GDI],
516     [#include <openssl/rand.h>],
517     [void RAND_add(const void *buf, int num, double entropy);],
518     [RAND_add((void*)0,0,0); exit(0);], [],
519     [/usr/local/openssl /usr/lib/openssl /usr/local/ssl /usr/lib/ssl /usr/local /usr/athena /opt/openssl])
521 dnl XXXX check for OPENSSL_VERSION_NUMBER == SSLeay()
523 echo "tor_cv_library_openssl_dir is $tor_cv_library_openssl_dir"
524 if test "$enable_static_openssl" = "yes"; then
525    if test "$tor_cv_library_openssl_dir" = "(system)"; then
526      AC_MSG_ERROR("You must specify an explicit --with-openssl-dir=x option when using --enable-static-openssl")
527    else
528      TOR_OPENSSL_LIBS="$TOR_LIBDIR_openssl/libssl.a $TOR_LIBDIR_openssl/libcrypto.a"
529    fi
530 else
531      TOR_OPENSSL_LIBS="-lssl -lcrypto"
533 AC_SUBST(TOR_OPENSSL_LIBS)
535 dnl ------------------------------------------------------
536 dnl Where do you live, zlib?  And how do we call you?
538 tor_zlib_pkg_redhat="zlib"
539 tor_zlib_pkg_debian="zlib1g"
540 tor_zlib_devpkg_redhat="zlib-devel"
541 tor_zlib_devpkg_debian="zlib1g-dev"
543 TOR_SEARCH_LIBRARY(zlib, $tryzlibdir, [-lz],
544     [#include <zlib.h>],
545     [const char * zlibVersion(void);],
546     [zlibVersion(); exit(0);], [--with-zlib-dir],
547     [/opt/zlib])
549 if test "$enable_static_zlib" = "yes"; then
550    if test "$tor_cv_library_zlib_dir" = "(system)"; then
551      AC_MSG_ERROR("You must specify an explicit --with-zlib-dir=x option when
552  using --enable-static-zlib")
553    else
554      TOR_ZLIB_LIBS="$TOR_LIBDIR_zlib/libz.a"
555      echo "$TOR_LIBDIR_zlib/libz.a"
556    fi
557 else
558      TOR_ZLIB_LIBS="-lz"
560 AC_SUBST(TOR_ZLIB_LIBS)
562 dnl Make sure to enable support for large off_t if available.
565 dnl ------------------------------------------------------
566 dnl Where do you live, libnatpmp?  And how do we call you?
567 dnl There are no packages for Debian or Redhat as of this patch
569 if test "$natpmp" = "true"; then
570     AC_DEFINE(NAT_PMP, 1, [Define to 1 if we are building with nat-pmp.])
571     TOR_SEARCH_LIBRARY(libnatpmp, $trylibnatpmpdir, [-lnatpmp $TOR_LIB_WS32 $TOR_LIB_IPHLPAPI],
572         [#include <natpmp.h>],
573         [#ifdef _WIN32
574          #define STATICLIB
575          #endif
576          #include <natpmp.h>],
577         [   int r;
578             natpmp_t natpmp;
579             natpmpresp_t response;
580             r = initnatpmp(&natpmp, 0, 0);],
581             [printf("initnatpmp() returned %d (%s)\n", r, r?"FAILED":"SUCCESS");
582             exit(0);],
583         [--with-libnatpmp-dir],
584         [/usr/lib/])
588 dnl ------------------------------------------------------
589 dnl Where do you live, libminiupnpc?  And how do we call you?
590 dnl There are no packages for Debian or Redhat as of this patch
592 if test "$upnp" = "true"; then
593     AC_DEFINE(MINIUPNPC, 1, [Define to 1 if we are building with UPnP.])
594     TOR_SEARCH_LIBRARY(libminiupnpc, $trylibminiupnpcdir, [-lminiupnpc $TOR_LIB_WS32 $TOR_LIB_IPHLPAPI],
595         [#include <miniupnpc/miniwget.h>
596          #include <miniupnpc/miniupnpc.h>
597          #include <miniupnpc/upnpcommands.h>],
598         [void upnpDiscover(int delay, const char * multicastif,
599          const char * minissdpdsock, int sameport);],
600         [upnpDiscover(1, 0, 0, 0); exit(0);],
601         [--with-libminiupnpc-dir],
602         [/usr/lib/])
605 AC_SYS_LARGEFILE
607 AC_CHECK_HEADERS(
608         assert.h \
609         errno.h \
610         fcntl.h \
611         signal.h \
612         string.h \
613         sys/fcntl.h \
614         sys/stat.h \
615         sys/time.h \
616         sys/types.h \
617         time.h \
618         unistd.h
619  , , AC_MSG_WARN(Some headers were not found, compilation may fail.  If compilation succeeds, please send your orconfig.h to the developers so we can fix this warning.))
621 dnl These headers are not essential
623 AC_CHECK_HEADERS(
624         arpa/inet.h \
625         grp.h \
626         ifaddrs.h \
627         inttypes.h \
628         limits.h \
629         linux/types.h \
630         machine/limits.h \
631         malloc.h \
632         malloc/malloc.h \
633         malloc_np.h \
634         netdb.h \
635         netinet/in.h \
636         netinet/in6.h \
637         pwd.h \
638         stdint.h \
639         sys/file.h \
640         sys/ioctl.h \
641         sys/limits.h \
642         sys/mman.h \
643         sys/param.h \
644         sys/prctl.h \
645         sys/resource.h \
646         sys/socket.h \
647         sys/syslimits.h \
648         sys/time.h \
649         sys/types.h \
650         sys/un.h \
651         sys/utime.h \
652         sys/wait.h \
653         syslog.h \
654         utime.h
657 TOR_CHECK_PROTOTYPE(malloc_good_size, HAVE_MALLOC_GOOD_SIZE_PROTOTYPE,
658 [#ifdef HAVE_MALLOC_H
659 #include <malloc.h>
660 #endif
661 #ifdef HAVE_MALLOC_MALLOC_H
662 #include <malloc/malloc.h>
663 #endif])
665 AC_CHECK_HEADERS(net/if.h, net_if_found=1, net_if_found=0,
666 [#ifdef HAVE_SYS_TYPES_H
667 #include <sys/types.h>
668 #endif
669 #ifdef HAVE_SYS_SOCKET_H
670 #include <sys/socket.h>
671 #endif])
672 AC_CHECK_HEADERS(net/pfvar.h, net_pfvar_found=1, net_pfvar_found=0,
673 [#ifdef HAVE_SYS_TYPES_H
674 #include <sys/types.h>
675 #endif
676 #ifdef HAVE_SYS_SOCKET_H
677 #include <sys/socket.h>
678 #endif
679 #ifdef HAVE_NET_IF_H
680 #include <net/if.h>
681 #endif])
682 AC_CHECK_HEADERS(linux/netfilter_ipv4.h,
683         linux_netfilter_ipv4=1, linux_netfilter_ipv4=0,
684 [#ifdef HAVE_SYS_TYPES_H
685 #include <sys/types.h>
686 #endif
687 #ifdef HAVE_SYS_SOCKET_H
688 #include <sys/socket.h>
689 #endif
690 #ifdef HAVE_LIMITS_H
691 #include <limits.h>
692 #endif
693 #ifdef HAVE_LINUX_TYPES_H
694 #include <linux/types.h>
695 #endif
696 #ifdef HAVE_NETINET_IN6_H
697 #include <netinet/in6.h>
698 #endif
699 #ifdef HAVE_NETINET_IN_H
700 #include <netinet/in.h>
701 #endif])
703 if test x$transparent = xtrue ; then
704    transparent_ok=0
705    if test x$net_if_found = x1 && test x$net_pfvar_found = x1 ; then
706      transparent_ok=1
707    fi
708    if test x$linux_netfilter_ipv4 = x1 ; then
709      transparent_ok=1
710    fi
711    if test x$transparent_ok = x1 ; then
712      AC_DEFINE(USE_TRANSPARENT, 1, "Define to enable transparent proxy support")
713      case $host in
714        *-*-openbsd*)
715          AC_DEFINE(OPENBSD, 1, "Define to handle pf on OpenBSD properly") ;;
716      esac
717    else
718      AC_MSG_NOTICE([Transparent proxy support enabled, but missing headers.])
719    fi
722 AC_CHECK_MEMBERS([struct timeval.tv_sec], , ,
723 [#ifdef HAVE_SYS_TYPES_H
724 #include <sys/types.h>
725 #endif
726 #ifdef HAVE_SYS_TIME_H
727 #include <sys/time.h>
728 #endif])
730 dnl In case we aren't given a working stdint.h, we'll need to grow our own.
731 dnl Watch out.
733 AC_CHECK_SIZEOF(int8_t)
734 AC_CHECK_SIZEOF(int16_t)
735 AC_CHECK_SIZEOF(int32_t)
736 AC_CHECK_SIZEOF(int64_t)
737 AC_CHECK_SIZEOF(uint8_t)
738 AC_CHECK_SIZEOF(uint16_t)
739 AC_CHECK_SIZEOF(uint32_t)
740 AC_CHECK_SIZEOF(uint64_t)
741 AC_CHECK_SIZEOF(intptr_t)
742 AC_CHECK_SIZEOF(uintptr_t)
744 dnl AC_CHECK_TYPES([int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t, uint64_t, intptr_t, uintptr_t])
746 AC_CHECK_SIZEOF(char)
747 AC_CHECK_SIZEOF(short)
748 AC_CHECK_SIZEOF(int)
749 AC_CHECK_SIZEOF(long)
750 AC_CHECK_SIZEOF(long long)
751 AC_CHECK_SIZEOF(__int64)
752 AC_CHECK_SIZEOF(void *)
753 AC_CHECK_SIZEOF(time_t)
754 AC_CHECK_SIZEOF(size_t)
756 AC_CHECK_TYPES([uint, u_char, ssize_t])
758 dnl used to include sockaddr_storage, but everybody has that.
759 AC_CHECK_TYPES([struct in6_addr, struct sockaddr_in6, sa_family_t], , ,
760 [#ifdef HAVE_SYS_TYPES_H
761 #include <sys/types.h>
762 #endif
763 #ifdef HAVE_NETINET_IN_H
764 #include <netinet/in.h>
765 #endif
766 #ifdef HAVE_NETINET_IN6_H
767 #include <netinet/in6.h>
768 #endif
769 #ifdef HAVE_SYS_SOCKET_H
770 #include <sys/socket.h>
771 #endif
772 #ifdef _WIN32
773 #define WIN32_WINNT 0x400
774 #define _WIN32_WINNT 0x400
775 #define WIN32_LEAN_AND_MEAN
776 #if defined(_MSC_VER) && (_MSC_VER < 1300)
777 #include <winsock.h>
778 #else
779 #include <winsock2.h>
780 #include <ws2tcpip.h>
781 #endif
782 #endif
784 AC_CHECK_MEMBERS([struct in6_addr.s6_addr32, struct in6_addr.s6_addr16, struct sockaddr_in.sin_len, struct sockaddr_in6.sin6_len], , ,
785 [#ifdef HAVE_SYS_TYPES_H
786 #include <sys/types.h>
787 #endif
788 #ifdef HAVE_NETINET_IN_H
789 #include <netinet/in.h>
790 #endif
791 #ifdef HAVE_NETINET_IN6_H
792 #include <netinet/in6.h>
793 #endif
794 #ifdef HAVE_SYS_SOCKET_H
795 #include <sys/socket.h>
796 #endif
797 #ifdef _WIN32
798 #define WIN32_WINNT 0x400
799 #define _WIN32_WINNT 0x400
800 #define WIN32_LEAN_AND_MEAN
801 #if defined(_MSC_VER) && (_MSC_VER < 1300)
802 #include <winsock.h>
803 #else
804 #include <winsock2.h>
805 #include <ws2tcpip.h>
806 #endif
807 #endif
810 AC_CHECK_TYPES([rlim_t], , ,
811 [#ifdef HAVE_SYS_TYPES_H
812 #include <sys/types.h>
813 #endif
814 #ifdef HAVE_SYS_TIME_H
815 #include <sys/time.h>
816 #endif
817 #ifdef HAVE_SYS_RESOURCE_H
818 #include <sys/resource.h>
819 #endif
822 AC_CACHE_CHECK([whether time_t is signed], tor_cv_time_t_signed, [
823 AC_RUN_IFELSE([AC_LANG_SOURCE([
824 #ifdef HAVE_SYS_TYPES_H
825 #include <sys/types.h>
826 #endif
827 #ifdef HAVE_SYS_TIME_H
828 #include <sys/time.h>
829 #endif
830 #ifdef HAVE_TIME_H
831 #include <time.h>
832 #endif
833 int main(int c, char**v) { if (((time_t)-1)<0) return 1; else return 0; }])],
834   tor_cv_time_t_signed=no, tor_cv_time_t_signed=yes, tor_cv_time_t_signed=cross)
837 if test "$tor_cv_time_t_signed" = cross; then
838   AC_MSG_NOTICE([Cross compiling: assuming that time_t is signed.])
841 if test "$tor_cv_time_t_signed" != no; then
842   AC_DEFINE([TIME_T_IS_SIGNED], 1,
843             [Define to 1 iff time_t is signed])
846 AC_CACHE_CHECK([whether size_t is signed], tor_cv_size_t_signed, [
847 AC_RUN_IFELSE([AC_LANG_SOURCE([
848 #ifdef HAVE_SYS_TYPES_H
849 #include <sys/types.h>
850 #endif
851 int main(int c, char**v) { if (((size_t)-1)<0) return 1; else return 0; }])],
852   tor_cv_size_t_signed=no, tor_cv_size_t_signed=yes, tor_cv_size_t_signed=cross)
855 if test "$tor_cv_size_t_signed" = cross; then
856   AC_MSG_NOTICE([Cross compiling: assuming that size_t is not signed.])
859 if test "$tor_cv_size_t_signed" = yes; then
860   AC_MSG_ERROR([You have a signed size_t; that's grossly nonconformant.])
863 AC_CHECK_SIZEOF(socklen_t, , [AC_INCLUDES_DEFAULT()
864 #ifdef HAVE_SYS_SOCKET_H
865 #include <sys/socket.h>
866 #endif
869 # We want to make sure that we _don't_ have a cell_t defined, like IRIX does.
871 AC_CHECK_SIZEOF(cell_t)
873 # Now make sure that NULL can be represented as zero bytes.
874 AC_CACHE_CHECK([whether memset(0) sets pointers to NULL], tor_cv_null_is_zero,
875 [AC_RUN_IFELSE([AC_LANG_SOURCE(
876 [[#include <stdlib.h>
877 #include <string.h>
878 #include <stdio.h>
879 #ifdef HAVE_STDDEF_H
880 #include <stddef.h>
881 #endif
882 int main () { char *p1,*p2; p1=NULL; memset(&p2,0,sizeof(p2));
883 return memcmp(&p1,&p2,sizeof(char*))?1:0; }]])],
884        [tor_cv_null_is_zero=yes],
885        [tor_cv_null_is_zero=no],
886        [tor_cv_null_is_zero=cross])])
888 if test "$tor_cv_null_is_zero" = cross ; then
889   # Cross-compiling; let's hope that the target isn't raving mad.
890   AC_MSG_NOTICE([Cross-compiling: we'll assume that NULL is represented as a sequence of 0-valued bytes.])
893 if test "$tor_cv_null_is_zero" != no; then
894   AC_DEFINE([NULL_REP_IS_ZERO_BYTES], 1,
895             [Define to 1 iff memset(0) sets pointers to NULL])
898 # And what happens when we malloc zero?
899 AC_CACHE_CHECK([whether we can malloc(0) safely.], tor_cv_malloc_zero_works,
900 [AC_RUN_IFELSE([AC_LANG_SOURCE(
901 [[#include <stdlib.h>
902 #include <string.h>
903 #include <stdio.h>
904 #ifdef HAVE_STDDEF_H
905 #include <stddef.h>
906 #endif
907 int main () { return malloc(0)?0:1; }]])],
908        [tor_cv_malloc_zero_works=yes],
909        [tor_cv_malloc_zero_works=no],
910        [tor_cv_malloc_zero_works=cross])])
912 if test "$tor_cv_malloc_zero_works" = cross; then
913   # Cross-compiling; let's hope that the target isn't raving mad.
914   AC_MSG_NOTICE([Cross-compiling: we'll assume that we need to check malloc() arguments for 0.])
917 if test "$tor_cv_malloc_zero_works" = yes; then
918   AC_DEFINE([MALLOC_ZERO_WORKS], 1,
919             [Define to 1 iff malloc(0) returns a pointer])
922 # whether we seem to be in a 2s-complement world.
923 AC_CACHE_CHECK([whether we are using 2s-complement arithmetic], tor_cv_twos_complement,
924 [AC_RUN_IFELSE([AC_LANG_SOURCE(
925 [[int main () { int problem = ((-99) != (~99)+1);
926 return problem ? 1 : 0; }]])],
927        [tor_cv_twos_complement=yes],
928        [tor_cv_twos_complement=no],
929        [tor_cv_twos_complement=cross])])
931 if test "$tor_cv_twos_complement" = cross ; then
932   # Cross-compiling; let's hope that the target isn't raving mad.
933   AC_MSG_NOTICE([Cross-compiling: we'll assume that negative integers are represented with two's complement.])
936 if test "$tor_cv_twos_complement" != no ; then
937   AC_DEFINE([USING_TWOS_COMPLEMENT], 1,
938             [Define to 1 iff we represent negative integers with two's complement])
941 # What does shifting a negative value do?
942 AC_CACHE_CHECK([whether right-shift on negative values does sign-extension], tor_cv_sign_extend,
943 [AC_RUN_IFELSE([AC_LANG_SOURCE(
944 [[int main () { int okay = (-60 >> 8) == -1; return okay ? 0 : 1; }]])],
945        [tor_cv_sign_extend=yes],
946        [tor_cv_sign_extend=no],
947        [tor_cv_sign_extend=cross])])
949 if test "$tor_cv_sign_extend" = cross ; then
950   # Cross-compiling; let's hope that the target isn't raving mad.
951   AC_MSG_NOTICE([Cross-compiling: we'll assume that right-shifting negative integers causes sign-extension])
954 if test "$tor_cv_sign_extend" != no ; then
955   AC_DEFINE([RSHIFT_DOES_SIGN_EXTEND], 1,
956             [Define to 1 iff right-shifting a negative value performs sign-extension])
959 # Whether we should use the dmalloc memory allocation debugging library.
960 AC_MSG_CHECKING(whether to use dmalloc (debug memory allocation library))
961 AC_ARG_WITH(dmalloc,
962 [  --with-dmalloc          Use debug memory allocation library. ],
963 [if [[ "$withval" = "yes" ]]; then
964   dmalloc=1
965   AC_MSG_RESULT(yes)
966 else
967   dmalloc=1
968   AC_MSG_RESULT(no)
969 fi], [ dmalloc=0; AC_MSG_RESULT(no) ]
972 if [[ $dmalloc -eq 1 ]]; then
973   AC_CHECK_HEADERS(dmalloc.h, , AC_MSG_ERROR(dmalloc header file not found. Do you have the development files for dmalloc installed?))
974   AC_SEARCH_LIBS(dmalloc_malloc, [dmallocth dmalloc], , AC_MSG_ERROR(Libdmalloc library not found. If you enable it you better have it installed.))
975   AC_DEFINE(USE_DMALLOC, 1, [Debug memory allocation library])
976   AC_DEFINE(DMALLOC_FUNC_CHECK, 1, [Enable dmalloc's malloc function check])
977   AC_CHECK_FUNCS(dmalloc_strdup dmalloc_strndup)
980 AC_ARG_WITH(tcmalloc,
981 [  --with-tcmalloc         Use tcmalloc memory allocation library. ],
982 [ tcmalloc=yes ], [ tcmalloc=no ])
984 if test x$tcmalloc = xyes ; then
985    LDFLAGS="-ltcmalloc $LDFLAGS"
988 # By default, we're going to assume we don't have mlockall()
989 # bionic and other platforms have various broken mlockall subsystems.
990 # Some systems don't have a working mlockall, some aren't linkable,
991 # and some have it but don't declare it.
992 AC_CHECK_FUNCS(mlockall)
993 AC_CHECK_DECLS([mlockall], , , [
994 #ifdef HAVE_SYS_MMAN_H
995 #include <sys/mman.h>
996 #endif])
998 # Allow user to specify an alternate syslog facility
999 AC_ARG_WITH(syslog-facility,
1000 [  --with-syslog-facility=LOG syslog facility to use (default=LOG_DAEMON)],
1001 syslog_facility="$withval", syslog_facility="LOG_DAEMON")
1002 AC_DEFINE_UNQUOTED(LOGFACILITY,$syslog_facility,[name of the syslog facility])
1003 AC_SUBST(LOGFACILITY)
1005 # Check if we have getresuid and getresgid
1006 AC_CHECK_FUNCS(getresuid getresgid)
1008 # Check for gethostbyname_r in all its glorious incompatible versions.
1009 #   (This logic is based on that in Python's configure.in)
1010 AH_TEMPLATE(HAVE_GETHOSTBYNAME_R,
1011   [Define this if you have any gethostbyname_r()])
1013 AC_CHECK_FUNC(gethostbyname_r, [
1014   AC_MSG_CHECKING([how many arguments gethostbyname_r() wants])
1015   OLD_CFLAGS=$CFLAGS
1016   CFLAGS="$CFLAGS $MY_CPPFLAGS $MY_THREAD_CPPFLAGS $MY_CFLAGS"
1017   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
1018 #include <netdb.h>
1019   ], [[
1020     char *cp1, *cp2;
1021     struct hostent *h1, *h2;
1022     int i1, i2;
1023     (void)gethostbyname_r(cp1,h1,cp2,i1,&h2,&i2);
1024   ]])],[
1025     AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1026     AC_DEFINE(HAVE_GETHOSTBYNAME_R_6_ARG, 1,
1027      [Define this if gethostbyname_r takes 6 arguments])
1028     AC_MSG_RESULT(6)
1029   ], [
1030     AC_TRY_COMPILE([
1031 #include <netdb.h>
1032     ], [
1033       char *cp1, *cp2;
1034       struct hostent *h1;
1035       int i1, i2;
1036       (void)gethostbyname_r(cp1,h1,cp2,i1,&i2);
1037     ], [
1038       AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1039       AC_DEFINE(HAVE_GETHOSTBYNAME_R_5_ARG, 1,
1040         [Define this if gethostbyname_r takes 5 arguments])
1041       AC_MSG_RESULT(5)
1042    ], [
1043       AC_TRY_COMPILE([
1044 #include <netdb.h>
1045      ], [
1046        char *cp1;
1047        struct hostent *h1;
1048        struct hostent_data hd;
1049        (void) gethostbyname_r(cp1,h1,&hd);
1050      ], [
1051        AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1052        AC_DEFINE(HAVE_GETHOSTBYNAME_R_3_ARG, 1,
1053          [Define this if gethostbyname_r takes 3 arguments])
1054        AC_MSG_RESULT(3)
1055      ], [
1056        AC_MSG_RESULT(0)
1057      ])
1058   ])
1059  ])
1060  CFLAGS=$OLD_CFLAGS
1063 AC_CACHE_CHECK([whether the C compiler supports __func__],
1064   tor_cv_have_func_macro,
1065   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1066 #include <stdio.h>
1067 int main(int c, char **v) { puts(__func__); }])],
1068   tor_cv_have_func_macro=yes,
1069   tor_cv_have_func_macro=no))
1071 AC_CACHE_CHECK([whether the C compiler supports __FUNC__],
1072   tor_cv_have_FUNC_macro,
1073   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1074 #include <stdio.h>
1075 int main(int c, char **v) { puts(__FUNC__); }])],
1076   tor_cv_have_FUNC_macro=yes,
1077   tor_cv_have_FUNC_macro=no))
1079 AC_CACHE_CHECK([whether the C compiler supports __FUNCTION__],
1080   tor_cv_have_FUNCTION_macro,
1081   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1082 #include <stdio.h>
1083 int main(int c, char **v) { puts(__FUNCTION__); }])],
1084   tor_cv_have_FUNCTION_macro=yes,
1085   tor_cv_have_FUNCTION_macro=no))
1087 if test "$tor_cv_have_func_macro" = 'yes'; then
1088   AC_DEFINE(HAVE_MACRO__func__, 1, [Defined if the compiler supports __func__])
1091 if test "$tor_cv_have_FUNC_macro" = 'yes'; then
1092   AC_DEFINE(HAVE_MACRO__FUNC__, 1, [Defined if the compiler supports __FUNC__])
1095 if test "$tor_cv_have_FUNCTION_macro" = 'yes'; then
1096   AC_DEFINE(HAVE_MACRO__FUNCTION__, 1,
1097            [Defined if the compiler supports __FUNCTION__])
1100 # $prefix stores the value of the --prefix command line option, or
1101 # NONE if the option wasn't set.  In the case that it wasn't set, make
1102 # it be the default, so that we can use it to expand directories now.
1103 if test "x$prefix" = "xNONE"; then
1104   prefix=$ac_default_prefix
1107 # and similarly for $exec_prefix
1108 if test "x$exec_prefix" = "xNONE"; then
1109   exec_prefix=$prefix
1112 if test "x$BUILDDIR" = "x"; then
1113   BUILDDIR=`pwd`
1115 AC_SUBST(BUILDDIR)
1116 AH_TEMPLATE([BUILDDIR],[tor's build directory])
1117 AC_DEFINE_UNQUOTED(BUILDDIR,"$BUILDDIR")
1119 if test "x$CONFDIR" = "x"; then
1120   CONFDIR=`eval echo $sysconfdir/tor`
1122 AC_SUBST(CONFDIR)
1123 AH_TEMPLATE([CONFDIR],[tor's configuration directory])
1124 AC_DEFINE_UNQUOTED(CONFDIR,"$CONFDIR")
1126 BINDIR=`eval echo $bindir`
1127 AC_SUBST(BINDIR)
1128 LOCALSTATEDIR=`eval echo $localstatedir`
1129 AC_SUBST(LOCALSTATEDIR)
1131 if test "$bwin32" = true; then
1132   # Test if the linker supports the --nxcompat and --dynamicbase options
1133   # for Windows
1134   save_LDFLAGS="$LDFLAGS"
1135   LDFLAGS="-Wl,--nxcompat -Wl,--dynamicbase"
1136   AC_MSG_CHECKING([whether the linker supports DllCharacteristics])
1137   AC_LINK_IFELSE([AC_LANG_PROGRAM([])],
1138     [AC_MSG_RESULT([yes])]
1139     [save_LDFLAGS="$save_LDFLAGS $LDFLAGS"],
1140     [AC_MSG_RESULT([no])]
1141   )
1142   LDFLAGS="$save_LDFLAGS"
1145 # Set CFLAGS _after_ all the above checks, since our warnings are stricter
1146 # than autoconf's macros like.
1147 if test "$GCC" = yes; then
1148   # Disable GCC's strict aliasing checks.  They are an hours-to-debug
1149   # accident waiting to happen.
1150   CFLAGS="$CFLAGS -Wall -fno-strict-aliasing"
1151 else
1152   # Autoconf sets -g -O2 by default. Override optimization level
1153   # for non-gcc compilers
1154   CFLAGS="$CFLAGS -O"
1155   enable_gcc_warnings=no
1156   enable_gcc_warnings_advisory=no
1159 # OS X Lion started deprecating the system openssl. Let's just disable
1160 # all deprecation warnings on OS X. Also, to potentially make the binary
1161 # a little smaller, let's enable dead_strip.
1162 case "$host_os" in
1164  darwin*)
1165     CFLAGS="$CFLAGS -Wno-deprecated-declarations"
1166     LDFLAGS="$LDFLAGS -dead_strip" ;;
1167 esac
1169 # Add some more warnings which we use in development but not in the
1170 # released versions.  (Some relevant gcc versions can't handle these.)
1171 if test x$enable_gcc_warnings = xyes || test x$enable_gcc_warnings_advisory = xyes; then
1173   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1174 #if !defined(__GNUC__) || (__GNUC__ < 4)
1175 #error
1176 #endif])], have_gcc4=yes, have_gcc4=no)
1178   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1179 #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 2)
1180 #error
1181 #endif])], have_gcc42=yes, have_gcc42=no)
1183   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1184 #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 3)
1185 #error
1186 #endif])], have_gcc43=yes, have_gcc43=no)
1188 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1189 #if !defined(__clang__)
1190 #error
1191 #endif])], have_clang=yes, have_clang=no)
1193   save_CFLAGS="$CFLAGS"
1194   CFLAGS="$CFLAGS -Wshorten-64-to-32"
1195   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], have_shorten64_flag=yes,
1196                     have_shorten64_flag=no)
1197   CFLAGS="$save_CFLAGS"
1199   case $host in
1200     *-*-openbsd*)
1201       # Some OpenBSD versions (like 4.8) have -Wsystem-headers by default.
1202       # That's fine, except that the headers don't pass -Wredundant-decls.
1203       # Therefore, let's disable -Wsystem-headers when we're building
1204       # with maximal warnings on OpenBSD.
1205       CFLAGS="$CFLAGS -Wno-system-headers" ;;
1206   esac
1208   CFLAGS="$CFLAGS -W -Wfloat-equal -Wundef -Wpointer-arith"
1209   CFLAGS="$CFLAGS -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings"
1210   CFLAGS="$CFLAGS -Wredundant-decls -Wchar-subscripts -Wcomment -Wformat=2"
1211   CFLAGS="$CFLAGS -Wwrite-strings -Wmissing-declarations -Wredundant-decls"
1212   CFLAGS="$CFLAGS -Wnested-externs -Wbad-function-cast -Wswitch-enum"
1214   if test x$enable_gcc_warnings = xyes; then
1215     CFLAGS="$CFLAGS -Werror"
1216   fi
1218   # Disabled, so we can use mallinfo(): -Waggregate-return
1220   if test x$have_gcc4 = xyes ; then
1221     # These warnings break gcc 3.3.5 and work on gcc 4.0.2
1222     CFLAGS="$CFLAGS -Winit-self -Wmissing-field-initializers -Wdeclaration-after-statement -Wold-style-definition"
1223   fi
1225   if test x$have_gcc42 = xyes ; then
1226     # These warnings break gcc 4.0.2 and work on gcc 4.2
1227     # XXXX020 See if any of these work with earlier versions.
1228     CFLAGS="$CFLAGS -Waddress -Wmissing-noreturn -Wstrict-overflow=1"
1230     # We used to use -Wstrict-overflow=5, but that breaks us heavily under 4.3.
1231   fi
1233   if test x$have_gcc42 = xyes && test x$have_clang = xno; then
1234     # These warnings break gcc 4.0.2 and clang, but work on gcc 4.2
1235     CFLAGS="$CFLAGS -Wnormalized=id -Woverride-init"
1236   fi
1238   if test x$have_gcc43 = xyes ; then
1239     # These warnings break gcc 4.2 and work on gcc 4.3
1240     # XXXX020 See if any of these work with earlier versions.
1241     CFLAGS="$CFLAGS -Wextra -Warray-bounds"
1242   fi
1244   if test x$have_shorten64_flag = xyes ; then
1245     CFLAGS="$CFLAGS -Wshorten-64-to-32"
1246   fi
1248 ##This will break the world on some 64-bit architectures
1249 # CFLAGS="$CFLAGS -Winline"
1254 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent $TOR_CPPFLAGS_openssl $TOR_CPPFLAGS_zlib"
1256 AC_CONFIG_FILES([
1257         Doxyfile
1258         Makefile
1259         contrib/Makefile
1260         contrib/suse/Makefile
1261         contrib/suse/tor.sh
1262         contrib/tor.logrotate
1263         contrib/tor.sh
1264         contrib/torctl
1265         contrib/torify
1266         doc/Makefile
1267         src/Makefile
1268         src/common/Makefile
1269         src/config/Makefile
1270         src/config/torrc.sample
1271         src/or/Makefile
1272         src/test/Makefile
1273         src/tools/Makefile
1274         src/tools/tor-fw-helper/Makefile
1275         src/win32/Makefile
1276         tor.spec
1279 AC_OUTPUT
1281 if test -x /usr/bin/perl && test -x ./contrib/updateVersions.pl ; then
1282   ./contrib/updateVersions.pl