bump to 0.2.3.3-alpha
[tor.git] / configure.in
blobdeac7745c6cdabdfe6a7c5e200d8ab6e4284041f
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.3-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 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   TOR_LIB_IPHLPAPI=-liphlpapi
329   # Some of the cargo-cults recommend -lwsock32 as well, but I don't
330   # think it's actually necessary.
331   TOR_LIB_GDI=-lgdi32
332 else
333   TOR_LIB_WS32=
334   TOR_LIB_GDI=
336 AC_SUBST(TOR_LIB_WS32)
337 AC_SUBST(TOR_LIB_GDI)
338 AC_SUBST(TOR_LIB_IPHLPAPI)
340 dnl We need to do this before we try our disgusting hack below.
341 AC_CHECK_HEADERS([sys/types.h])
343 dnl This is a disgusting hack so we safely include older libevent headers.
344 AC_CHECK_TYPE(u_int64_t, unsigned long long)
345 AC_CHECK_TYPE(u_int32_t, unsigned long)
346 AC_CHECK_TYPE(u_int16_t, unsigned short)
347 AC_CHECK_TYPE(u_int8_t, unsigned char)
349 tor_libevent_pkg_redhat="libevent"
350 tor_libevent_pkg_debian="libevent-dev"
351 tor_libevent_devpkg_redhat="libevent-devel"
352 tor_libevent_devpkg_debian="libevent-dev"
354 dnl On Gnu/Linux or any place we require it, we'll add librt to the Libevent
355 dnl linking for static builds.
356 STATIC_LIBEVENT_FLAGS=""
357 if test "$enable_static_libevent" = "yes"; then
358     dnl Determine if we have clock_gettime in librt
359     AC_SEARCH_LIBS([clock_gettime], [rt],
360         [have_rt=yes])
361     if test "$have_rt" = yes; then
362       STATIC_LIBEVENT_FLAGS=" -lrt "
363     fi
366 TOR_SEARCH_LIBRARY(libevent, $trylibeventdir, [-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32], [
367 #ifdef WIN32
368 #include <winsock2.h>
369 #endif
370 #include <stdlib.h>
371 #include <sys/time.h>
372 #include <sys/types.h>
373 #include <event.h>], [
374 #ifdef WIN32
375 #include <winsock2.h>
376 #endif
377 void exit(int); void *event_init(void);],
378     [
379 #ifdef WIN32
380 {WSADATA d; WSAStartup(0x101,&d); }
381 #endif
382 event_init(); exit(0);
383 ], [--with-libevent-dir], [/opt/libevent])
385 dnl Now check for particular libevent functions.
386 save_LIBS="$LIBS"
387 save_LDFLAGS="$LDFLAGS"
388 save_CPPFLAGS="$CPPFLAGS"
389 LIBS="-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32 $LIBS"
390 LDFLAGS="$TOR_LDFLAGS_libevent $LDFLAGS"
391 CPPFLAGS="$TOR_CPPFLAGS_libevent $CPPFLAGS"
392 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)
393 AC_CHECK_MEMBERS([struct event.min_heap_idx], , ,
394 [#include <event.h>
397 AC_CHECK_HEADERS(event2/event.h event2/dns.h event2/bufferevent_ssl.h)
399 LIBS="$save_LIBS"
400 LDFLAGS="$save_LDFLAGS"
401 CPPFLAGS="$save_CPPFLAGS"
404 AM_CONDITIONAL(USE_EXTERNAL_EVDNS, test x$ac_cv_header_event2_dns_h = xyes)
406 if test "$enable_static_libevent" = "yes"; then
407    if test "$tor_cv_library_libevent_dir" = "(system)"; then
408      AC_MSG_ERROR("You must specify an explicit --with-libevent-dir=x option when using --enable-static-libevent")
409    else
410      TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent.a $STATIC_LIBEVENT_FLAGS"
411    fi
412 else
413      TOR_LIBEVENT_LIBS="-levent"
416 dnl This isn't the best test for Libevent 2.0.3-alpha.  Once it's released,
417 dnl we can do much better.
418 if test "$enable_bufferevents" = "yes" ; then
419   if test "$ac_cv_header_event2_bufferevent_ssl_h" != "yes" ; then
420     AC_MSG_ERROR([You've asked for bufferevent support, but you're using a version of Libevent without SSL support.  This won't work.  We need Libevent 2.0.8-rc or later, and you don't seem to even have Libevent 2.0.3-alpha.])
421   else
423     CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent"
425     # Check for the right version.  First see if version detection works.
426     AC_MSG_CHECKING([whether we can detect the Libevent version])
427     AC_COMPILE_IFELSE([AC_LANG_SOURCE([
428 #include <event2/event.h>
429 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 10
430 #error
431 int x = y(zz);
432 #else
433 int x = 1;
434 #endif
435   ])], [event_version_number_works=yes; AC_MSG_RESULT([yes]) ],
436      [event_version_number_works=no;  AC_MSG_RESULT([no])])
437     if test "$event_version_number_works" != 'yes'; then
438       AC_MSG_WARN([Version detection on Libevent seems broken.  Your Libevent installation is probably screwed up or very old.])
439     else
440       AC_MSG_CHECKING([whether Libevent is new enough for bufferevents])
441       AC_COMPILE_IFELSE([AC_LANG_SOURCE([
442 #include <event2/event.h>
443 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 0x02000d00
444 #error
445 int x = y(zz);
446 #else
447 int x = 1;
448 #endif
449    ])], [ AC_MSG_RESULT([yes]) ],
450       [ AC_MSG_RESULT([no])
451         AC_MSG_ERROR([Libevent does not seem new enough to support bufferevents.  We require 2.0.13-stable or later]) ] )
452     fi
453   fi
456 LIBS="$save_LIBS"
457 LDFLAGS="$save_LDFLAGS"
458 CPPFLAGS="$save_CPPFLAGS"
460 AM_CONDITIONAL(USE_BUFFEREVENTS, test "$enable_bufferevents" = "yes")
461 if test "$enable_bufferevents" = "yes"; then
462   AC_DEFINE(USE_BUFFEREVENTS, 1, [Defined if we're going to use Libevent's buffered IO API])
463   if test "$enable_static_libevent" = "yes"; then
464     TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent_openssl.a $TOR_LIBEVENT_LIBS"
465   else
466     TOR_LIBEVENT_LIBS="-levent_openssl $TOR_LIBEVENT_LIBS"
467   fi
469 AC_SUBST(TOR_LIBEVENT_LIBS)
471 dnl ------------------------------------------------------
472 dnl Where do you live, openssl?  And how do we call you?
474 tor_openssl_pkg_redhat="openssl"
475 tor_openssl_pkg_debian="libssl"
476 tor_openssl_devpkg_redhat="openssl-devel"
477 tor_openssl_devpkg_debian="libssl-dev"
479 ALT_openssl_WITHVAL=""
480 AC_ARG_WITH(ssl-dir,
481   [  --with-ssl-dir=PATH    Obsolete alias for --with-openssl-dir ],
482   [
483       if test "x$withval" != xno && test "x$withval" != "x" ; then
484          ALT_openssl_WITHVAL="$withval"
485       fi
486   ])
488 TOR_SEARCH_LIBRARY(openssl, $tryssldir, [-lssl -lcrypto $TOR_LIB_GDI],
489     [#include <openssl/rand.h>],
490     [void RAND_add(const void *buf, int num, double entropy);],
491     [RAND_add((void*)0,0,0); exit(0);], [],
492     [/usr/local/openssl /usr/lib/openssl /usr/local/ssl /usr/lib/ssl /usr/local /usr/athena /opt/openssl])
494 dnl XXXX check for OPENSSL_VERSION_NUMBER == SSLeay()
496 echo "tor_cv_library_openssl_dir is $tor_cv_library_openssl_dir"
497 if test "$enable_static_openssl" = "yes"; then
498    if test "$tor_cv_library_openssl_dir" = "(system)"; then
499      AC_MSG_ERROR("You must specify an explicit --with-openssl-dir=x option when using --enable-static-openssl")
500    else
501      TOR_OPENSSL_LIBS="$TOR_LIBDIR_openssl/libssl.a $TOR_LIBDIR_openssl/libcrypto.a"
502    fi
503 else
504      TOR_OPENSSL_LIBS="-lssl -lcrypto"
506 AC_SUBST(TOR_OPENSSL_LIBS)
508 dnl ------------------------------------------------------
509 dnl Where do you live, zlib?  And how do we call you?
511 tor_zlib_pkg_redhat="zlib"
512 tor_zlib_pkg_debian="zlib1g"
513 tor_zlib_devpkg_redhat="zlib-devel"
514 tor_zlib_devpkg_debian="zlib1g-dev"
516 TOR_SEARCH_LIBRARY(zlib, $tryzlibdir, [-lz],
517     [#include <zlib.h>],
518     [const char * zlibVersion(void);],
519     [zlibVersion(); exit(0);], [--with-zlib-dir],
520     [/opt/zlib])
522 if test "$enable_static_zlib" = "yes"; then
523    if test "$tor_cv_library_zlib_dir" = "(system)"; then
524      AC_MSG_ERROR("You must specify an explicit --with-zlib-dir=x option when
525  using --enable-static-zlib")
526    else
527      TOR_ZLIB_LIBS="$TOR_LIBDIR_zlib/libz.a"
528      echo "$TOR_LIBDIR_zlib/libz.a"
529    fi
530 else
531      TOR_ZLIB_LIBS="-lz"
533 AC_SUBST(TOR_ZLIB_LIBS)
535 dnl Make sure to enable support for large off_t if available.
538 dnl ------------------------------------------------------
539 dnl Where do you live, libnatpmp?  And how do we call you?
540 dnl There are no packages for Debian or Redhat as of this patch
542 if test "$natpmp" = "true"; then
543     AC_DEFINE(NAT_PMP, 1, [Define to 1 if we are building with nat-pmp.])
544     TOR_SEARCH_LIBRARY(libnatpmp, $trylibnatpmpdir, [-lnatpmp],
545         [#include <natpmp.h>],
546         [#include <natpmp.h>],
547         [   int r;
548             natpmp_t natpmp;
549             natpmpresp_t response;
550             r = initnatpmp(&natpmp, 0, 0);],
551             [printf("initnatpmp() returned %d (%s)\n", r, r?"FAILED":"SUCCESS");
552             exit(0);],
553         [--with-libnatpmp-dir],
554         [/usr/lib/])
558 dnl ------------------------------------------------------
559 dnl Where do you live, libminiupnpc?  And how do we call you?
560 dnl There are no packages for Debian or Redhat as of this patch
562 if test "$upnp" = "true"; then
563     AC_DEFINE(MINIUPNPC, 1, [Define to 1 if we are building with UPnP.])
564     TOR_SEARCH_LIBRARY(libminiupnpc, $trylibminiupnpcdir, [-lminiupnpc $TOR_LIB_WS32 $TOR_LIB_IPHLPAPI],
565         [#include <miniupnpc/miniwget.h>
566          #include <miniupnpc/miniupnpc.h>
567          #include <miniupnpc/upnpcommands.h>],
568         [void upnpDiscover(int delay, const char * multicastif,
569          const char * minissdpdsock, int sameport);],
570         [upnpDiscover(1, 0, 0, 0); exit(0);],
571         [--with-libminiupnpc-dir],
572         [/usr/lib/])
575 AC_SYS_LARGEFILE
577 AC_CHECK_HEADERS(
578         assert.h \
579         errno.h \
580         fcntl.h \
581         signal.h \
582         string.h \
583         sys/fcntl.h \
584         sys/stat.h \
585         sys/time.h \
586         sys/types.h \
587         time.h \
588         unistd.h
589  , , 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.))
591 dnl These headers are not essential
593 AC_CHECK_HEADERS(
594         arpa/inet.h \
595         grp.h \
596         inttypes.h \
597         limits.h \
598         linux/types.h \
599         machine/limits.h \
600         malloc.h \
601         malloc/malloc.h \
602         malloc_np.h \
603         netdb.h \
604         netinet/in.h \
605         netinet/in6.h \
606         pwd.h \
607         stdint.h \
608         sys/file.h \
609         sys/ioctl.h \
610         sys/limits.h \
611         sys/mman.h \
612         sys/param.h \
613         sys/prctl.h \
614         sys/resource.h \
615         sys/socket.h \
616         sys/syslimits.h \
617         sys/time.h \
618         sys/types.h \
619         sys/un.h \
620         sys/utime.h \
621         sys/wait.h \
622         syslog.h \
623         utime.h
626 TOR_CHECK_PROTOTYPE(malloc_good_size, HAVE_MALLOC_GOOD_SIZE_PROTOTYPE,
627 [#ifdef HAVE_MALLOC_H
628 #include <malloc.h>
629 #endif
630 #ifdef HAVE_MALLOC_MALLOC_H
631 #include <malloc/malloc.h>
632 #endif])
634 AC_CHECK_HEADERS(net/if.h, net_if_found=1, net_if_found=0,
635 [#ifdef HAVE_SYS_TYPES_H
636 #include <sys/types.h>
637 #endif
638 #ifdef HAVE_SYS_SOCKET_H
639 #include <sys/socket.h>
640 #endif])
641 AC_CHECK_HEADERS(net/pfvar.h, net_pfvar_found=1, net_pfvar_found=0,
642 [#ifdef HAVE_SYS_TYPES_H
643 #include <sys/types.h>
644 #endif
645 #ifdef HAVE_SYS_SOCKET_H
646 #include <sys/socket.h>
647 #endif
648 #ifdef HAVE_NET_IF_H
649 #include <net/if.h>
650 #endif])
651 AC_CHECK_HEADERS(linux/netfilter_ipv4.h,
652         linux_netfilter_ipv4=1, linux_netfilter_ipv4=0,
653 [#ifdef HAVE_SYS_TYPES_H
654 #include <sys/types.h>
655 #endif
656 #ifdef HAVE_SYS_SOCKET_H
657 #include <sys/socket.h>
658 #endif
659 #ifdef HAVE_LIMITS_H
660 #include <limits.h>
661 #endif
662 #ifdef HAVE_LINUX_TYPES_H
663 #include <linux/types.h>
664 #endif
665 #ifdef HAVE_NETINET_IN6_H
666 #include <netinet/in6.h>
667 #endif
668 #ifdef HAVE_NETINET_IN_H
669 #include <netinet/in.h>
670 #endif])
672 if test x$transparent = xtrue ; then
673    transparent_ok=0
674    if test x$net_if_found = x1 && test x$net_pfvar_found = x1 ; then
675      transparent_ok=1
676    fi
677    if test x$linux_netfilter_ipv4 = x1 ; then
678      transparent_ok=1
679    fi
680    if test x$transparent_ok = x1 ; then
681      AC_DEFINE(USE_TRANSPARENT, 1, "Define to enable transparent proxy support")
682      case $host in
683        *-*-openbsd*)
684          AC_DEFINE(OPENBSD, 1, "Define to handle pf on OpenBSD properly") ;;
685      esac
686    else
687      AC_MSG_NOTICE([Transparent proxy support enabled, but missing headers.])
688    fi
691 AC_CHECK_MEMBERS([struct timeval.tv_sec], , ,
692 [#ifdef HAVE_SYS_TYPES_H
693 #include <sys/types.h>
694 #endif
695 #ifdef HAVE_SYS_TIME_H
696 #include <sys/time.h>
697 #endif])
699 dnl In case we aren't given a working stdint.h, we'll need to grow our own.
700 dnl Watch out.
702 AC_CHECK_SIZEOF(int8_t)
703 AC_CHECK_SIZEOF(int16_t)
704 AC_CHECK_SIZEOF(int32_t)
705 AC_CHECK_SIZEOF(int64_t)
706 AC_CHECK_SIZEOF(uint8_t)
707 AC_CHECK_SIZEOF(uint16_t)
708 AC_CHECK_SIZEOF(uint32_t)
709 AC_CHECK_SIZEOF(uint64_t)
710 AC_CHECK_SIZEOF(intptr_t)
711 AC_CHECK_SIZEOF(uintptr_t)
713 dnl AC_CHECK_TYPES([int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t, uint64_t, intptr_t, uintptr_t])
715 AC_CHECK_SIZEOF(char)
716 AC_CHECK_SIZEOF(short)
717 AC_CHECK_SIZEOF(int)
718 AC_CHECK_SIZEOF(long)
719 AC_CHECK_SIZEOF(long long)
720 AC_CHECK_SIZEOF(__int64)
721 AC_CHECK_SIZEOF(void *)
722 AC_CHECK_SIZEOF(time_t)
723 AC_CHECK_SIZEOF(size_t)
725 AC_CHECK_TYPES([uint, u_char, ssize_t])
727 dnl used to include sockaddr_storage, but everybody has that.
728 AC_CHECK_TYPES([struct in6_addr, struct sockaddr_in6, sa_family_t], , ,
729 [#ifdef HAVE_SYS_TYPES_H
730 #include <sys/types.h>
731 #endif
732 #ifdef HAVE_NETINET_IN_H
733 #include <netinet/in.h>
734 #endif
735 #ifdef HAVE_NETINET_IN6_H
736 #include <netinet/in6.h>
737 #endif
738 #ifdef HAVE_SYS_SOCKET_H
739 #include <sys/socket.h>
740 #endif
741 #ifdef MS_WINDOWS
742 #define WIN32_WINNT 0x400
743 #define _WIN32_WINNT 0x400
744 #define WIN32_LEAN_AND_MEAN
745 #if defined(_MSC_VER) && (_MSC_VER < 1300)
746 #include <winsock.h>
747 #else
748 #include <winsock2.h>
749 #include <ws2tcpip.h>
750 #endif
751 #endif
753 AC_CHECK_MEMBERS([struct in6_addr.s6_addr32, struct in6_addr.s6_addr16, struct sockaddr_in.sin_len, struct sockaddr_in6.sin6_len], , ,
754 [#ifdef HAVE_SYS_TYPES_H
755 #include <sys/types.h>
756 #endif
757 #ifdef HAVE_NETINET_IN_H
758 #include <netinet/in.h>
759 #endif
760 #ifdef HAVE_NETINET_IN6_H
761 #include <netinet/in6.h>
762 #endif
763 #ifdef HAVE_SYS_SOCKET_H
764 #include <sys/socket.h>
765 #endif
766 #ifdef MS_WINDOWS
767 #define WIN32_WINNT 0x400
768 #define _WIN32_WINNT 0x400
769 #define WIN32_LEAN_AND_MEAN
770 #if defined(_MSC_VER) && (_MSC_VER < 1300)
771 #include <winsock.h>
772 #else
773 #include <winsock2.h>
774 #include <ws2tcpip.h>
775 #endif
776 #endif
779 AC_CHECK_TYPES([rlim_t], , ,
780 [#ifdef HAVE_SYS_TYPES_H
781 #include <sys/types.h>
782 #endif
783 #ifdef HAVE_SYS_TIME_H
784 #include <sys/time.h>
785 #endif
786 #ifdef HAVE_SYS_RESOURCE_H
787 #include <sys/resource.h>
788 #endif
791 AC_CACHE_CHECK([whether time_t is signed], tor_cv_time_t_signed, [
792 AC_RUN_IFELSE([AC_LANG_SOURCE([
793 #ifdef HAVE_SYS_TYPES_H
794 #include <sys/types.h>
795 #endif
796 #ifdef HAVE_SYS_TIME_H
797 #include <sys/time.h>
798 #endif
799 #ifdef HAVE_TIME_H
800 #include <time.h>
801 #endif
802 int main(int c, char**v) { if (((time_t)-1)<0) return 1; else return 0; }])],
803   tor_cv_time_t_signed=no, tor_cv_time_t_signed=yes, tor_cv_time_t_signed=cross)
806 if test "$tor_cv_time_t_signed" = cross; then
807   AC_MSG_NOTICE([Cross compiling: assuming that time_t is signed.])
810 if test "$tor_cv_time_t_signed" != no; then
811   AC_DEFINE([TIME_T_IS_SIGNED], 1,
812             [Define to 1 iff time_t is signed])
815 AC_CACHE_CHECK([whether size_t is signed], tor_cv_size_t_signed, [
816 AC_RUN_IFELSE([AC_LANG_SOURCE([
817 #ifdef HAVE_SYS_TYPES_H
818 #include <sys/types.h>
819 #endif
820 int main(int c, char**v) { if (((size_t)-1)<0) return 1; else return 0; }])],
821   tor_cv_size_t_signed=no, tor_cv_size_t_signed=yes, tor_cv_size_t_signed=cross)
824 if test "$tor_cv_size_t_signed" = cross; then
825   AC_MSG_NOTICE([Cross compiling: assuming that size_t is not signed.])
828 if test "$tor_cv_size_t_signed" = yes; then
829   AC_MSG_ERROR([You have a signed size_t; that's grossly nonconformant.])
832 AC_CHECK_SIZEOF(socklen_t, , [AC_INCLUDES_DEFAULT()
833 #ifdef HAVE_SYS_SOCKET_H
834 #include <sys/socket.h>
835 #endif
838 # We want to make sure that we _don't_ have a cell_t defined, like IRIX does.
840 AC_CHECK_SIZEOF(cell_t)
842 # Now make sure that NULL can be represented as zero bytes.
843 AC_CACHE_CHECK([whether memset(0) sets pointers to NULL], tor_cv_null_is_zero,
844 [AC_RUN_IFELSE([AC_LANG_SOURCE(
845 [[#include <stdlib.h>
846 #include <string.h>
847 #include <stdio.h>
848 #ifdef HAVE_STDDEF_H
849 #include <stddef.h>
850 #endif
851 int main () { char *p1,*p2; p1=NULL; memset(&p2,0,sizeof(p2));
852 return memcmp(&p1,&p2,sizeof(char*))?1:0; }]])],
853        [tor_cv_null_is_zero=yes],
854        [tor_cv_null_is_zero=no],
855        [tor_cv_null_is_zero=cross])])
857 if test "$tor_cv_null_is_zero" = cross ; then
858   # Cross-compiling; let's hope that the target isn't raving mad.
859   AC_MSG_NOTICE([Cross-compiling: we'll assume that NULL is represented as a sequence of 0-valued bytes.])
862 if test "$tor_cv_null_is_zero" != no; then
863   AC_DEFINE([NULL_REP_IS_ZERO_BYTES], 1,
864             [Define to 1 iff memset(0) sets pointers to NULL])
867 # And what happens when we malloc zero?
868 AC_CACHE_CHECK([whether we can malloc(0) safely.], tor_cv_malloc_zero_works,
869 [AC_RUN_IFELSE([AC_LANG_SOURCE(
870 [[#include <stdlib.h>
871 #include <string.h>
872 #include <stdio.h>
873 #ifdef HAVE_STDDEF_H
874 #include <stddef.h>
875 #endif
876 int main () { return malloc(0)?0:1; }]])],
877        [tor_cv_malloc_zero_works=yes],
878        [tor_cv_malloc_zero_works=no],
879        [tor_cv_malloc_zero_works=cross])])
881 if test "$tor_cv_malloc_zero_works" = cross; then
882   # Cross-compiling; let's hope that the target isn't raving mad.
883   AC_MSG_NOTICE([Cross-compiling: we'll assume that we need to check malloc() arguments for 0.])
886 if test "$tor_cv_malloc_zero_works" = yes; then
887   AC_DEFINE([MALLOC_ZERO_WORKS], 1,
888             [Define to 1 iff malloc(0) returns a pointer])
891 # whether we seem to be in a 2s-complement world.
892 AC_CACHE_CHECK([whether we are using 2s-complement arithmetic], tor_cv_twos_complement,
893 [AC_RUN_IFELSE([AC_LANG_SOURCE(
894 [[int main () { int problem = ((-99) != (~99)+1);
895 return problem ? 1 : 0; }]])],
896        [tor_cv_twos_complement=yes],
897        [tor_cv_twos_complement=no],
898        [tor_cv_twos_complement=cross])])
900 if test "$tor_cv_twos_complement" = cross ; then
901   # Cross-compiling; let's hope that the target isn't raving mad.
902   AC_MSG_NOTICE([Cross-compiling: we'll assume that negative integers are represented with two's complement.])
905 if test "$tor_cv_twos_complement" != no ; then
906   AC_DEFINE([USING_TWOS_COMPLEMENT], 1,
907             [Define to 1 iff we represent negative integers with two's complement])
910 # What does shifting a negative value do?
911 AC_CACHE_CHECK([whether right-shift on negative values does sign-extension], tor_cv_sign_extend,
912 [AC_RUN_IFELSE([AC_LANG_SOURCE(
913 [[int main () { int okay = (-60 >> 8) == -1; return okay ? 0 : 1; }]])],
914        [tor_cv_sign_extend=yes],
915        [tor_cv_sign_extend=no],
916        [tor_cv_sign_extend=cross])])
918 if test "$tor_cv_sign_extend" = cross ; then
919   # Cross-compiling; let's hope that the target isn't raving mad.
920   AC_MSG_NOTICE([Cross-compiling: we'll assume that right-shifting negative integers causes sign-extension])
923 if test "$tor_cv_sign_extend" != no ; then
924   AC_DEFINE([RSHIFT_DOES_SIGN_EXTEND], 1,
925             [Define to 1 iff right-shifting a negative value performs sign-extension])
928 # Whether we should use the dmalloc memory allocation debugging library.
929 AC_MSG_CHECKING(whether to use dmalloc (debug memory allocation library))
930 AC_ARG_WITH(dmalloc,
931 [  --with-dmalloc          Use debug memory allocation library. ],
932 [if [[ "$withval" = "yes" ]]; then
933   dmalloc=1
934   AC_MSG_RESULT(yes)
935 else
936   dmalloc=1
937   AC_MSG_RESULT(no)
938 fi], [ dmalloc=0; AC_MSG_RESULT(no) ]
941 if [[ $dmalloc -eq 1 ]]; then
942   AC_CHECK_HEADERS(dmalloc.h, , AC_MSG_ERROR(dmalloc header file not found. Do you have the development files for dmalloc installed?))
943   AC_SEARCH_LIBS(dmalloc_malloc, [dmallocth dmalloc], , AC_MSG_ERROR(Libdmalloc library not found. If you enable it you better have it installed.))
944   AC_DEFINE(USE_DMALLOC, 1, [Debug memory allocation library])
945   AC_DEFINE(DMALLOC_FUNC_CHECK, 1, [Enable dmalloc's malloc function check])
946   AC_CHECK_FUNCS(dmalloc_strdup dmalloc_strndup)
949 AC_ARG_WITH(tcmalloc,
950 [  --with-tcmalloc         Use tcmalloc memory allocation library. ],
951 [ tcmalloc=yes ], [ tcmalloc=no ])
953 if test x$tcmalloc = xyes ; then
954    LDFLAGS="-ltcmalloc $LDFLAGS"
957 # By default, we're going to assume we don't have mlockall()
958 # bionic and other platforms have various broken mlockall subsystems.
959 # Some systems don't have a working mlockall, some aren't linkable,
960 # and some have it but don't declare it.
961 AC_CHECK_FUNCS(mlockall)
962 AC_CHECK_DECLS([mlockall], , , [
963 #ifdef HAVE_SYS_MMAN_H
964 #include <sys/mman.h>
965 #endif])
967 # Allow user to specify an alternate syslog facility
968 AC_ARG_WITH(syslog-facility,
969 [  --with-syslog-facility=LOG syslog facility to use (default=LOG_DAEMON)],
970 syslog_facility="$withval", syslog_facility="LOG_DAEMON")
971 AC_DEFINE_UNQUOTED(LOGFACILITY,$syslog_facility,[name of the syslog facility])
972 AC_SUBST(LOGFACILITY)
974 # Check if we have getresuid and getresgid
975 AC_CHECK_FUNCS(getresuid getresgid)
977 # Check for gethostbyname_r in all its glorious incompatible versions.
978 #   (This logic is based on that in Python's configure.in)
979 AH_TEMPLATE(HAVE_GETHOSTBYNAME_R,
980   [Define this if you have any gethostbyname_r()])
982 AC_CHECK_FUNC(gethostbyname_r, [
983   AC_MSG_CHECKING([how many arguments gethostbyname_r() wants])
984   OLD_CFLAGS=$CFLAGS
985   CFLAGS="$CFLAGS $MY_CPPFLAGS $MY_THREAD_CPPFLAGS $MY_CFLAGS"
986   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
987 #include <netdb.h>
988   ], [[
989     char *cp1, *cp2;
990     struct hostent *h1, *h2;
991     int i1, i2;
992     (void)gethostbyname_r(cp1,h1,cp2,i1,&h2,&i2);
993   ]])],[
994     AC_DEFINE(HAVE_GETHOSTBYNAME_R)
995     AC_DEFINE(HAVE_GETHOSTBYNAME_R_6_ARG, 1,
996      [Define this if gethostbyname_r takes 6 arguments])
997     AC_MSG_RESULT(6)
998   ], [
999     AC_TRY_COMPILE([
1000 #include <netdb.h>
1001     ], [
1002       char *cp1, *cp2;
1003       struct hostent *h1;
1004       int i1, i2;
1005       (void)gethostbyname_r(cp1,h1,cp2,i1,&i2);
1006     ], [
1007       AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1008       AC_DEFINE(HAVE_GETHOSTBYNAME_R_5_ARG, 1,
1009         [Define this if gethostbyname_r takes 5 arguments])
1010       AC_MSG_RESULT(5)
1011    ], [
1012       AC_TRY_COMPILE([
1013 #include <netdb.h>
1014      ], [
1015        char *cp1;
1016        struct hostent *h1;
1017        struct hostent_data hd;
1018        (void) gethostbyname_r(cp1,h1,&hd);
1019      ], [
1020        AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1021        AC_DEFINE(HAVE_GETHOSTBYNAME_R_3_ARG, 1,
1022          [Define this if gethostbyname_r takes 3 arguments])
1023        AC_MSG_RESULT(3)
1024      ], [
1025        AC_MSG_RESULT(0)
1026      ])
1027   ])
1028  ])
1029  CFLAGS=$OLD_CFLAGS
1032 AC_CACHE_CHECK([whether the C compiler supports __func__],
1033   tor_cv_have_func_macro,
1034   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1035 #include <stdio.h>
1036 int main(int c, char **v) { puts(__func__); }])],
1037   tor_cv_have_func_macro=yes,
1038   tor_cv_have_func_macro=no))
1040 AC_CACHE_CHECK([whether the C compiler supports __FUNC__],
1041   tor_cv_have_FUNC_macro,
1042   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1043 #include <stdio.h>
1044 int main(int c, char **v) { puts(__FUNC__); }])],
1045   tor_cv_have_FUNC_macro=yes,
1046   tor_cv_have_FUNC_macro=no))
1048 AC_CACHE_CHECK([whether the C compiler supports __FUNCTION__],
1049   tor_cv_have_FUNCTION_macro,
1050   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1051 #include <stdio.h>
1052 int main(int c, char **v) { puts(__FUNCTION__); }])],
1053   tor_cv_have_FUNCTION_macro=yes,
1054   tor_cv_have_FUNCTION_macro=no))
1056 if test "$tor_cv_have_func_macro" = 'yes'; then
1057   AC_DEFINE(HAVE_MACRO__func__, 1, [Defined if the compiler supports __func__])
1060 if test "$tor_cv_have_FUNC_macro" = 'yes'; then
1061   AC_DEFINE(HAVE_MACRO__FUNC__, 1, [Defined if the compiler supports __FUNC__])
1064 if test "$tor_cv_have_FUNCTION_macro" = 'yes'; then
1065   AC_DEFINE(HAVE_MACRO__FUNCTION__, 1,
1066            [Defined if the compiler supports __FUNCTION__])
1069 # $prefix stores the value of the --prefix command line option, or
1070 # NONE if the option wasn't set.  In the case that it wasn't set, make
1071 # it be the default, so that we can use it to expand directories now.
1072 if test "x$prefix" = "xNONE"; then
1073   prefix=$ac_default_prefix
1076 # and similarly for $exec_prefix
1077 if test "x$exec_prefix" = "xNONE"; then
1078   exec_prefix=$prefix
1081 if test "x$BUILDDIR" = "x"; then
1082   BUILDDIR=`pwd`
1084 AC_SUBST(BUILDDIR)
1085 AH_TEMPLATE([BUILDDIR],[tor's build directory])
1086 AC_DEFINE_UNQUOTED(BUILDDIR,"$BUILDDIR")
1088 if test "x$CONFDIR" = "x"; then
1089   CONFDIR=`eval echo $sysconfdir/tor`
1091 AC_SUBST(CONFDIR)
1092 AH_TEMPLATE([CONFDIR],[tor's configuration directory])
1093 AC_DEFINE_UNQUOTED(CONFDIR,"$CONFDIR")
1095 BINDIR=`eval echo $bindir`
1096 AC_SUBST(BINDIR)
1097 LOCALSTATEDIR=`eval echo $localstatedir`
1098 AC_SUBST(LOCALSTATEDIR)
1100 if test "$bwin32" = true; then
1101   # Test if the linker supports the --nxcompat and --dynamicbase options
1102   # for Windows
1103   save_LDFLAGS="$LDFLAGS"
1104   LDFLAGS="-Wl,--nxcompat -Wl,--dynamicbase"
1105   AC_MSG_CHECKING([whether the linker supports DllCharacteristics])
1106   AC_LINK_IFELSE([AC_LANG_PROGRAM([])],
1107     [AC_MSG_RESULT([yes])]
1108     [save_LDFLAGS="$save_LDFLAGS $LDFLAGS"],
1109     [AC_MSG_RESULT([no])]
1110   )
1111   LDFLAGS="$save_LDFLAGS"
1114 # Set CFLAGS _after_ all the above checks, since our warnings are stricter
1115 # than autoconf's macros like.
1116 if test "$GCC" = yes; then
1117   # Disable GCC's strict aliasing checks.  They are an hours-to-debug
1118   # accident waiting to happen.
1119   CFLAGS="$CFLAGS -Wall -fno-strict-aliasing"
1120 else
1121   # Autoconf sets -g -O2 by default. Override optimization level
1122   # for non-gcc compilers
1123   CFLAGS="$CFLAGS -O"
1124   enable_gcc_warnings=no
1125   enable_gcc_warnings_advisory=no
1128 # OS X Lion started deprecating the system openssl. Let's just disable
1129 # all deprecation warnings on OS X.
1130 case "$host_os" in
1132  darwin*)
1133     CFLAGS="$CFLAGS -Wno-deprecated-declarations"
1134     ;;
1135 esac
1137 # Add some more warnings which we use in development but not in the
1138 # released versions.  (Some relevant gcc versions can't handle these.)
1139 if test x$enable_gcc_warnings = xyes || test x$enable_gcc_warnings_advisory = xyes; then
1141   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1142 #if !defined(__GNUC__) || (__GNUC__ < 4)
1143 #error
1144 #endif])], have_gcc4=yes, have_gcc4=no)
1146   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1147 #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 2)
1148 #error
1149 #endif])], have_gcc42=yes, have_gcc42=no)
1151   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1152 #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 3)
1153 #error
1154 #endif])], have_gcc43=yes, have_gcc43=no)
1156   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1157 #if !defined(__clang__) || (__clang_major__ > 2) || (__clang_major__ == 2 && __clang_minor__ > 9)
1158 #error
1159 #endif])], have_clang29orlower=yes, have_clang29orlower=no)
1161   save_CFLAGS="$CFLAGS"
1162   CFLAGS="$CFLAGS -Wshorten-64-to-32"
1163   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], have_shorten64_flag=yes,
1164                     have_shorten64_flag=no)
1165   CFLAGS="$save_CFLAGS"
1167   case $host in
1168     *-*-openbsd*)
1169       # Some OpenBSD versions (like 4.8) have -Wsystem-headers by default.
1170       # That's fine, except that the headers don't pass -Wredundant-decls.
1171       # Therefore, let's disable -Wsystem-headers when we're building
1172       # with maximal warnings on OpenBSD.
1173       CFLAGS="$CFLAGS -Wno-system-headers" ;;
1174   esac
1176   CFLAGS="$CFLAGS -W -Wfloat-equal -Wundef -Wpointer-arith"
1177   CFLAGS="$CFLAGS -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings"
1178   CFLAGS="$CFLAGS -Wredundant-decls -Wchar-subscripts -Wcomment -Wformat=2"
1179   CFLAGS="$CFLAGS -Wwrite-strings -Wmissing-declarations -Wredundant-decls"
1180   CFLAGS="$CFLAGS -Wnested-externs -Wbad-function-cast -Wswitch-enum"
1182   if test x$enable_gcc_warnings = xyes; then
1183     CFLAGS="$CFLAGS -Werror"
1184   fi
1186   # Disabled, so we can use mallinfo(): -Waggregate-return
1188   if test x$have_gcc4 = xyes ; then
1189     # These warnings break gcc 3.3.5 and work on gcc 4.0.2
1190     CFLAGS="$CFLAGS -Winit-self -Wmissing-field-initializers -Wdeclaration-after-statement -Wold-style-definition"
1191   fi
1193   if test x$have_gcc42 = xyes ; then
1194     # These warnings break gcc 4.0.2 and work on gcc 4.2
1195     # XXXX020 See if any of these work with earlier versions.
1196     CFLAGS="$CFLAGS -Waddress -Wmissing-noreturn -Wstrict-overflow=1"
1198     # We used to use -Wstrict-overflow=5, but that breaks us heavily under 4.3.
1199   fi
1201   if test x$have_gcc42 = xyes && test x$have_clang29orlower = xno; then
1202     # These warnings break gcc 4.0.2 and clang, but work on gcc 4.2
1203     # We only disable these for clang 2.9 and lower, in case they are
1204     # supported in later versions.
1205     CFLAGS="$CFLAGS -Wnormalized=id -Woverride-init"
1206   fi
1208   if test x$have_gcc43 = xyes ; then
1209     # These warnings break gcc 4.2 and work on gcc 4.3
1210     # XXXX020 See if any of these work with earlier versions.
1211     CFLAGS="$CFLAGS -Wextra -Warray-bounds"
1212   fi
1214   if test x$have_shorten64_flag = xyes ; then
1215     CFLAGS="$CFLAGS -Wshorten-64-to-32"
1216   fi
1218 ##This will break the world on some 64-bit architectures
1219 # CFLAGS="$CFLAGS -Winline"
1224 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent $TOR_CPPFLAGS_openssl $TOR_CPPFLAGS_zlib"
1226 AC_CONFIG_FILES([
1227         Doxyfile
1228         Makefile
1229         contrib/Makefile
1230         contrib/suse/Makefile
1231         contrib/suse/tor.sh
1232         contrib/tor.logrotate
1233         contrib/tor.sh
1234         contrib/torctl
1235         contrib/torify
1236         doc/Makefile
1237         src/Makefile
1238         src/common/Makefile
1239         src/config/Makefile
1240         src/config/torrc.sample
1241         src/or/Makefile
1242         src/test/Makefile
1243         src/tools/Makefile
1244         src/tools/tor-fw-helper/Makefile
1245         src/win32/Makefile
1246         tor.spec
1249 AC_OUTPUT
1251 if test -x /usr/bin/perl && test -x ./contrib/updateVersions.pl ; then
1252   ./contrib/updateVersions.pl