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