bump to 0.2.3.14-alpha
[tor.git] / configure.in
blob5cd312ce270ef762bea23c638df6239c68d74f1c
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.14-alpha)
8 AM_CONFIG_HEADER(orconfig.h)
10 AC_CANONICAL_HOST
12 if test -f /etc/redhat-release ; then
13   if test -f /usr/kerberos/include ; then
14     CPPFLAGS="$CPPFLAGS -I/usr/kerberos/include"
15   fi
18 # Not a no-op; we want to make sure that CPPFLAGS is set before we use
19 # the += operator on it in src/or/Makefile.am
20 CPPFLAGS="$CPPFLAGS -I\${top_srcdir}/src/common"
22 #XXXX020 We should make these enabled or not, before 0.2.0.x-final
23 AC_ARG_ENABLE(buf-freelists,
24    AS_HELP_STRING(--disable-buf-freelists, disable freelists for buffer RAM))
25 AC_ARG_ENABLE(openbsd-malloc,
26    AS_HELP_STRING(--enable-openbsd-malloc, Use malloc code from openbsd.  Linux only))
27 AC_ARG_ENABLE(instrument-downloads,
28    AS_HELP_STRING(--enable-instrument-downloads, Instrument downloads of directory resources etc.))
29 AC_ARG_ENABLE(static-openssl,
30    AS_HELP_STRING(--enable-static-openssl, Link against a static openssl library. Requires --with-openssl-dir))
31 AC_ARG_ENABLE(static-libevent,
32    AS_HELP_STRING(--enable-static-libevent, Link against a static libevent library. Requires --with-libevent-dir))
33 AC_ARG_ENABLE(static-zlib,
34    AS_HELP_STRING(--enable-static-zlib, Link against a static zlib library. Requires --with-zlib-dir))
35 AC_ARG_ENABLE(static-tor,
36    AS_HELP_STRING(--enable-static-tor, Create an entirely static Tor binary. Requires --with-openssl-dir and --with-libevent-dir and --with-zlib-dir))
38 if test "$enable_static_tor" = "yes"; then
39   enable_static_libevent="yes";
40   enable_static_openssl="yes";
41   enable_static_zlib="yes";
42   CFLAGS="$CFLAGS -static"
45 if test x$enable_buf_freelists != xno; then
46   AC_DEFINE(ENABLE_BUF_FREELISTS, 1,
47             [Defined if we try to use freelists for buffer RAM chunks])
49 AM_CONDITIONAL(USE_OPENBSD_MALLOC, test x$enable_openbsd_malloc = xyes)
50 if test x$enable_instrument_downloads = xyes; then
51   AC_DEFINE(INSTRUMENT_DOWNLOADS, 1,
52             [Defined if we want to keep track of how much of each kind of resource we download.])
55 AC_ARG_ENABLE(transparent,
56      AS_HELP_STRING(--disable-transparent, disable transparent proxy support),
57      [case "${enableval}" in
58         yes) transparent=true ;;
59         no)  transparent=false ;;
60         *) AC_MSG_ERROR(bad value for --enable-transparent) ;;
61       esac], [transparent=true])
63 AC_ARG_ENABLE(asciidoc,
64      AS_HELP_STRING(--disable-asciidoc, don't use asciidoc (disables building of manpages)),
65      [case "${enableval}" in
66         yes) asciidoc=true ;;
67         no)  asciidoc=false ;;
68         *) AC_MSG_ERROR(bad value for --disable-asciidoc) ;;
69       esac], [asciidoc=true])
71 # By default, we're not ready to ship a NAT-PMP aware Tor
72 AC_ARG_ENABLE(nat-pmp,
73      AS_HELP_STRING(--enable-nat-pmp, enable NAT-PMP support),
74      [case "${enableval}" in
75         yes) natpmp=true ;;
76         no)  natpmp=false ;;
77         * ) AC_MSG_ERROR(bad value for --enable-nat-pmp) ;;
78       esac], [natpmp=false])
80 # By default, we're not ready to ship a UPnP aware Tor
81 AC_ARG_ENABLE(upnp,
82      AS_HELP_STRING(--enable-upnp, enable UPnP support),
83      [case "${enableval}" in
84         yes) upnp=true ;;
85         no)  upnp=false ;;
86         * ) AC_MSG_ERROR(bad value for --enable-upnp) ;;
87       esac], [upnp=false])
90 AC_ARG_ENABLE(threads,
91      AS_HELP_STRING(--disable-threads, disable multi-threading support))
93 if test x$enable_threads = x; then
94    case $host in
95     *-*-solaris* )
96      # Don't try multithreading on solaris -- cpuworkers seem to lock.
97      AC_MSG_NOTICE([You are running Solaris; Sometimes threading makes
98 cpu workers lock up here, so I will disable threads.])
99      enable_threads="no";;
100     *)
101      enable_threads="yes";;
102    esac
105 if test "$enable_threads" = "yes"; then
106   AC_DEFINE(ENABLE_THREADS, 1, [Defined if we will try to use multithreading])
109 case $host in
110    *-*-solaris* )
111      AC_DEFINE(_REENTRANT, 1, [Define on some platforms to activate x_r() functions in time.h])
112      ;;
113 esac
115 AC_ARG_ENABLE(gcc-warnings,
116      AS_HELP_STRING(--enable-gcc-warnings, enable verbose warnings))
117 AC_ARG_ENABLE(gcc-warnings-advisory,
118      AS_HELP_STRING(--enable-gcc-warnings-advisory, [enable verbose warnings, excluding -Werror]))
120 dnl Adam shostack suggests the following for Windows:
121 dnl -D_FORTIFY_SOURCE=2 -fstack-protector-all
122 dnl Others suggest '/gs /safeseh /nxcompat /dynamicbase' for non-gcc on Windows
123 dnl This requires that we use gcc and that we add -O2 to the CFLAGS.
124 AC_ARG_ENABLE(gcc-hardening,
125      AS_HELP_STRING(--enable-gcc-hardening, enable compiler security checks),
126 [if test x$enableval = xyes; then
127     CFLAGS="$CFLAGS -D_FORTIFY_SOURCE=2 -fstack-protector-all"
128     CFLAGS="$CFLAGS -fwrapv -fPIE -Wstack-protector"
129     CFLAGS="$CFLAGS --param ssp-buffer-size=1"
130     LDFLAGS="$LDFLAGS -pie"
131 fi])
133 dnl Linker hardening options
134 dnl Currently these options are ELF specific - you can't use this with MacOSX
135 AC_ARG_ENABLE(linker-hardening,
136         AS_HELP_STRING(--enable-linker-hardening, enable linker security fixups),
137 [if test x$enableval = xyes; then
138     LDFLAGS="$LDFLAGS -z relro -z now"
139 fi])
141 AC_ARG_ENABLE(local-appdata,
142    AS_HELP_STRING(--enable-local-appdata, default to host local application data paths on Windows))
143 if test "$enable_local_appdata" = "yes"; then
144   AC_DEFINE(ENABLE_LOCAL_APPDATA, 1,
145             [Defined if we default to host local appdata paths on Windows])
148 # Tor2web mode flag
149 AC_ARG_ENABLE(tor2web-mode,
150      AS_HELP_STRING(--enable-tor2web-mode, support tor2web non-anonymous mode),
151 [if test x$enableval = xyes; then
152     CFLAGS="$CFLAGS -D ENABLE_TOR2WEB_MODE=1"
153 fi])
155 AC_ARG_ENABLE(bufferevents,
156      AS_HELP_STRING(--enable-bufferevents, use Libevent's buffered IO.))
158 dnl check for the correct "ar" when cross-compiling
159 AN_MAKEVAR([AR], [AC_PROG_AR])
160 AN_PROGRAM([ar], [AC_PROG_AR])
161 AC_DEFUN([AC_PROG_AR], [AC_CHECK_TOOL([AR], [ar], [ar])])
162 AC_PROG_AR
164 AC_PROG_CC
165 AC_PROG_CPP
166 AC_PROG_MAKE_SET
167 AC_PROG_RANLIB
169 dnl autoconf 2.59 appears not to support AC_PROG_SED
170 AC_CHECK_PROG([SED],[sed],[sed],[/bin/false])
172 dnl check for asciidoc and a2x
173 AC_PATH_PROG([ASCIIDOC], [asciidoc], none)
174 AC_PATH_PROG([A2X], [a2x], none)
176 AM_CONDITIONAL(USE_ASCIIDOC, test x$asciidoc = xtrue)
178 AM_CONDITIONAL(USE_FW_HELPER, test x$natpmp = xtrue || test x$upnp = xtrue)
179 AM_CONDITIONAL(NAT_PMP, test x$natpmp = xtrue)
180 AM_CONDITIONAL(MINIUPNPC, test x$upnp = xtrue)
181 AM_PROG_CC_C_O
183 ifdef([AC_C_FLEXIBLE_ARRAY_MEMBER], [
184 AC_C_FLEXIBLE_ARRAY_MEMBER
185 ], [
186  dnl Maybe we've got an old autoconf...
187  AC_CACHE_CHECK([for flexible array members],
188      tor_cv_c_flexarray,
189      [AC_COMPILE_IFELSE(
190        AC_LANG_PROGRAM([
191  struct abc { int a; char b[]; };
192 ], [
193  struct abc *def = malloc(sizeof(struct abc)+sizeof(char));
194  def->b[0] = 33;
196   [tor_cv_c_flexarray=yes],
197   [tor_cv_c_flexarray=no])])
198  if test $tor_cv_flexarray = yes ; then
199    AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [], [Define to nothing if C supports flexible array members, and to 1 if it does not.])
200  else
201    AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [1], [Define to nothing if C supports flexible array members, and to 1 if it does not.])
202  fi
205 AC_PATH_PROG([SHA1SUM], [sha1sum], none)
206 AC_PATH_PROG([OPENSSL], [openssl], none)
208 TORUSER=_tor
209 AC_ARG_WITH(tor-user,
210         [  --with-tor-user=NAME    Specify username for tor daemon ],
211         [
212            TORUSER=$withval
213         ]
215 AC_SUBST(TORUSER)
217 TORGROUP=_tor
218 AC_ARG_WITH(tor-group,
219         [  --with-tor-group=NAME   Specify group name for tor daemon ],
220         [
221            TORGROUP=$withval
222         ]
224 AC_SUBST(TORGROUP)
227 dnl If _WIN32 is defined and non-zero, we are building for win32
228 AC_MSG_CHECKING([for win32])
229 AC_RUN_IFELSE([AC_LANG_SOURCE([
230 int main(int c, char **v) {
231 #ifdef _WIN32
232 #if _WIN32
233   return 0;
234 #else
235   return 1;
236 #endif
237 #else
238   return 2;
239 #endif
240 }])],
241 bwin32=true; AC_MSG_RESULT([yes]),
242 bwin32=false; AC_MSG_RESULT([no]),
243 bwin32=cross; AC_MSG_RESULT([cross])
246 if test "$bwin32" = cross; then
247 AC_MSG_CHECKING([for win32 (cross)])
248 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
249 #ifdef _WIN32
250 int main(int c, char **v) {return 0;}
251 #else
252 #error
253 int main(int c, char **v) {return x(y);}
254 #endif
255 ])],
256 bwin32=true; AC_MSG_RESULT([yes]),
257 bwin32=false; AC_MSG_RESULT([no]))
260 AM_CONDITIONAL(BUILD_NT_SERVICES, test x$bwin32 = xtrue)
262 dnl Enable C99 when compiling with MIPSpro
263 AC_MSG_CHECKING([for MIPSpro compiler])
264 AC_COMPILE_IFELSE([AC_LANG_PROGRAM(, [
265 #if (defined(__sgi) && defined(_COMPILER_VERSION))
266 #error
267   return x(y);
268 #endif
269 ])],
270 bmipspro=false; AC_MSG_RESULT(no),
271 bmipspro=true; AC_MSG_RESULT(yes))
273 if test "$bmipspro" = true; then
274   CFLAGS="$CFLAGS -c99"
277 AC_C_BIGENDIAN
279 AC_SEARCH_LIBS(socket, [socket network])
280 AC_SEARCH_LIBS(gethostbyname, [nsl])
281 AC_SEARCH_LIBS(dlopen, [dl])
282 AC_SEARCH_LIBS(inet_aton, [resolv])
283 AC_SEARCH_LIBS([clock_gettime], [rt], [have_rt=yes])
285 if test "$enable_threads" = "yes"; then
286   AC_SEARCH_LIBS(pthread_create, [pthread])
287   AC_SEARCH_LIBS(pthread_detach, [pthread])
290 dnl -------------------------------------------------------------------
291 dnl Check for functions before libevent, since libevent-1.2 apparently
292 dnl exports strlcpy without defining it in a header.
294 AC_CHECK_FUNCS(
295         _NSGetEnviron \
296         accept4 \
297         clock_gettime \
298         flock \
299         ftime \
300         getaddrinfo \
301         getifaddrs \
302         getrlimit \
303         gettimeofday \
304         gmtime_r \
305         inet_aton \
306         ioctl \
307         localtime_r \
308         lround \
309         memmem \
310         prctl \
311         rint \
312         socketpair \
313         strlcat \
314         strlcpy \
315         strptime \
316         strtok_r \
317         strtoull \
318         sysconf \
319         uname \
320         vasprintf \
323 using_custom_malloc=no
324 if test x$enable_openbsd_malloc = xyes ; then
325    AC_DEFINE(HAVE_MALLOC_GOOD_SIZE, 1, [Defined if we have the malloc_good_size function])
326    using_custom_malloc=yes
328 if test x$tcmalloc = xyes ; then
329    using_custom_malloc=yes
331 if test $using_custom_malloc = no ; then
332    AC_CHECK_FUNCS(mallinfo malloc_good_size malloc_usable_size)
335 if test "$enable_threads" = "yes"; then
336   AC_CHECK_HEADERS(pthread.h)
337   AC_CHECK_FUNCS(pthread_create)
340 dnl ------------------------------------------------------
341 dnl Where do you live, libevent?  And how do we call you?
343 if test "$bwin32" = true; then
344   TOR_LIB_WS32=-lws2_32
345   TOR_LIB_IPHLPAPI=-liphlpapi
346   # Some of the cargo-cults recommend -lwsock32 as well, but I don't
347   # think it's actually necessary.
348   TOR_LIB_GDI=-lgdi32
349 else
350   TOR_LIB_WS32=
351   TOR_LIB_GDI=
353 AC_SUBST(TOR_LIB_WS32)
354 AC_SUBST(TOR_LIB_GDI)
355 AC_SUBST(TOR_LIB_IPHLPAPI)
357 dnl We need to do this before we try our disgusting hack below.
358 AC_CHECK_HEADERS([sys/types.h])
360 dnl This is a disgusting hack so we safely include older libevent headers.
361 AC_CHECK_TYPE(u_int64_t, unsigned long long)
362 AC_CHECK_TYPE(u_int32_t, unsigned long)
363 AC_CHECK_TYPE(u_int16_t, unsigned short)
364 AC_CHECK_TYPE(u_int8_t, unsigned char)
366 tor_libevent_pkg_redhat="libevent"
367 tor_libevent_pkg_debian="libevent-dev"
368 tor_libevent_devpkg_redhat="libevent-devel"
369 tor_libevent_devpkg_debian="libevent-dev"
371 dnl On Gnu/Linux or any place we require it, we'll add librt to the Libevent
372 dnl linking for static builds.
373 STATIC_LIBEVENT_FLAGS=""
374 if test "$enable_static_libevent" = "yes"; then
375     if test "$have_rt" = yes; then
376       STATIC_LIBEVENT_FLAGS=" -lrt "
377     fi
380 TOR_SEARCH_LIBRARY(libevent, $trylibeventdir, [-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32], [
381 #ifdef _WIN32
382 #include <winsock2.h>
383 #endif
384 #include <stdlib.h>
385 #include <sys/time.h>
386 #include <sys/types.h>
387 #include <event.h>], [
388 #ifdef _WIN32
389 #include <winsock2.h>
390 #endif
391 void exit(int); void *event_init(void);],
392     [
393 #ifdef _WIN32
394 {WSADATA d; WSAStartup(0x101,&d); }
395 #endif
396 event_init(); exit(0);
397 ], [--with-libevent-dir], [/opt/libevent])
399 dnl Now check for particular libevent functions.
400 save_LIBS="$LIBS"
401 save_LDFLAGS="$LDFLAGS"
402 save_CPPFLAGS="$CPPFLAGS"
403 LIBS="-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32 $LIBS"
404 LDFLAGS="$TOR_LDFLAGS_libevent $LDFLAGS"
405 CPPFLAGS="$TOR_CPPFLAGS_libevent $CPPFLAGS"
406 AC_CHECK_FUNCS(event_get_version event_get_version_number event_get_method event_set_log_callback evdns_set_outgoing_bind_address event_base_loopexit)
407 AC_CHECK_MEMBERS([struct event.min_heap_idx], , ,
408 [#include <event.h>
411 AC_CHECK_HEADERS(event2/event.h event2/dns.h event2/bufferevent_ssl.h)
413 LIBS="$save_LIBS"
414 LDFLAGS="$save_LDFLAGS"
415 CPPFLAGS="$save_CPPFLAGS"
418 AM_CONDITIONAL(USE_EXTERNAL_EVDNS, test x$ac_cv_header_event2_dns_h = xyes)
420 if test "$enable_static_libevent" = "yes"; then
421    if test "$tor_cv_library_libevent_dir" = "(system)"; then
422      AC_MSG_ERROR("You must specify an explicit --with-libevent-dir=x option when using --enable-static-libevent")
423    else
424      TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent.a $STATIC_LIBEVENT_FLAGS"
425    fi
426 else
427      TOR_LIBEVENT_LIBS="-levent"
430 dnl This isn't the best test for Libevent 2.0.3-alpha.  Once it's released,
431 dnl we can do much better.
432 if test "$enable_bufferevents" = "yes" ; then
433   if test "$ac_cv_header_event2_bufferevent_ssl_h" != "yes" ; then
434     AC_MSG_ERROR([You've asked for bufferevent support, but you're using a version of Libevent without SSL support.  This won't work.  We need Libevent 2.0.8-rc or later, and you don't seem to even have Libevent 2.0.3-alpha.])
435   else
437     CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent"
439     # Check for the right version.  First see if version detection works.
440     AC_MSG_CHECKING([whether we can detect the Libevent version])
441     AC_COMPILE_IFELSE([AC_LANG_SOURCE([
442 #include <event2/event.h>
443 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 10
444 #error
445 int x = y(zz);
446 #else
447 int x = 1;
448 #endif
449   ])], [event_version_number_works=yes; AC_MSG_RESULT([yes]) ],
450      [event_version_number_works=no;  AC_MSG_RESULT([no])])
451     if test "$event_version_number_works" != 'yes'; then
452       AC_MSG_WARN([Version detection on Libevent seems broken.  Your Libevent installation is probably screwed up or very old.])
453     else
454       AC_MSG_CHECKING([whether Libevent is new enough for bufferevents])
455       AC_COMPILE_IFELSE([AC_LANG_SOURCE([
456 #include <event2/event.h>
457 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 0x02000d00
458 #error
459 int x = y(zz);
460 #else
461 int x = 1;
462 #endif
463    ])], [ AC_MSG_RESULT([yes]) ],
464       [ AC_MSG_RESULT([no])
465         AC_MSG_ERROR([Libevent does not seem new enough to support bufferevents.  We require 2.0.13-stable or later]) ] )
466     fi
467   fi
470 LIBS="$save_LIBS"
471 LDFLAGS="$save_LDFLAGS"
472 CPPFLAGS="$save_CPPFLAGS"
474 AM_CONDITIONAL(USE_BUFFEREVENTS, test "$enable_bufferevents" = "yes")
475 if test "$enable_bufferevents" = "yes"; then
476   AC_DEFINE(USE_BUFFEREVENTS, 1, [Defined if we're going to use Libevent's buffered IO API])
477   if test "$enable_static_libevent" = "yes"; then
478     TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent_openssl.a $TOR_LIBEVENT_LIBS"
479   else
480     TOR_LIBEVENT_LIBS="-levent_openssl $TOR_LIBEVENT_LIBS"
481   fi
483 AC_SUBST(TOR_LIBEVENT_LIBS)
485 dnl ------------------------------------------------------
486 dnl Where do you live, libm?
488 dnl On some platforms (Haiku/BeOS) the math library is
489 dnl part of libroot. In which case don't link against lm
490 TOR_LIB_MATH=""
491 save_LIBS="$LIBS"
492 AC_SEARCH_LIBS(pow, [m], , AC_MSG_ERROR([Could not find pow in libm or libc.]))
493 if test "$ac_cv_search_pow" != "none required"; then
494     TOR_LIB_MATH="$ac_cv_search_pow"
496 LIBS="$save_LIBS"
497 AC_SUBST(TOR_LIB_MATH)
499 dnl ------------------------------------------------------
500 dnl Where do you live, openssl?  And how do we call you?
502 tor_openssl_pkg_redhat="openssl"
503 tor_openssl_pkg_debian="libssl"
504 tor_openssl_devpkg_redhat="openssl-devel"
505 tor_openssl_devpkg_debian="libssl-dev"
507 ALT_openssl_WITHVAL=""
508 AC_ARG_WITH(ssl-dir,
509   [  --with-ssl-dir=PATH    Obsolete alias for --with-openssl-dir ],
510   [
511       if test "x$withval" != xno && test "x$withval" != "x" ; then
512          ALT_openssl_WITHVAL="$withval"
513       fi
514   ])
516 TOR_SEARCH_LIBRARY(openssl, $tryssldir, [-lssl -lcrypto $TOR_LIB_GDI],
517     [#include <openssl/rand.h>],
518     [void RAND_add(const void *buf, int num, double entropy);],
519     [RAND_add((void*)0,0,0); exit(0);], [],
520     [/usr/local/openssl /usr/lib/openssl /usr/local/ssl /usr/lib/ssl /usr/local /usr/athena /opt/openssl])
522 dnl XXXX check for OPENSSL_VERSION_NUMBER == SSLeay()
524 echo "tor_cv_library_openssl_dir is $tor_cv_library_openssl_dir"
525 if test "$enable_static_openssl" = "yes"; then
526    if test "$tor_cv_library_openssl_dir" = "(system)"; then
527      AC_MSG_ERROR("You must specify an explicit --with-openssl-dir=x option when using --enable-static-openssl")
528    else
529      TOR_OPENSSL_LIBS="$TOR_LIBDIR_openssl/libssl.a $TOR_LIBDIR_openssl/libcrypto.a"
530    fi
531 else
532      TOR_OPENSSL_LIBS="-lssl -lcrypto"
534 AC_SUBST(TOR_OPENSSL_LIBS)
536 dnl ------------------------------------------------------
537 dnl Where do you live, zlib?  And how do we call you?
539 tor_zlib_pkg_redhat="zlib"
540 tor_zlib_pkg_debian="zlib1g"
541 tor_zlib_devpkg_redhat="zlib-devel"
542 tor_zlib_devpkg_debian="zlib1g-dev"
544 TOR_SEARCH_LIBRARY(zlib, $tryzlibdir, [-lz],
545     [#include <zlib.h>],
546     [const char * zlibVersion(void);],
547     [zlibVersion(); exit(0);], [--with-zlib-dir],
548     [/opt/zlib])
550 if test "$enable_static_zlib" = "yes"; then
551    if test "$tor_cv_library_zlib_dir" = "(system)"; then
552      AC_MSG_ERROR("You must specify an explicit --with-zlib-dir=x option when
553  using --enable-static-zlib")
554    else
555      TOR_ZLIB_LIBS="$TOR_LIBDIR_zlib/libz.a"
556      echo "$TOR_LIBDIR_zlib/libz.a"
557    fi
558 else
559      TOR_ZLIB_LIBS="-lz"
561 AC_SUBST(TOR_ZLIB_LIBS)
563 dnl Make sure to enable support for large off_t if available.
566 dnl ------------------------------------------------------
567 dnl Where do you live, libnatpmp?  And how do we call you?
568 dnl There are no packages for Debian or Redhat as of this patch
570 if test "$natpmp" = "true"; then
571     AC_DEFINE(NAT_PMP, 1, [Define to 1 if we are building with nat-pmp.])
572     TOR_SEARCH_LIBRARY(libnatpmp, $trylibnatpmpdir, [-lnatpmp $TOR_LIB_WS32 $TOR_LIB_IPHLPAPI],
573         [#include <natpmp.h>],
574         [#ifdef _WIN32
575          #define STATICLIB
576          #endif
577          #include <natpmp.h>],
578         [   int r;
579             natpmp_t natpmp;
580             natpmpresp_t response;
581             r = initnatpmp(&natpmp, 0, 0);],
582             [printf("initnatpmp() returned %d (%s)\n", r, r?"FAILED":"SUCCESS");
583             exit(0);],
584         [--with-libnatpmp-dir],
585         [/usr/lib/])
589 dnl ------------------------------------------------------
590 dnl Where do you live, libminiupnpc?  And how do we call you?
591 dnl There are no packages for Debian or Redhat as of this patch
593 if test "$upnp" = "true"; then
594     AC_DEFINE(MINIUPNPC, 1, [Define to 1 if we are building with UPnP.])
595     TOR_SEARCH_LIBRARY(libminiupnpc, $trylibminiupnpcdir, [-lminiupnpc $TOR_LIB_WS32 $TOR_LIB_IPHLPAPI],
596         [#include <miniupnpc/miniwget.h>
597          #include <miniupnpc/miniupnpc.h>
598          #include <miniupnpc/upnpcommands.h>],
599         [void upnpDiscover(int delay, const char * multicastif,
600          const char * minissdpdsock, int sameport);],
601         [upnpDiscover(1, 0, 0, 0); exit(0);],
602         [--with-libminiupnpc-dir],
603         [/usr/lib/])
606 AC_SYS_LARGEFILE
608 AC_CHECK_HEADERS(
609         assert.h \
610         errno.h \
611         fcntl.h \
612         signal.h \
613         string.h \
614         sys/fcntl.h \
615         sys/stat.h \
616         sys/time.h \
617         sys/types.h \
618         time.h \
619         unistd.h
620  , , 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.))
622 dnl These headers are not essential
624 AC_CHECK_HEADERS(
625         arpa/inet.h \
626         crt_externs.h \
627         grp.h \
628         ifaddrs.h \
629         inttypes.h \
630         limits.h \
631         linux/types.h \
632         machine/limits.h \
633         malloc.h \
634         malloc/malloc.h \
635         malloc_np.h \
636         netdb.h \
637         netinet/in.h \
638         netinet/in6.h \
639         pwd.h \
640         stdint.h \
641         sys/file.h \
642         sys/ioctl.h \
643         sys/limits.h \
644         sys/mman.h \
645         sys/param.h \
646         sys/prctl.h \
647         sys/resource.h \
648         sys/socket.h \
649         sys/syslimits.h \
650         sys/time.h \
651         sys/types.h \
652         sys/un.h \
653         sys/utime.h \
654         sys/wait.h \
655         syslog.h \
656         utime.h
659 TOR_CHECK_PROTOTYPE(malloc_good_size, HAVE_MALLOC_GOOD_SIZE_PROTOTYPE,
660 [#ifdef HAVE_MALLOC_H
661 #include <malloc.h>
662 #endif
663 #ifdef HAVE_MALLOC_MALLOC_H
664 #include <malloc/malloc.h>
665 #endif])
667 AC_CHECK_HEADERS(net/if.h, net_if_found=1, net_if_found=0,
668 [#ifdef HAVE_SYS_TYPES_H
669 #include <sys/types.h>
670 #endif
671 #ifdef HAVE_SYS_SOCKET_H
672 #include <sys/socket.h>
673 #endif])
674 AC_CHECK_HEADERS(net/pfvar.h, net_pfvar_found=1, net_pfvar_found=0,
675 [#ifdef HAVE_SYS_TYPES_H
676 #include <sys/types.h>
677 #endif
678 #ifdef HAVE_SYS_SOCKET_H
679 #include <sys/socket.h>
680 #endif
681 #ifdef HAVE_NET_IF_H
682 #include <net/if.h>
683 #endif])
684 AC_CHECK_HEADERS(linux/netfilter_ipv4.h,
685         linux_netfilter_ipv4=1, linux_netfilter_ipv4=0,
686 [#ifdef HAVE_SYS_TYPES_H
687 #include <sys/types.h>
688 #endif
689 #ifdef HAVE_SYS_SOCKET_H
690 #include <sys/socket.h>
691 #endif
692 #ifdef HAVE_LIMITS_H
693 #include <limits.h>
694 #endif
695 #ifdef HAVE_LINUX_TYPES_H
696 #include <linux/types.h>
697 #endif
698 #ifdef HAVE_NETINET_IN6_H
699 #include <netinet/in6.h>
700 #endif
701 #ifdef HAVE_NETINET_IN_H
702 #include <netinet/in.h>
703 #endif])
705 if test x$transparent = xtrue ; then
706    transparent_ok=0
707    if test x$net_if_found = x1 && test x$net_pfvar_found = x1 ; then
708      transparent_ok=1
709    fi
710    if test x$linux_netfilter_ipv4 = x1 ; then
711      transparent_ok=1
712    fi
713    if test x$transparent_ok = x1 ; then
714      AC_DEFINE(USE_TRANSPARENT, 1, "Define to enable transparent proxy support")
715      case $host in
716        *-*-openbsd*)
717          AC_DEFINE(OPENBSD, 1, "Define to handle pf on OpenBSD properly") ;;
718      esac
719    else
720      AC_MSG_NOTICE([Transparent proxy support enabled, but missing headers.])
721    fi
724 AC_CHECK_MEMBERS([struct timeval.tv_sec], , ,
725 [#ifdef HAVE_SYS_TYPES_H
726 #include <sys/types.h>
727 #endif
728 #ifdef HAVE_SYS_TIME_H
729 #include <sys/time.h>
730 #endif])
732 dnl In case we aren't given a working stdint.h, we'll need to grow our own.
733 dnl Watch out.
735 AC_CHECK_SIZEOF(int8_t)
736 AC_CHECK_SIZEOF(int16_t)
737 AC_CHECK_SIZEOF(int32_t)
738 AC_CHECK_SIZEOF(int64_t)
739 AC_CHECK_SIZEOF(uint8_t)
740 AC_CHECK_SIZEOF(uint16_t)
741 AC_CHECK_SIZEOF(uint32_t)
742 AC_CHECK_SIZEOF(uint64_t)
743 AC_CHECK_SIZEOF(intptr_t)
744 AC_CHECK_SIZEOF(uintptr_t)
746 dnl AC_CHECK_TYPES([int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t, uint64_t, intptr_t, uintptr_t])
748 AC_CHECK_SIZEOF(char)
749 AC_CHECK_SIZEOF(short)
750 AC_CHECK_SIZEOF(int)
751 AC_CHECK_SIZEOF(long)
752 AC_CHECK_SIZEOF(long long)
753 AC_CHECK_SIZEOF(__int64)
754 AC_CHECK_SIZEOF(void *)
755 AC_CHECK_SIZEOF(time_t)
756 AC_CHECK_SIZEOF(size_t)
758 AC_CHECK_TYPES([uint, u_char, ssize_t])
760 dnl used to include sockaddr_storage, but everybody has that.
761 AC_CHECK_TYPES([struct in6_addr, struct sockaddr_in6, sa_family_t], , ,
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 _WIN32
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
786 AC_CHECK_MEMBERS([struct in6_addr.s6_addr32, struct in6_addr.s6_addr16, struct sockaddr_in.sin_len, struct sockaddr_in6.sin6_len], , ,
787 [#ifdef HAVE_SYS_TYPES_H
788 #include <sys/types.h>
789 #endif
790 #ifdef HAVE_NETINET_IN_H
791 #include <netinet/in.h>
792 #endif
793 #ifdef HAVE_NETINET_IN6_H
794 #include <netinet/in6.h>
795 #endif
796 #ifdef HAVE_SYS_SOCKET_H
797 #include <sys/socket.h>
798 #endif
799 #ifdef _WIN32
800 #define WIN32_WINNT 0x400
801 #define _WIN32_WINNT 0x400
802 #define WIN32_LEAN_AND_MEAN
803 #if defined(_MSC_VER) && (_MSC_VER < 1300)
804 #include <winsock.h>
805 #else
806 #include <winsock2.h>
807 #include <ws2tcpip.h>
808 #endif
809 #endif
812 AC_CHECK_TYPES([rlim_t], , ,
813 [#ifdef HAVE_SYS_TYPES_H
814 #include <sys/types.h>
815 #endif
816 #ifdef HAVE_SYS_TIME_H
817 #include <sys/time.h>
818 #endif
819 #ifdef HAVE_SYS_RESOURCE_H
820 #include <sys/resource.h>
821 #endif
824 AC_CACHE_CHECK([whether time_t is signed], tor_cv_time_t_signed, [
825 AC_RUN_IFELSE([AC_LANG_SOURCE([
826 #ifdef HAVE_SYS_TYPES_H
827 #include <sys/types.h>
828 #endif
829 #ifdef HAVE_SYS_TIME_H
830 #include <sys/time.h>
831 #endif
832 #ifdef HAVE_TIME_H
833 #include <time.h>
834 #endif
835 int main(int c, char**v) { if (((time_t)-1)<0) return 1; else return 0; }])],
836   tor_cv_time_t_signed=no, tor_cv_time_t_signed=yes, tor_cv_time_t_signed=cross)
839 if test "$tor_cv_time_t_signed" = cross; then
840   AC_MSG_NOTICE([Cross compiling: assuming that time_t is signed.])
843 if test "$tor_cv_time_t_signed" != no; then
844   AC_DEFINE([TIME_T_IS_SIGNED], 1,
845             [Define to 1 iff time_t is signed])
848 AC_CACHE_CHECK([whether size_t is signed], tor_cv_size_t_signed, [
849 AC_RUN_IFELSE([AC_LANG_SOURCE([
850 #ifdef HAVE_SYS_TYPES_H
851 #include <sys/types.h>
852 #endif
853 int main(int c, char**v) { if (((size_t)-1)<0) return 1; else return 0; }])],
854   tor_cv_size_t_signed=no, tor_cv_size_t_signed=yes, tor_cv_size_t_signed=cross)
857 if test "$tor_cv_size_t_signed" = cross; then
858   AC_MSG_NOTICE([Cross compiling: assuming that size_t is not signed.])
861 if test "$tor_cv_size_t_signed" = yes; then
862   AC_MSG_ERROR([You have a signed size_t; that's grossly nonconformant.])
865 AC_CHECK_SIZEOF(socklen_t, , [AC_INCLUDES_DEFAULT()
866 #ifdef HAVE_SYS_SOCKET_H
867 #include <sys/socket.h>
868 #endif
871 # We want to make sure that we _don't_ have a cell_t defined, like IRIX does.
873 AC_CHECK_SIZEOF(cell_t)
875 # Now make sure that NULL can be represented as zero bytes.
876 AC_CACHE_CHECK([whether memset(0) sets pointers to NULL], tor_cv_null_is_zero,
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 () { char *p1,*p2; p1=NULL; memset(&p2,0,sizeof(p2));
885 return memcmp(&p1,&p2,sizeof(char*))?1:0; }]])],
886        [tor_cv_null_is_zero=yes],
887        [tor_cv_null_is_zero=no],
888        [tor_cv_null_is_zero=cross])])
890 if test "$tor_cv_null_is_zero" = cross ; then
891   # Cross-compiling; let's hope that the target isn't raving mad.
892   AC_MSG_NOTICE([Cross-compiling: we'll assume that NULL is represented as a sequence of 0-valued bytes.])
895 if test "$tor_cv_null_is_zero" != no; then
896   AC_DEFINE([NULL_REP_IS_ZERO_BYTES], 1,
897             [Define to 1 iff memset(0) sets pointers to NULL])
900 # And what happens when we malloc zero?
901 AC_CACHE_CHECK([whether we can malloc(0) safely.], tor_cv_malloc_zero_works,
902 [AC_RUN_IFELSE([AC_LANG_SOURCE(
903 [[#include <stdlib.h>
904 #include <string.h>
905 #include <stdio.h>
906 #ifdef HAVE_STDDEF_H
907 #include <stddef.h>
908 #endif
909 int main () { return malloc(0)?0:1; }]])],
910        [tor_cv_malloc_zero_works=yes],
911        [tor_cv_malloc_zero_works=no],
912        [tor_cv_malloc_zero_works=cross])])
914 if test "$tor_cv_malloc_zero_works" = cross; then
915   # Cross-compiling; let's hope that the target isn't raving mad.
916   AC_MSG_NOTICE([Cross-compiling: we'll assume that we need to check malloc() arguments for 0.])
919 if test "$tor_cv_malloc_zero_works" = yes; then
920   AC_DEFINE([MALLOC_ZERO_WORKS], 1,
921             [Define to 1 iff malloc(0) returns a pointer])
924 # whether we seem to be in a 2s-complement world.
925 AC_CACHE_CHECK([whether we are using 2s-complement arithmetic], tor_cv_twos_complement,
926 [AC_RUN_IFELSE([AC_LANG_SOURCE(
927 [[int main () { int problem = ((-99) != (~99)+1);
928 return problem ? 1 : 0; }]])],
929        [tor_cv_twos_complement=yes],
930        [tor_cv_twos_complement=no],
931        [tor_cv_twos_complement=cross])])
933 if test "$tor_cv_twos_complement" = cross ; then
934   # Cross-compiling; let's hope that the target isn't raving mad.
935   AC_MSG_NOTICE([Cross-compiling: we'll assume that negative integers are represented with two's complement.])
938 if test "$tor_cv_twos_complement" != no ; then
939   AC_DEFINE([USING_TWOS_COMPLEMENT], 1,
940             [Define to 1 iff we represent negative integers with two's complement])
943 # What does shifting a negative value do?
944 AC_CACHE_CHECK([whether right-shift on negative values does sign-extension], tor_cv_sign_extend,
945 [AC_RUN_IFELSE([AC_LANG_SOURCE(
946 [[int main () { int okay = (-60 >> 8) == -1; return okay ? 0 : 1; }]])],
947        [tor_cv_sign_extend=yes],
948        [tor_cv_sign_extend=no],
949        [tor_cv_sign_extend=cross])])
951 if test "$tor_cv_sign_extend" = cross ; then
952   # Cross-compiling; let's hope that the target isn't raving mad.
953   AC_MSG_NOTICE([Cross-compiling: we'll assume that right-shifting negative integers causes sign-extension])
956 if test "$tor_cv_sign_extend" != no ; then
957   AC_DEFINE([RSHIFT_DOES_SIGN_EXTEND], 1,
958             [Define to 1 iff right-shifting a negative value performs sign-extension])
961 # Whether we should use the dmalloc memory allocation debugging library.
962 AC_MSG_CHECKING(whether to use dmalloc (debug memory allocation library))
963 AC_ARG_WITH(dmalloc,
964 [  --with-dmalloc          Use debug memory allocation library. ],
965 [if [[ "$withval" = "yes" ]]; then
966   dmalloc=1
967   AC_MSG_RESULT(yes)
968 else
969   dmalloc=1
970   AC_MSG_RESULT(no)
971 fi], [ dmalloc=0; AC_MSG_RESULT(no) ]
974 if [[ $dmalloc -eq 1 ]]; then
975   AC_CHECK_HEADERS(dmalloc.h, , AC_MSG_ERROR(dmalloc header file not found. Do you have the development files for dmalloc installed?))
976   AC_SEARCH_LIBS(dmalloc_malloc, [dmallocth dmalloc], , AC_MSG_ERROR(Libdmalloc library not found. If you enable it you better have it installed.))
977   AC_DEFINE(USE_DMALLOC, 1, [Debug memory allocation library])
978   AC_DEFINE(DMALLOC_FUNC_CHECK, 1, [Enable dmalloc's malloc function check])
979   AC_CHECK_FUNCS(dmalloc_strdup dmalloc_strndup)
982 AC_ARG_WITH(tcmalloc,
983 [  --with-tcmalloc         Use tcmalloc memory allocation library. ],
984 [ tcmalloc=yes ], [ tcmalloc=no ])
986 if test x$tcmalloc = xyes ; then
987    LDFLAGS="-ltcmalloc $LDFLAGS"
990 # By default, we're going to assume we don't have mlockall()
991 # bionic and other platforms have various broken mlockall subsystems.
992 # Some systems don't have a working mlockall, some aren't linkable,
993 # and some have it but don't declare it.
994 AC_CHECK_FUNCS(mlockall)
995 AC_CHECK_DECLS([mlockall], , , [
996 #ifdef HAVE_SYS_MMAN_H
997 #include <sys/mman.h>
998 #endif])
1000 # Allow user to specify an alternate syslog facility
1001 AC_ARG_WITH(syslog-facility,
1002 [  --with-syslog-facility=LOG syslog facility to use (default=LOG_DAEMON)],
1003 syslog_facility="$withval", syslog_facility="LOG_DAEMON")
1004 AC_DEFINE_UNQUOTED(LOGFACILITY,$syslog_facility,[name of the syslog facility])
1005 AC_SUBST(LOGFACILITY)
1007 # Check if we have getresuid and getresgid
1008 AC_CHECK_FUNCS(getresuid getresgid)
1010 # Check for gethostbyname_r in all its glorious incompatible versions.
1011 #   (This logic is based on that in Python's configure.in)
1012 AH_TEMPLATE(HAVE_GETHOSTBYNAME_R,
1013   [Define this if you have any gethostbyname_r()])
1015 AC_CHECK_FUNC(gethostbyname_r, [
1016   AC_MSG_CHECKING([how many arguments gethostbyname_r() wants])
1017   OLD_CFLAGS=$CFLAGS
1018   CFLAGS="$CFLAGS $MY_CPPFLAGS $MY_THREAD_CPPFLAGS $MY_CFLAGS"
1019   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
1020 #include <netdb.h>
1021   ], [[
1022     char *cp1, *cp2;
1023     struct hostent *h1, *h2;
1024     int i1, i2;
1025     (void)gethostbyname_r(cp1,h1,cp2,i1,&h2,&i2);
1026   ]])],[
1027     AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1028     AC_DEFINE(HAVE_GETHOSTBYNAME_R_6_ARG, 1,
1029      [Define this if gethostbyname_r takes 6 arguments])
1030     AC_MSG_RESULT(6)
1031   ], [
1032     AC_TRY_COMPILE([
1033 #include <netdb.h>
1034     ], [
1035       char *cp1, *cp2;
1036       struct hostent *h1;
1037       int i1, i2;
1038       (void)gethostbyname_r(cp1,h1,cp2,i1,&i2);
1039     ], [
1040       AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1041       AC_DEFINE(HAVE_GETHOSTBYNAME_R_5_ARG, 1,
1042         [Define this if gethostbyname_r takes 5 arguments])
1043       AC_MSG_RESULT(5)
1044    ], [
1045       AC_TRY_COMPILE([
1046 #include <netdb.h>
1047      ], [
1048        char *cp1;
1049        struct hostent *h1;
1050        struct hostent_data hd;
1051        (void) gethostbyname_r(cp1,h1,&hd);
1052      ], [
1053        AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1054        AC_DEFINE(HAVE_GETHOSTBYNAME_R_3_ARG, 1,
1055          [Define this if gethostbyname_r takes 3 arguments])
1056        AC_MSG_RESULT(3)
1057      ], [
1058        AC_MSG_RESULT(0)
1059      ])
1060   ])
1061  ])
1062  CFLAGS=$OLD_CFLAGS
1065 AC_CACHE_CHECK([whether the C compiler supports __func__],
1066   tor_cv_have_func_macro,
1067   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1068 #include <stdio.h>
1069 int main(int c, char **v) { puts(__func__); }])],
1070   tor_cv_have_func_macro=yes,
1071   tor_cv_have_func_macro=no))
1073 AC_CACHE_CHECK([whether the C compiler supports __FUNC__],
1074   tor_cv_have_FUNC_macro,
1075   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1076 #include <stdio.h>
1077 int main(int c, char **v) { puts(__FUNC__); }])],
1078   tor_cv_have_FUNC_macro=yes,
1079   tor_cv_have_FUNC_macro=no))
1081 AC_CACHE_CHECK([whether the C compiler supports __FUNCTION__],
1082   tor_cv_have_FUNCTION_macro,
1083   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1084 #include <stdio.h>
1085 int main(int c, char **v) { puts(__FUNCTION__); }])],
1086   tor_cv_have_FUNCTION_macro=yes,
1087   tor_cv_have_FUNCTION_macro=no))
1089 AC_CACHE_CHECK([whether we have extern char **environ already declared],
1090   tor_cv_have_environ_declared,
1091   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1092 /* We define _GNU_SOURCE here because it is also defined in compat.c.
1093  * Without it environ doesn't get declared. */
1094 #define _GNU_SOURCE
1095 #include <unistd.h>
1096 int main(int c, char **v) { char **t = environ; }])],
1097   tor_cv_have_environ_declared=yes,
1098   tor_cv_have_environ_declared=no))
1100 if test "$tor_cv_have_func_macro" = 'yes'; then
1101   AC_DEFINE(HAVE_MACRO__func__, 1, [Defined if the compiler supports __func__])
1104 if test "$tor_cv_have_FUNC_macro" = 'yes'; then
1105   AC_DEFINE(HAVE_MACRO__FUNC__, 1, [Defined if the compiler supports __FUNC__])
1108 if test "$tor_cv_have_FUNCTION_macro" = 'yes'; then
1109   AC_DEFINE(HAVE_MACRO__FUNCTION__, 1,
1110            [Defined if the compiler supports __FUNCTION__])
1113 if test "$tor_cv_have_environ_declared" = 'yes'; then
1114   AC_DEFINE(HAVE_EXTERN_ENVIRON_DECLARED__, 1,
1115            [Defined if we have extern char **environ already declared])
1118 # $prefix stores the value of the --prefix command line option, or
1119 # NONE if the option wasn't set.  In the case that it wasn't set, make
1120 # it be the default, so that we can use it to expand directories now.
1121 if test "x$prefix" = "xNONE"; then
1122   prefix=$ac_default_prefix
1125 # and similarly for $exec_prefix
1126 if test "x$exec_prefix" = "xNONE"; then
1127   exec_prefix=$prefix
1130 if test "x$BUILDDIR" = "x"; then
1131   BUILDDIR=`pwd`
1133 AC_SUBST(BUILDDIR)
1134 AH_TEMPLATE([BUILDDIR],[tor's build directory])
1135 AC_DEFINE_UNQUOTED(BUILDDIR,"$BUILDDIR")
1137 if test "x$CONFDIR" = "x"; then
1138   CONFDIR=`eval echo $sysconfdir/tor`
1140 AC_SUBST(CONFDIR)
1141 AH_TEMPLATE([CONFDIR],[tor's configuration directory])
1142 AC_DEFINE_UNQUOTED(CONFDIR,"$CONFDIR")
1144 BINDIR=`eval echo $bindir`
1145 AC_SUBST(BINDIR)
1146 LOCALSTATEDIR=`eval echo $localstatedir`
1147 AC_SUBST(LOCALSTATEDIR)
1149 if test "$bwin32" = true; then
1150   # Test if the linker supports the --nxcompat and --dynamicbase options
1151   # for Windows
1152   save_LDFLAGS="$LDFLAGS"
1153   LDFLAGS="-Wl,--nxcompat -Wl,--dynamicbase"
1154   AC_MSG_CHECKING([whether the linker supports DllCharacteristics])
1155   AC_LINK_IFELSE([AC_LANG_PROGRAM([])],
1156     [AC_MSG_RESULT([yes])]
1157     [save_LDFLAGS="$save_LDFLAGS $LDFLAGS"],
1158     [AC_MSG_RESULT([no])]
1159   )
1160   LDFLAGS="$save_LDFLAGS"
1163 # Set CFLAGS _after_ all the above checks, since our warnings are stricter
1164 # than autoconf's macros like.
1165 if test "$GCC" = yes; then
1166   # Disable GCC's strict aliasing checks.  They are an hours-to-debug
1167   # accident waiting to happen.
1168   CFLAGS="$CFLAGS -Wall -fno-strict-aliasing"
1169 else
1170   # Autoconf sets -g -O2 by default. Override optimization level
1171   # for non-gcc compilers
1172   CFLAGS="$CFLAGS -O"
1173   enable_gcc_warnings=no
1174   enable_gcc_warnings_advisory=no
1177 # OS X Lion started deprecating the system openssl. Let's just disable
1178 # all deprecation warnings on OS X. Also, to potentially make the binary
1179 # a little smaller, let's enable dead_strip.
1180 case "$host_os" in
1182  darwin*)
1183     CFLAGS="$CFLAGS -Wno-deprecated-declarations"
1184     LDFLAGS="$LDFLAGS -dead_strip" ;;
1185 esac
1187 # Add some more warnings which we use in development but not in the
1188 # released versions.  (Some relevant gcc versions can't handle these.)
1189 if test x$enable_gcc_warnings = xyes || test x$enable_gcc_warnings_advisory = xyes; then
1191   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1192 #if !defined(__GNUC__) || (__GNUC__ < 4)
1193 #error
1194 #endif])], have_gcc4=yes, have_gcc4=no)
1196   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1197 #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 2)
1198 #error
1199 #endif])], have_gcc42=yes, have_gcc42=no)
1201   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1202 #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 3)
1203 #error
1204 #endif])], have_gcc43=yes, have_gcc43=no)
1206 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1207 #if !defined(__clang__)
1208 #error
1209 #endif])], have_clang=yes, have_clang=no)
1211   save_CFLAGS="$CFLAGS"
1212   CFLAGS="$CFLAGS -Wshorten-64-to-32"
1213   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], have_shorten64_flag=yes,
1214                     have_shorten64_flag=no)
1215   CFLAGS="$save_CFLAGS"
1217   case $host in
1218     *-*-openbsd*)
1219       # Some OpenBSD versions (like 4.8) have -Wsystem-headers by default.
1220       # That's fine, except that the headers don't pass -Wredundant-decls.
1221       # Therefore, let's disable -Wsystem-headers when we're building
1222       # with maximal warnings on OpenBSD.
1223       CFLAGS="$CFLAGS -Wno-system-headers" ;;
1224   esac
1226   CFLAGS="$CFLAGS -W -Wfloat-equal -Wundef -Wpointer-arith"
1227   CFLAGS="$CFLAGS -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings"
1228   CFLAGS="$CFLAGS -Wredundant-decls -Wchar-subscripts -Wcomment -Wformat=2"
1229   CFLAGS="$CFLAGS -Wwrite-strings -Wmissing-declarations -Wredundant-decls"
1230   CFLAGS="$CFLAGS -Wnested-externs -Wbad-function-cast -Wswitch-enum"
1232   if test x$enable_gcc_warnings = xyes; then
1233     CFLAGS="$CFLAGS -Werror"
1234   fi
1236   # Disabled, so we can use mallinfo(): -Waggregate-return
1238   if test x$have_gcc4 = xyes ; then
1239     # These warnings break gcc 3.3.5 and work on gcc 4.0.2
1240     CFLAGS="$CFLAGS -Winit-self -Wmissing-field-initializers -Wdeclaration-after-statement -Wold-style-definition"
1241   fi
1243   if test x$have_gcc42 = xyes ; then
1244     # These warnings break gcc 4.0.2 and work on gcc 4.2
1245     # XXXX020 See if any of these work with earlier versions.
1246     CFLAGS="$CFLAGS -Waddress -Wmissing-noreturn -Wstrict-overflow=1"
1248     # We used to use -Wstrict-overflow=5, but that breaks us heavily under 4.3.
1249   fi
1251   if test x$have_gcc42 = xyes && test x$have_clang = xno; then
1252     # These warnings break gcc 4.0.2 and clang, but work on gcc 4.2
1253     CFLAGS="$CFLAGS -Wnormalized=id -Woverride-init"
1254   fi
1256   if test x$have_gcc43 = xyes ; then
1257     # These warnings break gcc 4.2 and work on gcc 4.3
1258     # XXXX020 See if any of these work with earlier versions.
1259     CFLAGS="$CFLAGS -Wextra -Warray-bounds"
1260   fi
1262   if test x$have_shorten64_flag = xyes ; then
1263     CFLAGS="$CFLAGS -Wshorten-64-to-32"
1264   fi
1266 ##This will break the world on some 64-bit architectures
1267 # CFLAGS="$CFLAGS -Winline"
1272 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent $TOR_CPPFLAGS_openssl $TOR_CPPFLAGS_zlib"
1274 AC_CONFIG_FILES([
1275         Doxyfile
1276         Makefile
1277         contrib/Makefile
1278         contrib/suse/Makefile
1279         contrib/suse/tor.sh
1280         contrib/tor.logrotate
1281         contrib/tor.sh
1282         contrib/torctl
1283         contrib/torify
1284         doc/Makefile
1285         src/Makefile
1286         src/common/Makefile
1287         src/config/Makefile
1288         src/config/torrc.sample
1289         src/or/Makefile
1290         src/test/Makefile
1291         src/tools/Makefile
1292         src/tools/tor-fw-helper/Makefile
1293         src/win32/Makefile
1294         tor.spec
1297 AC_OUTPUT
1299 if test -x /usr/bin/perl && test -x ./contrib/updateVersions.pl ; then
1300   ./contrib/updateVersions.pl