Merge branch 'maint-0.2.2'
[tor.git] / configure.in
blobe5db37060f537e095eca595848e46e41056d60a7
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.1-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 AC_ARG_ENABLE(bufferevents,
149      AS_HELP_STRING(--enable-bufferevents, use Libevent's buffered IO.))
151 AC_PROG_CC
152 AC_PROG_CPP
153 AC_PROG_MAKE_SET
154 AC_PROG_RANLIB
156 dnl autoconf 2.59 appears not to support AC_PROG_SED
157 AC_CHECK_PROG([SED],[sed],[sed],[/bin/false])
159 dnl check for asciidoc and a2x
160 AC_PATH_PROG([ASCIIDOC], [asciidoc], none)
161 AC_PATH_PROG([A2X], [a2x], none)
163 AM_CONDITIONAL(USE_ASCIIDOC, test x$asciidoc = xtrue)
165 AM_CONDITIONAL(USE_FW_HELPER, test x$natpmp = xtrue || test x$upnp = xtrue)
166 AM_CONDITIONAL(NAT_PMP, test x$natpmp = xtrue)
167 AM_CONDITIONAL(MINIUPNPC, test x$upnp = xtrue)
168 AM_PROG_CC_C_O
170 ifdef([AC_C_FLEXIBLE_ARRAY_MEMBER], [
171 AC_C_FLEXIBLE_ARRAY_MEMBER
172 ], [
173  dnl Maybe we've got an old autoconf...
174  AC_CACHE_CHECK([for flexible array members],
175      tor_cv_c_flexarray,
176      [AC_COMPILE_IFELSE(
177        AC_LANG_PROGRAM([
178  struct abc { int a; char b[]; };
179 ], [
180  struct abc *def = malloc(sizeof(struct abc)+sizeof(char));
181  def->b[0] = 33;
183   [tor_cv_c_flexarray=yes],
184   [tor_cv_c_flexarray=no])])
185  if test $tor_cv_flexarray = yes ; then
186    AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [])
187  else
188    AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [1])
189  fi
192 AC_PATH_PROG([SHA1SUM], [sha1sum], none)
193 AC_PATH_PROG([OPENSSL], [openssl], none)
195 TORUSER=_tor
196 AC_ARG_WITH(tor-user,
197         [  --with-tor-user=NAME    Specify username for tor daemon ],
198         [
199            TORUSER=$withval
200         ]
202 AC_SUBST(TORUSER)
204 TORGROUP=_tor
205 AC_ARG_WITH(tor-group,
206         [  --with-tor-group=NAME   Specify group name for tor daemon ],
207         [
208            TORGROUP=$withval
209         ]
211 AC_SUBST(TORGROUP)
214 dnl If WIN32 is defined and non-zero, we are building for win32
215 AC_MSG_CHECKING([for win32])
216 AC_RUN_IFELSE([AC_LANG_SOURCE([
217 int main(int c, char **v) {
218 #ifdef WIN32
219 #if WIN32
220   return 0;
221 #else
222   return 1;
223 #endif
224 #else
225   return 2;
226 #endif
227 }])],
228 bwin32=true; AC_MSG_RESULT([yes]),
229 bwin32=false; AC_MSG_RESULT([no]),
230 bwin32=cross; AC_MSG_RESULT([cross])
233 if test "$bwin32" = cross; then
234 AC_MSG_CHECKING([for win32 (cross)])
235 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
236 #ifdef WIN32
237 int main(int c, char **v) {return 0;}
238 #else
239 #error
240 int main(int c, char **v) {return x(y);}
241 #endif
242 ])],
243 bwin32=true; AC_MSG_RESULT([yes]),
244 bwin32=false; AC_MSG_RESULT([no]))
247 if test "$bwin32" = true; then
248 AC_DEFINE(MS_WINDOWS, 1, [Define to 1 if we are building for Windows.])
250 AM_CONDITIONAL(BUILD_NT_SERVICES, test x$bwin32 = xtrue)
252 dnl Enable C99 when compiling with MIPSpro
253 AC_MSG_CHECKING([for MIPSpro compiler])
254 AC_COMPILE_IFELSE([AC_LANG_PROGRAM(, [
255 #if (defined(__sgi) && defined(_COMPILER_VERSION))
256 #error
257   return x(y);
258 #endif
259 ])],
260 bmipspro=false; AC_MSG_RESULT(no),
261 bmipspro=true; AC_MSG_RESULT(yes))
263 if test "$bmipspro" = true; then
264   CFLAGS="$CFLAGS -c99"
267 AC_C_BIGENDIAN
269 AC_SEARCH_LIBS(socket, [socket])
270 AC_SEARCH_LIBS(gethostbyname, [nsl])
271 AC_SEARCH_LIBS(dlopen, [dl])
272 AC_SEARCH_LIBS(inet_aton, [resolv])
274 if test "$enable_threads" = "yes"; then
275   AC_SEARCH_LIBS(pthread_create, [pthread])
276   AC_SEARCH_LIBS(pthread_detach, [pthread])
279 dnl -------------------------------------------------------------------
280 dnl Check for functions before libevent, since libevent-1.2 apparently
281 dnl exports strlcpy without defining it in a header.
283 AC_CHECK_FUNCS(
284         accept4 \
285         flock \
286         ftime \
287         getaddrinfo \
288         getrlimit \
289         gettimeofday \
290         gmtime_r \
291         inet_aton \
292         localtime_r \
293         memmem \
294         prctl \
295         socketpair \
296         strlcat \
297         strlcpy \
298         strptime \
299         strtok_r \
300         strtoull \
301         sysconf \
302         uname \
303         vasprintf \
306 using_custom_malloc=no
307 if test x$enable_openbsd_malloc = xyes ; then
308    AC_DEFINE(HAVE_MALLOC_GOOD_SIZE, 1, [Defined if we have the malloc_good_size function])
309    using_custom_malloc=yes
311 if test x$tcmalloc = xyes ; then
312    using_custom_malloc=yes
314 if test $using_custom_malloc = no ; then
315    AC_CHECK_FUNCS(mallinfo malloc_good_size malloc_usable_size)
318 if test "$enable_threads" = "yes"; then
319   AC_CHECK_HEADERS(pthread.h)
320   AC_CHECK_FUNCS(pthread_create)
323 dnl ------------------------------------------------------
324 dnl Where do you live, libevent?  And how do we call you?
326 if test "$bwin32" = true; then
327   TOR_LIB_WS32=-lws2_32
328   # Some of the cargo-cults recommend -lwsock32 as well, but I don't
329   # think it's actually necessary.
330   TOR_LIB_GDI=-lgdi32
331 else
332   TOR_LIB_WS32=
333   TOR_LIB_GDI=
335 AC_SUBST(TOR_LIB_WS32)
336 AC_SUBST(TOR_LIB_GDI)
338 dnl We need to do this before we try our disgusting hack below.
339 AC_CHECK_HEADERS([sys/types.h])
341 dnl This is a disgusting hack so we safely include older libevent headers.
342 AC_CHECK_TYPE(u_int64_t, unsigned long long)
343 AC_CHECK_TYPE(u_int32_t, unsigned long)
344 AC_CHECK_TYPE(u_int16_t, unsigned short)
345 AC_CHECK_TYPE(u_int8_t, unsigned char)
347 tor_libevent_pkg_redhat="libevent"
348 tor_libevent_pkg_debian="libevent-dev"
349 tor_libevent_devpkg_redhat="libevent-devel"
350 tor_libevent_devpkg_debian="libevent-dev"
352 dnl On Gnu/Linux or any place we require it, we'll add librt to the Libevent
353 dnl linking for static builds.
354 STATIC_LIBEVENT_FLAGS=""
355 if test "$enable_static_libevent" = "yes"; then
356     dnl Determine if we have clock_gettime in librt
357     AC_SEARCH_LIBS([clock_gettime], [rt],
358         [have_rt=yes])
359     if test "$have_rt" = yes; then
360       STATIC_LIBEVENT_FLAGS=" -lrt "
361     fi
364 TOR_SEARCH_LIBRARY(libevent, $trylibeventdir, [-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32], [
365 #ifdef WIN32
366 #include <winsock2.h>
367 #endif
368 #include <stdlib.h>
369 #include <sys/time.h>
370 #include <sys/types.h>
371 #include <event.h>], [
372 #ifdef WIN32
373 #include <winsock2.h>
374 #endif
375 void exit(int); void *event_init(void);],
376     [
377 #ifdef WIN32
378 {WSADATA d; WSAStartup(0x101,&d); }
379 #endif
380 event_init(); exit(0);
381 ], [--with-libevent-dir], [/opt/libevent])
383 dnl Now check for particular libevent functions.
384 save_LIBS="$LIBS"
385 save_LDFLAGS="$LDFLAGS"
386 save_CPPFLAGS="$CPPFLAGS"
387 LIBS="-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32 $LIBS"
388 LDFLAGS="$TOR_LDFLAGS_libevent $LDFLAGS"
389 CPPFLAGS="$TOR_CPPFLAGS_libevent $CPPFLAGS"
390 AC_CHECK_FUNCS(event_get_version event_get_version_number event_get_method event_set_log_callback evdns_set_outgoing_bind_address event_base_loopexit)
391 AC_CHECK_MEMBERS([struct event.min_heap_idx], , ,
392 [#include <event.h>
395 AC_CHECK_HEADERS(event2/event.h event2/dns.h event2/bufferevent_ssl.h)
397 LIBS="$save_LIBS"
398 LDFLAGS="$save_LDFLAGS"
399 CPPFLAGS="$save_CPPFLAGS"
402 AM_CONDITIONAL(USE_EXTERNAL_EVDNS, test x$ac_cv_header_event2_dns_h = xyes)
404 if test "$enable_static_libevent" = "yes"; then
405    if test "$tor_cv_library_libevent_dir" = "(system)"; then
406      AC_MSG_ERROR("You must specify an explicit --with-libevent-dir=x option when using --enable-static-libevent")
407    else
408      TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent.a $STATIC_LIBEVENT_FLAGS"
409    fi
410 else
411      TOR_LIBEVENT_LIBS="-levent"
414 dnl This isn't the best test for Libevent 2.0.3-alpha.  Once it's released,
415 dnl we can do much better.
416 if test "$enable_bufferevents" = "yes" ; then
417   if test "$ac_cv_header_event2_bufferevent_ssl_h" != "yes" ; then
418     AC_MSG_ERROR([You've asked for bufferevent support, but you're using a version of Libevent without SSL support.  This won't work.  We need Libevent 2.0.8-rc or later, and you don't seem to even have Libevent 2.0.3-alpha.])
419   else
421     CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent"
423     # Check for the right version.  First see if version detection works.
424     AC_MSG_CHECKING([whether we can detect the Libevent version])
425     AC_COMPILE_IFELSE([AC_LANG_SOURCE([
426 #include <event2/event.h>
427 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 10
428 #error
429 int x = y(zz);
430 #else
431 int x = 1;
432 #endif
433   ])], [event_version_number_works=yes; AC_MSG_RESULT([yes]) ],
434      [event_version_number_works=no;  AC_MSG_RESULT([no])])
435     if test "$event_version_number_works" != 'yes'; then
436       AC_MSG_WARN([Version detection on Libevent seems broken.  Your Libevent installation is probably screwed up or very old.])
437     else
438       AC_MSG_CHECKING([whether Libevent is new enough for bufferevents])
439       AC_COMPILE_IFELSE([AC_LANG_SOURCE([
440 #include <event2/event.h>
441 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 0x02000800
442 #error
443 int x = y(zz);
444 #else
445 int x = 1;
446 #endif
447    ])], [ AC_MSG_RESULT([yes]) ],
448       [ AC_MSG_RESULT([no])
449         AC_MSG_ERROR([Libevent does not seem new enough to support bufferevents.  We require 2.0.8-rc or later]) ] )
450     fi
451   fi
454 LIBS="$save_LIBS"
455 LDFLAGS="$save_LDFLAGS"
456 CPPFLAGS="$save_CPPFLAGS"
458 AM_CONDITIONAL(USE_BUFFEREVENTS, test "$enable_bufferevents" = "yes")
459 if test "$enable_bufferevents" = "yes"; then
460   AC_DEFINE(USE_BUFFEREVENTS, 1, [Defined if we're going to use Libevent's buffered IO API])
461   if test "$enable_static_libevent" = "yes"; then
462     TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent_openssl.a $TOR_LIBEVENT_LIBS"
463   else
464     TOR_LIBEVENT_LIBS="-levent_openssl $TOR_LIBEVENT_LIBS"
465   fi
467 AC_SUBST(TOR_LIBEVENT_LIBS)
469 dnl ------------------------------------------------------
470 dnl Where do you live, openssl?  And how do we call you?
472 tor_openssl_pkg_redhat="openssl"
473 tor_openssl_pkg_debian="libssl"
474 tor_openssl_devpkg_redhat="openssl-devel"
475 tor_openssl_devpkg_debian="libssl-dev"
477 ALT_openssl_WITHVAL=""
478 AC_ARG_WITH(ssl-dir,
479   [  --with-ssl-dir=PATH    Obsolete alias for --with-openssl-dir ],
480   [
481       if test "x$withval" != xno && test "x$withval" != "x" ; then
482          ALT_openssl_WITHVAL="$withval"
483       fi
484   ])
486 TOR_SEARCH_LIBRARY(openssl, $tryssldir, [-lssl -lcrypto $TOR_LIB_GDI],
487     [#include <openssl/rand.h>],
488     [void RAND_add(const void *buf, int num, double entropy);],
489     [RAND_add((void*)0,0,0); exit(0);], [],
490     [/usr/local/openssl /usr/lib/openssl /usr/local/ssl /usr/lib/ssl /usr/local /usr/athena /opt/openssl])
492 dnl XXXX check for OPENSSL_VERSION_NUMBER == SSLeay()
494 echo "tor_cv_library_openssl_dir is $tor_cv_library_openssl_dir"
495 if test "$enable_static_openssl" = "yes"; then
496    if test "$tor_cv_library_openssl_dir" = "(system)"; then
497      AC_MSG_ERROR("You must specify an explicit --with-openssl-dir=x option when using --enable-static-openssl")
498    else
499      TOR_OPENSSL_LIBS="$TOR_LIBDIR_openssl/libssl.a $TOR_LIBDIR_openssl/libcrypto.a"
500    fi
501 else
502      TOR_OPENSSL_LIBS="-lssl -lcrypto"
504 AC_SUBST(TOR_OPENSSL_LIBS)
506 dnl ------------------------------------------------------
507 dnl Where do you live, zlib?  And how do we call you?
509 tor_zlib_pkg_redhat="zlib"
510 tor_zlib_pkg_debian="zlib1g"
511 tor_zlib_devpkg_redhat="zlib-devel"
512 tor_zlib_devpkg_debian="zlib1g-dev"
514 TOR_SEARCH_LIBRARY(zlib, $tryzlibdir, [-lz],
515     [#include <zlib.h>],
516     [const char * zlibVersion(void);],
517     [zlibVersion(); exit(0);], [--with-zlib-dir],
518     [/opt/zlib])
520 if test "$enable_static_zlib" = "yes"; then
521    if test "$tor_cv_library_zlib_dir" = "(system)"; then
522      AC_MSG_ERROR("You must specify an explicit --with-zlib-dir=x option when
523  using --enable-static-zlib")
524    else
525      TOR_ZLIB_LIBS="$TOR_LIBDIR_zlib/libz.a"
526      echo "$TOR_LIBDIR_zlib/libz.a"
527    fi
528 else
529      TOR_ZLIB_LIBS="-lz"
531 AC_SUBST(TOR_ZLIB_LIBS)
533 dnl Make sure to enable support for large off_t if available.
536 dnl ------------------------------------------------------
537 dnl Where do you live, libnatpmp?  And how do we call you?
538 dnl There are no packages for Debian or Redhat as of this patch
540 if test "$natpmp" = "true"; then
541     AC_DEFINE(NAT_PMP, 1, [Define to 1 if we are building with nat-pmp.])
542     TOR_SEARCH_LIBRARY(libnatpmp, $trylibnatpmpdir, [-lnatpmp],
543         [#include <natpmp.h>],
544         [#include <natpmp.h>],
545         [   int r;
546             natpmp_t natpmp;
547             natpmpresp_t response;
548             r = initnatpmp(&natpmp);],
549             [printf("initnatpmp() returned %d (%s)\n", r, r?"FAILED":"SUCCESS");
550             exit(0);],
551         [--with-libnatpmp-dir],
552         [/usr/lib/])
556 dnl ------------------------------------------------------
557 dnl Where do you live, libminiupnpc?  And how do we call you?
558 dnl There are no packages for Debian or Redhat as of this patch
560 if test "$upnp" = "true"; then
561     AC_DEFINE(MINIUPNPC, 1, [Define to 1 if we are building with UPnP.])
562     TOR_SEARCH_LIBRARY(libminiupnpc, $trylibminiupnpcdir, [-lminiupnpc],
563         [#include <miniupnpc/miniwget.h>
564          #include <miniupnpc/miniupnpc.h>
565          #include <miniupnpc/upnpcommands.h>],
566         [void upnpDiscover(int delay, const char * multicastif,
567          const char * minissdpdsock, int sameport);],
568         [upnpDiscover(1, 0, 0, 0); exit(0);],
569         [--with-libminiupnpc-dir],
570         [/usr/lib/])
573 AC_SYS_LARGEFILE
575 AC_CHECK_HEADERS(
576         assert.h \
577         errno.h \
578         fcntl.h \
579         signal.h \
580         string.h \
581         sys/fcntl.h \
582         sys/stat.h \
583         sys/time.h \
584         sys/types.h \
585         time.h \
586         unistd.h
587  , , AC_MSG_WARN(Some headers were not found, compilation may fail.  If compilation succeeds, please send your orconfig.h to the developers so we can fix this warning.))
589 dnl These headers are not essential
591 AC_CHECK_HEADERS(
592         arpa/inet.h \
593         grp.h \
594         inttypes.h \
595         limits.h \
596         linux/types.h \
597         machine/limits.h \
598         malloc.h \
599         malloc/malloc.h \
600         malloc_np.h \
601         netdb.h \
602         netinet/in.h \
603         netinet/in6.h \
604         pwd.h \
605         stdint.h \
606         sys/file.h \
607         sys/ioctl.h \
608         sys/limits.h \
609         sys/mman.h \
610         sys/param.h \
611         sys/prctl.h \
612         sys/resource.h \
613         sys/socket.h \
614         sys/syslimits.h \
615         sys/time.h \
616         sys/types.h \
617         sys/un.h \
618         sys/utime.h \
619         sys/wait.h \
620         syslog.h \
621         utime.h
624 TOR_CHECK_PROTOTYPE(malloc_good_size, HAVE_MALLOC_GOOD_SIZE_PROTOTYPE,
625 [#ifdef HAVE_MALLOC_H
626 #include <malloc.h>
627 #endif
628 #ifdef HAVE_MALLOC_MALLOC_H
629 #include <malloc/malloc.h>
630 #endif])
632 AC_CHECK_HEADERS(net/if.h, net_if_found=1, net_if_found=0,
633 [#ifdef HAVE_SYS_TYPES_H
634 #include <sys/types.h>
635 #endif
636 #ifdef HAVE_SYS_SOCKET_H
637 #include <sys/socket.h>
638 #endif])
639 AC_CHECK_HEADERS(net/pfvar.h, net_pfvar_found=1, net_pfvar_found=0,
640 [#ifdef HAVE_SYS_TYPES_H
641 #include <sys/types.h>
642 #endif
643 #ifdef HAVE_SYS_SOCKET_H
644 #include <sys/socket.h>
645 #endif
646 #ifdef HAVE_NET_IF_H
647 #include <net/if.h>
648 #endif])
649 AC_CHECK_HEADERS(linux/netfilter_ipv4.h,
650         linux_netfilter_ipv4=1, linux_netfilter_ipv4=0,
651 [#ifdef HAVE_SYS_TYPES_H
652 #include <sys/types.h>
653 #endif
654 #ifdef HAVE_SYS_SOCKET_H
655 #include <sys/socket.h>
656 #endif
657 #ifdef HAVE_LIMITS_H
658 #include <limits.h>
659 #endif
660 #ifdef HAVE_LINUX_TYPES_H
661 #include <linux/types.h>
662 #endif
663 #ifdef HAVE_NETINET_IN6_H
664 #include <netinet/in6.h>
665 #endif
666 #ifdef HAVE_NETINET_IN_H
667 #include <netinet/in.h>
668 #endif])
670 if test x$transparent = xtrue ; then
671    transparent_ok=0
672    if test x$net_if_found = x1 && test x$net_pfvar_found = x1 ; then
673      transparent_ok=1
674    fi
675    if test x$linux_netfilter_ipv4 = x1 ; then
676      transparent_ok=1
677    fi
678    if test x$transparent_ok = x1 ; then
679      AC_DEFINE(USE_TRANSPARENT, 1, "Define to enable transparent proxy support")
680      case $host in
681        *-*-openbsd*)
682          AC_DEFINE(OPENBSD, 1, "Define to handle pf on OpenBSD properly") ;;
683      esac
684    else
685      AC_MSG_NOTICE([Transparent proxy support enabled, but missing headers.])
686    fi
689 AC_CHECK_MEMBERS([struct timeval.tv_sec], , ,
690 [#ifdef HAVE_SYS_TYPES_H
691 #include <sys/types.h>
692 #endif
693 #ifdef HAVE_SYS_TIME_H
694 #include <sys/time.h>
695 #endif])
697 dnl In case we aren't given a working stdint.h, we'll need to grow our own.
698 dnl Watch out.
700 AC_CHECK_SIZEOF(int8_t)
701 AC_CHECK_SIZEOF(int16_t)
702 AC_CHECK_SIZEOF(int32_t)
703 AC_CHECK_SIZEOF(int64_t)
704 AC_CHECK_SIZEOF(uint8_t)
705 AC_CHECK_SIZEOF(uint16_t)
706 AC_CHECK_SIZEOF(uint32_t)
707 AC_CHECK_SIZEOF(uint64_t)
708 AC_CHECK_SIZEOF(intptr_t)
709 AC_CHECK_SIZEOF(uintptr_t)
711 dnl AC_CHECK_TYPES([int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t, uint64_t, intptr_t, uintptr_t])
713 AC_CHECK_SIZEOF(char)
714 AC_CHECK_SIZEOF(short)
715 AC_CHECK_SIZEOF(int)
716 AC_CHECK_SIZEOF(long)
717 AC_CHECK_SIZEOF(long long)
718 AC_CHECK_SIZEOF(__int64)
719 AC_CHECK_SIZEOF(void *)
720 AC_CHECK_SIZEOF(time_t)
721 AC_CHECK_SIZEOF(size_t)
723 AC_CHECK_TYPES([uint, u_char, ssize_t])
725 dnl used to include sockaddr_storage, but everybody has that.
726 AC_CHECK_TYPES([struct in6_addr, struct sockaddr_in6, sa_family_t], , ,
727 [#ifdef HAVE_SYS_TYPES_H
728 #include <sys/types.h>
729 #endif
730 #ifdef HAVE_NETINET_IN_H
731 #include <netinet/in.h>
732 #endif
733 #ifdef HAVE_NETINET_IN6_H
734 #include <netinet/in6.h>
735 #endif
736 #ifdef HAVE_SYS_SOCKET_H
737 #include <sys/socket.h>
738 #endif
739 #ifdef MS_WINDOWS
740 #define WIN32_WINNT 0x400
741 #define _WIN32_WINNT 0x400
742 #define WIN32_LEAN_AND_MEAN
743 #if defined(_MSC_VER) && (_MSC_VER < 1300)
744 #include <winsock.h>
745 #else
746 #include <winsock2.h>
747 #include <ws2tcpip.h>
748 #endif
749 #endif
751 AC_CHECK_MEMBERS([struct in6_addr.s6_addr32, struct in6_addr.s6_addr16, struct sockaddr_in.sin_len, struct sockaddr_in6.sin6_len], , ,
752 [#ifdef HAVE_SYS_TYPES_H
753 #include <sys/types.h>
754 #endif
755 #ifdef HAVE_NETINET_IN_H
756 #include <netinet/in.h>
757 #endif
758 #ifdef HAVE_NETINET_IN6_H
759 #include <netinet/in6.h>
760 #endif
761 #ifdef HAVE_SYS_SOCKET_H
762 #include <sys/socket.h>
763 #endif
764 #ifdef MS_WINDOWS
765 #define WIN32_WINNT 0x400
766 #define _WIN32_WINNT 0x400
767 #define WIN32_LEAN_AND_MEAN
768 #if defined(_MSC_VER) && (_MSC_VER < 1300)
769 #include <winsock.h>
770 #else
771 #include <winsock2.h>
772 #include <ws2tcpip.h>
773 #endif
774 #endif
777 AC_CHECK_TYPES([rlim_t], , ,
778 [#ifdef HAVE_SYS_TYPES_H
779 #include <sys/types.h>
780 #endif
781 #ifdef HAVE_SYS_TIME_H
782 #include <sys/time.h>
783 #endif
784 #ifdef HAVE_SYS_RESOURCE_H
785 #include <sys/resource.h>
786 #endif
789 AC_CACHE_CHECK([whether time_t is signed], tor_cv_time_t_signed, [
790 AC_RUN_IFELSE([AC_LANG_SOURCE([
791 #ifdef HAVE_SYS_TYPES_H
792 #include <sys/types.h>
793 #endif
794 #ifdef HAVE_SYS_TIME_H
795 #include <sys/time.h>
796 #endif
797 #ifdef HAVE_TIME_H
798 #include <time.h>
799 #endif
800 int main(int c, char**v) { if (((time_t)-1)<0) return 1; else return 0; }])],
801   tor_cv_time_t_signed=no, tor_cv_time_t_signed=yes, tor_cv_time_t_signed=cross)
804 if test "$tor_cv_time_t_signed" = cross; then
805   AC_MSG_NOTICE([Cross compiling: assuming that time_t is signed.])
808 if test "$tor_cv_time_t_signed" != no; then
809   AC_DEFINE([TIME_T_IS_SIGNED], 1,
810             [Define to 1 iff time_t is signed])
813 AC_CACHE_CHECK([whether size_t is signed], tor_cv_size_t_signed, [
814 AC_RUN_IFELSE([AC_LANG_SOURCE([
815 #ifdef HAVE_SYS_TYPES_H
816 #include <sys/types.h>
817 #endif
818 int main(int c, char**v) { if (((size_t)-1)<0) return 1; else return 0; }])],
819   tor_cv_size_t_signed=no, tor_cv_size_t_signed=yes, tor_cv_size_t_signed=cross)
822 if test "$tor_cv_size_t_signed" = cross; then
823   AC_MSG_NOTICE([Cross compiling: assuming that size_t is not signed.])
826 if test "$tor_cv_size_t_signed" = yes; then
827   AC_MSG_ERROR([You have a signed size_t; that's grossly nonconformant.])
830 AC_CHECK_SIZEOF(socklen_t, , [AC_INCLUDES_DEFAULT()
831 #ifdef HAVE_SYS_SOCKET_H
832 #include <sys/socket.h>
833 #endif
836 # We want to make sure that we _don't_ have a cell_t defined, like IRIX does.
838 AC_CHECK_SIZEOF(cell_t)
840 # Now make sure that NULL can be represented as zero bytes.
841 AC_CACHE_CHECK([whether memset(0) sets pointers to NULL], tor_cv_null_is_zero,
842 [AC_RUN_IFELSE([AC_LANG_SOURCE(
843 [[#include <stdlib.h>
844 #include <string.h>
845 #include <stdio.h>
846 #ifdef HAVE_STDDEF_H
847 #include <stddef.h>
848 #endif
849 int main () { char *p1,*p2; p1=NULL; memset(&p2,0,sizeof(p2));
850 return memcmp(&p1,&p2,sizeof(char*))?1:0; }]])],
851        [tor_cv_null_is_zero=yes],
852        [tor_cv_null_is_zero=no],
853        [tor_cv_null_is_zero=cross])])
855 if test "$tor_cv_null_is_zero" = cross ; then
856   # Cross-compiling; let's hope that the target isn't raving mad.
857   AC_MSG_NOTICE([Cross-compiling: we'll assume that NULL is represented as a sequence of 0-valued bytes.])
860 if test "$tor_cv_null_is_zero" != no; then
861   AC_DEFINE([NULL_REP_IS_ZERO_BYTES], 1,
862             [Define to 1 iff memset(0) sets pointers to NULL])
865 # And what happens when we malloc zero?
866 AC_CACHE_CHECK([whether we can malloc(0) safely.], tor_cv_malloc_zero_works,
867 [AC_RUN_IFELSE([AC_LANG_SOURCE(
868 [[#include <stdlib.h>
869 #include <string.h>
870 #include <stdio.h>
871 #ifdef HAVE_STDDEF_H
872 #include <stddef.h>
873 #endif
874 int main () { return malloc(0)?0:1; }]])],
875        [tor_cv_malloc_zero_works=yes],
876        [tor_cv_malloc_zero_works=no],
877        [tor_cv_malloc_zero_works=cross])])
879 if test "$tor_cv_malloc_zero_works" = cross; then
880   # Cross-compiling; let's hope that the target isn't raving mad.
881   AC_MSG_NOTICE([Cross-compiling: we'll assume that we need to check malloc() arguments for 0.])
884 if test "$tor_cv_malloc_zero_works" = yes; then
885   AC_DEFINE([MALLOC_ZERO_WORKS], 1,
886             [Define to 1 iff malloc(0) returns a pointer])
889 # whether we seem to be in a 2s-complement world.
890 AC_CACHE_CHECK([whether we are using 2s-complement arithmetic], tor_cv_twos_complement,
891 [AC_RUN_IFELSE([AC_LANG_SOURCE(
892 [[int main () { int problem = ((-99) != (~99)+1);
893 return problem ? 1 : 0; }]])],
894        [tor_cv_twos_complement=yes],
895        [tor_cv_twos_complement=no],
896        [tor_cv_twos_complement=cross])])
898 if test "$tor_cv_twos_complement" = cross ; then
899   # Cross-compiling; let's hope that the target isn't raving mad.
900   AC_MSG_NOTICE([Cross-compiling: we'll assume that negative integers are represented with two's complement.])
903 if test "$tor_cv_twos_complement" != no ; then
904   AC_DEFINE([USING_TWOS_COMPLEMENT], 1,
905             [Define to 1 iff we represent negative integers with two's complement])
908 # What does shifting a negative value do?
909 AC_CACHE_CHECK([whether right-shift on negative values does sign-extension], tor_cv_sign_extend,
910 [AC_RUN_IFELSE([AC_LANG_SOURCE(
911 [[int main () { int okay = (-60 >> 8) == -1; return okay ? 0 : 1; }]])],
912        [tor_cv_sign_extend=yes],
913        [tor_cv_sign_extend=no],
914        [tor_cv_sign_extend=cross])])
916 if test "$tor_cv_sign_extend" = cross ; then
917   # Cross-compiling; let's hope that the target isn't raving mad.
918   AC_MSG_NOTICE([Cross-compiling: we'll assume that right-shifting negative integers causes sign-extension])
921 if test "$tor_cv_sign_extend" != no ; then
922   AC_DEFINE([RSHIFT_DOES_SIGN_EXTEND], 1,
923             [Define to 1 iff right-shifting a negative value performs sign-extension])
926 # Whether we should use the dmalloc memory allocation debugging library.
927 AC_MSG_CHECKING(whether to use dmalloc (debug memory allocation library))
928 AC_ARG_WITH(dmalloc,
929 [  --with-dmalloc          Use debug memory allocation library. ],
930 [if [[ "$withval" = "yes" ]]; then
931   dmalloc=1
932   AC_MSG_RESULT(yes)
933 else
934   dmalloc=1
935   AC_MSG_RESULT(no)
936 fi], [ dmalloc=0; AC_MSG_RESULT(no) ]
939 if [[ $dmalloc -eq 1 ]]; then
940   AC_CHECK_HEADERS(dmalloc.h, , AC_MSG_ERROR(dmalloc header file not found. Do you have the development files for dmalloc installed?))
941   AC_SEARCH_LIBS(dmalloc_malloc, [dmallocth dmalloc], , AC_MSG_ERROR(Libdmalloc library not found. If you enable it you better have it installed.))
942   AC_DEFINE(USE_DMALLOC, 1, [Debug memory allocation library])
943   AC_DEFINE(DMALLOC_FUNC_CHECK, 1, [Enable dmalloc's malloc function check])
944   AC_CHECK_FUNCS(dmalloc_strdup dmalloc_strndup)
947 AC_ARG_WITH(tcmalloc,
948 [  --with-tcmalloc         Use tcmalloc memory allocation library. ],
949 [ tcmalloc=yes ], [ tcmalloc=no ])
951 if test x$tcmalloc = xyes ; then
952    LDFLAGS="-ltcmalloc $LDFLAGS"
955 # By default, we're going to assume we don't have mlockall()
956 # bionic and other platforms have various broken mlockall subsystems.
957 # Some systems don't have a working mlockall, some aren't linkable,
958 # and some have it but don't declare it.
959 AC_CHECK_FUNCS(mlockall)
960 AC_CHECK_DECLS([mlockall], , , [
961 #ifdef HAVE_SYS_MMAN_H
962 #include <sys/mman.h>
963 #endif])
965 # Allow user to specify an alternate syslog facility
966 AC_ARG_WITH(syslog-facility,
967 [  --with-syslog-facility=LOG syslog facility to use (default=LOG_DAEMON)],
968 syslog_facility="$withval", syslog_facility="LOG_DAEMON")
969 AC_DEFINE_UNQUOTED(LOGFACILITY,$syslog_facility,[name of the syslog facility])
970 AC_SUBST(LOGFACILITY)
972 # Check if we have getresuid and getresgid
973 AC_CHECK_FUNCS(getresuid getresgid)
975 # Check for gethostbyname_r in all its glorious incompatible versions.
976 #   (This logic is based on that in Python's configure.in)
977 AH_TEMPLATE(HAVE_GETHOSTBYNAME_R,
978   [Define this if you have any gethostbyname_r()])
980 AC_CHECK_FUNC(gethostbyname_r, [
981   AC_MSG_CHECKING([how many arguments gethostbyname_r() wants])
982   OLD_CFLAGS=$CFLAGS
983   CFLAGS="$CFLAGS $MY_CPPFLAGS $MY_THREAD_CPPFLAGS $MY_CFLAGS"
984   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
985 #include <netdb.h>
986   ], [[
987     char *cp1, *cp2;
988     struct hostent *h1, *h2;
989     int i1, i2;
990     (void)gethostbyname_r(cp1,h1,cp2,i1,&h2,&i2);
991   ]])],[
992     AC_DEFINE(HAVE_GETHOSTBYNAME_R)
993     AC_DEFINE(HAVE_GETHOSTBYNAME_R_6_ARG, 1,
994      [Define this if gethostbyname_r takes 6 arguments])
995     AC_MSG_RESULT(6)
996   ], [
997     AC_TRY_COMPILE([
998 #include <netdb.h>
999     ], [
1000       char *cp1, *cp2;
1001       struct hostent *h1;
1002       int i1, i2;
1003       (void)gethostbyname_r(cp1,h1,cp2,i1,&i2);
1004     ], [
1005       AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1006       AC_DEFINE(HAVE_GETHOSTBYNAME_R_5_ARG, 1,
1007         [Define this if gethostbyname_r takes 5 arguments])
1008       AC_MSG_RESULT(5)
1009    ], [
1010       AC_TRY_COMPILE([
1011 #include <netdb.h>
1012      ], [
1013        char *cp1;
1014        struct hostent *h1;
1015        struct hostent_data hd;
1016        (void) gethostbyname_r(cp1,h1,&hd);
1017      ], [
1018        AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1019        AC_DEFINE(HAVE_GETHOSTBYNAME_R_3_ARG, 1,
1020          [Define this if gethostbyname_r takes 3 arguments])
1021        AC_MSG_RESULT(3)
1022      ], [
1023        AC_MSG_RESULT(0)
1024      ])
1025   ])
1026  ])
1027  CFLAGS=$OLD_CFLAGS
1030 AC_CACHE_CHECK([whether the C compiler supports __func__],
1031   tor_cv_have_func_macro,
1032   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1033 #include <stdio.h>
1034 int main(int c, char **v) { puts(__func__); }])],
1035   tor_cv_have_func_macro=yes,
1036   tor_cv_have_func_macro=no))
1038 AC_CACHE_CHECK([whether the C compiler supports __FUNC__],
1039   tor_cv_have_FUNC_macro,
1040   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1041 #include <stdio.h>
1042 int main(int c, char **v) { puts(__FUNC__); }])],
1043   tor_cv_have_FUNC_macro=yes,
1044   tor_cv_have_FUNC_macro=no))
1046 AC_CACHE_CHECK([whether the C compiler supports __FUNCTION__],
1047   tor_cv_have_FUNCTION_macro,
1048   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1049 #include <stdio.h>
1050 int main(int c, char **v) { puts(__FUNCTION__); }])],
1051   tor_cv_have_FUNCTION_macro=yes,
1052   tor_cv_have_FUNCTION_macro=no))
1054 if test "$tor_cv_have_func_macro" = 'yes'; then
1055   AC_DEFINE(HAVE_MACRO__func__, 1, [Defined if the compiler supports __func__])
1058 if test "$tor_cv_have_FUNC_macro" = 'yes'; then
1059   AC_DEFINE(HAVE_MACRO__FUNC__, 1, [Defined if the compiler supports __FUNC__])
1062 if test "$tor_cv_have_FUNCTION_macro" = 'yes'; then
1063   AC_DEFINE(HAVE_MACRO__FUNCTION__, 1,
1064            [Defined if the compiler supports __FUNCTION__])
1067 # $prefix stores the value of the --prefix command line option, or
1068 # NONE if the option wasn't set.  In the case that it wasn't set, make
1069 # it be the default, so that we can use it to expand directories now.
1070 if test "x$prefix" = "xNONE"; then
1071   prefix=$ac_default_prefix
1074 # and similarly for $exec_prefix
1075 if test "x$exec_prefix" = "xNONE"; then
1076   exec_prefix=$prefix
1079 if test "x$BUILDDIR" = "x"; then
1080   BUILDDIR=`pwd`
1082 AC_SUBST(BUILDDIR)
1083 AH_TEMPLATE([BUILDDIR],[tor's build directory])
1084 AC_DEFINE_UNQUOTED(BUILDDIR,"$BUILDDIR")
1086 if test "x$CONFDIR" = "x"; then
1087   CONFDIR=`eval echo $sysconfdir/tor`
1089 AC_SUBST(CONFDIR)
1090 AH_TEMPLATE([CONFDIR],[tor's configuration directory])
1091 AC_DEFINE_UNQUOTED(CONFDIR,"$CONFDIR")
1093 BINDIR=`eval echo $bindir`
1094 AC_SUBST(BINDIR)
1095 LOCALSTATEDIR=`eval echo $localstatedir`
1096 AC_SUBST(LOCALSTATEDIR)
1098 if test "$bwin32" = true; then
1099   # Test if the linker supports the --nxcompat and --dynamicbase options
1100   # for Windows
1101   save_LDFLAGS="$LDFLAGS"
1102   LDFLAGS="-Wl,--nxcompat -Wl,--dynamicbase"
1103   AC_MSG_CHECKING([whether the linker supports DllCharacteristics])
1104   AC_LINK_IFELSE([AC_LANG_PROGRAM([])],
1105     [AC_MSG_RESULT([yes])]
1106     [save_LDFLAGS="$save_LDFLAGS $LDFLAGS"],
1107     [AC_MSG_RESULT([no])]
1108   )
1109   LDFLAGS="$save_LDFLAGS"
1112 # Set CFLAGS _after_ all the above checks, since our warnings are stricter
1113 # than autoconf's macros like.
1114 if test "$GCC" = yes; then
1115   # Disable GCC's strict aliasing checks.  They are an hours-to-debug
1116   # accident waiting to happen.
1117   CFLAGS="$CFLAGS -Wall -fno-strict-aliasing"
1118 else
1119   # Autoconf sets -g -O2 by default. Override optimization level
1120   # for non-gcc compilers
1121   CFLAGS="$CFLAGS -O"
1122   enable_gcc_warnings=no
1123   enable_gcc_warnings_advisory=no
1126 # Add some more warnings which we use in development but not in the
1127 # released versions.  (Some relevant gcc versions can't handle these.)
1128 if test x$enable_gcc_warnings = xyes || test x$enable_gcc_warnings_advisory = xyes; then
1130   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1131 #if !defined(__GNUC__) || (__GNUC__ < 4)
1132 #error
1133 #endif])], have_gcc4=yes, have_gcc4=no)
1135   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1136 #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 2)
1137 #error
1138 #endif])], have_gcc42=yes, have_gcc42=no)
1140   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1141 #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 3)
1142 #error
1143 #endif])], have_gcc43=yes, have_gcc43=no)
1145   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1146 #if !defined(__clang__) || (__clang_major__ > 2) || (__clang_major__ == 2 && __clang_minor__ > 9)
1147 #error
1148 #endif])], have_clang29orlower=yes, have_clang29orlower=no)
1150   save_CFLAGS="$CFLAGS"
1151   CFLAGS="$CFLAGS -Wshorten-64-to-32"
1152   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], have_shorten64_flag=yes,
1153                     have_shorten64_flag=no)
1154   CFLAGS="$save_CFLAGS"
1156   case $host in
1157     *-*-openbsd*)
1158       # Some OpenBSD versions (like 4.8) have -Wsystem-headers by default.
1159       # That's fine, except that the headers don't pass -Wredundant-decls.
1160       # Therefore, let's disable -Wsystem-headers when we're building
1161       # with maximal warnings on OpenBSD.
1162       CFLAGS="$CFLAGS -Wno-system-headers" ;;
1163   esac
1165   CFLAGS="$CFLAGS -W -Wfloat-equal -Wundef -Wpointer-arith"
1166   CFLAGS="$CFLAGS -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings"
1167   CFLAGS="$CFLAGS -Wredundant-decls -Wchar-subscripts -Wcomment -Wformat=2"
1168   CFLAGS="$CFLAGS -Wwrite-strings -Wmissing-declarations -Wredundant-decls"
1169   CFLAGS="$CFLAGS -Wnested-externs -Wbad-function-cast -Wswitch-enum"
1171   if test x$enable_gcc_warnings = xyes; then
1172     CFLAGS="$CFLAGS -Werror"
1173   fi
1175   # Disabled, so we can use mallinfo(): -Waggregate-return
1177   if test x$have_gcc4 = xyes ; then
1178     # These warnings break gcc 3.3.5 and work on gcc 4.0.2
1179     CFLAGS="$CFLAGS -Winit-self -Wmissing-field-initializers -Wdeclaration-after-statement -Wold-style-definition"
1180   fi
1182   if test x$have_gcc42 = xyes ; then
1183     # These warnings break gcc 4.0.2 and work on gcc 4.2
1184     # XXXX020 See if any of these work with earlier versions.
1185     CFLAGS="$CFLAGS -Waddress -Wmissing-noreturn -Wstrict-overflow=1"
1187     # We used to use -Wstrict-overflow=5, but that breaks us heavily under 4.3.
1188   fi
1190   if test x$have_gcc42 = xyes && test x$have_clang29orlower = xno; then
1191     # These warnings break gcc 4.0.2 and clang, but work on gcc 4.2
1192     # We only disable these for clang 2.9 and lower, in case they are
1193     # supported in later versions.
1194     CFLAGS="$CFLAGS -Wnormalized=id -Woverride-init"
1195   fi
1197   if test x$have_gcc43 = xyes ; then
1198     # These warnings break gcc 4.2 and work on gcc 4.3
1199     # XXXX020 See if any of these work with earlier versions.
1200     CFLAGS="$CFLAGS -Wextra -Warray-bounds"
1201   fi
1203   if test x$have_shorten64_flag = xyes ; then
1204     CFLAGS="$CFLAGS -Wshorten-64-to-32"
1205   fi
1207 ##This will break the world on some 64-bit architectures
1208 # CFLAGS="$CFLAGS -Winline"
1213 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent $TOR_CPPFLAGS_openssl $TOR_CPPFLAGS_zlib"
1215 AC_CONFIG_FILES([
1216         Doxyfile
1217         Makefile
1218         contrib/Makefile
1219         contrib/suse/Makefile
1220         contrib/suse/tor.sh
1221         contrib/tor.logrotate
1222         contrib/tor.sh
1223         contrib/torctl
1224         contrib/torify
1225         doc/Makefile
1226         src/Makefile
1227         src/common/Makefile
1228         src/config/Makefile
1229         src/config/torrc.sample
1230         src/or/Makefile
1231         src/test/Makefile
1232         src/tools/Makefile
1233         src/tools/tor-fw-helper/Makefile
1234         src/win32/Makefile
1235         tor.spec
1238 AC_OUTPUT
1240 if test -x /usr/bin/perl && test -x ./contrib/updateVersions.pl ; then
1241   ./contrib/updateVersions.pl