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