bump to 0.2.4.3-alpha
[tor.git] / configure.ac
blobea14ad2aa56245d7402502f848ce8e1e0f602f4c
1 dnl Copyright (c) 2001-2004, Roger Dingledine
2 dnl Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson
3 dnl Copyright (c) 2007-2012, The Tor Project, Inc.
4 dnl See LICENSE for licensing information
6 AC_INIT([tor],[0.2.4.3-alpha])
7 AC_CONFIG_SRCDIR([src/or/main.c])
8 AM_INIT_AUTOMAKE
9 m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
10 AC_CONFIG_HEADERS([orconfig.h])
12 AC_CANONICAL_HOST
14 if test -f /etc/redhat-release ; then
15   if test -f /usr/kerberos/include ; then
16     CPPFLAGS="$CPPFLAGS -I/usr/kerberos/include"
17   fi
20 # Not a no-op; we want to make sure that CPPFLAGS is set before we use
21 # the += operator on it in src/or/Makefile.am
22 CPPFLAGS="$CPPFLAGS -I\${top_srcdir}/src/common"
24 #XXXX020 We should make these enabled or not, before 0.2.0.x-final
25 AC_ARG_ENABLE(buf-freelists,
26    AS_HELP_STRING(--disable-buf-freelists, disable freelists for buffer RAM))
27 AC_ARG_ENABLE(openbsd-malloc,
28    AS_HELP_STRING(--enable-openbsd-malloc, Use malloc code from openbsd.  Linux only))
29 AC_ARG_ENABLE(instrument-downloads,
30    AS_HELP_STRING(--enable-instrument-downloads, Instrument downloads of directory resources etc.))
31 AC_ARG_ENABLE(static-openssl,
32    AS_HELP_STRING(--enable-static-openssl, Link against a static openssl library. Requires --with-openssl-dir))
33 AC_ARG_ENABLE(static-libevent,
34    AS_HELP_STRING(--enable-static-libevent, Link against a static libevent library. Requires --with-libevent-dir))
35 AC_ARG_ENABLE(static-zlib,
36    AS_HELP_STRING(--enable-static-zlib, Link against a static zlib library. Requires --with-zlib-dir))
37 AC_ARG_ENABLE(static-tor,
38    AS_HELP_STRING(--enable-static-tor, Create an entirely static Tor binary. Requires --with-openssl-dir and --with-libevent-dir and --with-zlib-dir))
40 if test "$enable_static_tor" = "yes"; then
41   enable_static_libevent="yes";
42   enable_static_openssl="yes";
43   enable_static_zlib="yes";
44   CFLAGS="$CFLAGS -static"
47 if test x$enable_buf_freelists != xno; then
48   AC_DEFINE(ENABLE_BUF_FREELISTS, 1,
49             [Defined if we try to use freelists for buffer RAM chunks])
51 AM_CONDITIONAL(USE_OPENBSD_MALLOC, test x$enable_openbsd_malloc = xyes)
52 if test x$enable_instrument_downloads = xyes; then
53   AC_DEFINE(INSTRUMENT_DOWNLOADS, 1,
54             [Defined if we want to keep track of how much of each kind of resource we download.])
57 AC_ARG_ENABLE(transparent,
58      AS_HELP_STRING(--disable-transparent, disable transparent proxy support),
59      [case "${enableval}" in
60         yes) transparent=true ;;
61         no)  transparent=false ;;
62         *) AC_MSG_ERROR(bad value for --enable-transparent) ;;
63       esac], [transparent=true])
65 AC_ARG_ENABLE(asciidoc,
66      AS_HELP_STRING(--disable-asciidoc, don't use asciidoc (disables building of manpages)),
67      [case "${enableval}" in
68         yes) asciidoc=true ;;
69         no)  asciidoc=false ;;
70         *) AC_MSG_ERROR(bad value for --disable-asciidoc) ;;
71       esac], [asciidoc=true])
73 # By default, we're not ready to ship a NAT-PMP aware Tor
74 AC_ARG_ENABLE(nat-pmp,
75      AS_HELP_STRING(--enable-nat-pmp, enable NAT-PMP support),
76      [case "${enableval}" in
77         yes) natpmp=true ;;
78         no)  natpmp=false ;;
79         * ) AC_MSG_ERROR(bad value for --enable-nat-pmp) ;;
80       esac], [natpmp=false])
82 # By default, we're not ready to ship a UPnP aware Tor
83 AC_ARG_ENABLE(upnp,
84      AS_HELP_STRING(--enable-upnp, enable UPnP support),
85      [case "${enableval}" in
86         yes) upnp=true ;;
87         no)  upnp=false ;;
88         * ) AC_MSG_ERROR(bad value for --enable-upnp) ;;
89       esac], [upnp=false])
92 AC_ARG_ENABLE(threads,
93      AS_HELP_STRING(--disable-threads, disable multi-threading support))
95 if test x$enable_threads = x; then
96    case $host in
97     *-*-solaris* )
98      # Don't try multithreading on solaris -- cpuworkers seem to lock.
99      AC_MSG_NOTICE([You are running Solaris; Sometimes threading makes
100 cpu workers lock up here, so I will disable threads.])
101      enable_threads="no";;
102     *)
103      enable_threads="yes";;
104    esac
107 if test "$enable_threads" = "yes"; then
108   AC_DEFINE(ENABLE_THREADS, 1, [Defined if we will try to use multithreading])
111 case $host in
112    *-*-solaris* )
113      AC_DEFINE(_REENTRANT, 1, [Define on some platforms to activate x_r() functions in time.h])
114      ;;
115 esac
117 AC_ARG_ENABLE(gcc-warnings,
118      AS_HELP_STRING(--enable-gcc-warnings, enable verbose warnings))
119 AC_ARG_ENABLE(gcc-warnings-advisory,
120      AS_HELP_STRING(--enable-gcc-warnings-advisory, [enable verbose warnings, excluding -Werror]))
122 dnl Adam shostack suggests the following for Windows:
123 dnl -D_FORTIFY_SOURCE=2 -fstack-protector-all
124 dnl Others suggest '/gs /safeseh /nxcompat /dynamicbase' for non-gcc on Windows
125 dnl This requires that we use gcc and that we add -O2 to the CFLAGS.
126 AC_ARG_ENABLE(gcc-hardening,
127     AS_HELP_STRING(--disable-gcc-hardening, disable compiler security checks))
129 dnl Linker hardening options
130 dnl Currently these options are ELF specific - you can't use this with MacOSX
131 AC_ARG_ENABLE(linker-hardening,
132     AS_HELP_STRING(--disable-linker-hardening, disable linker security fixups))
134 AC_ARG_ENABLE(local-appdata,
135    AS_HELP_STRING(--enable-local-appdata, default to host local application data paths on Windows))
136 if test "$enable_local_appdata" = "yes"; then
137   AC_DEFINE(ENABLE_LOCAL_APPDATA, 1,
138             [Defined if we default to host local appdata paths on Windows])
141 # Tor2web mode flag
142 AC_ARG_ENABLE(tor2web-mode,
143      AS_HELP_STRING(--enable-tor2web-mode, support tor2web non-anonymous mode),
144 [if test x$enableval = xyes; then
145     CFLAGS="$CFLAGS -D ENABLE_TOR2WEB_MODE=1"
146 fi])
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], [], [Define to nothing if C supports flexible array members, and to 1 if it does not.])
193  else
194    AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [1], [Define to nothing if C supports flexible array members, and to 1 if it does not.])
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 AM_CONDITIONAL(BUILD_NT_SERVICES, test x$bwin32 = xtrue)
255 dnl Enable C99 when compiling with MIPSpro
256 AC_MSG_CHECKING([for MIPSpro compiler])
257 AC_COMPILE_IFELSE([AC_LANG_PROGRAM(, [
258 #if (defined(__sgi) && defined(_COMPILER_VERSION))
259 #error
260   return x(y);
261 #endif
262 ])],
263 bmipspro=false; AC_MSG_RESULT(no),
264 bmipspro=true; AC_MSG_RESULT(yes))
266 if test "$bmipspro" = true; then
267   CFLAGS="$CFLAGS -c99"
270 AC_C_BIGENDIAN
272 AC_SEARCH_LIBS(socket, [socket network])
273 AC_SEARCH_LIBS(gethostbyname, [nsl])
274 AC_SEARCH_LIBS(dlopen, [dl])
275 AC_SEARCH_LIBS(inet_aton, [resolv])
276 saved_LIBS="$LIBS"
277 AC_SEARCH_LIBS([clock_gettime], [rt])
278 if test "$LIBS" != "$saved_LIBS"; then
279    # Looks like we need -lrt for clock_gettime().
280    have_rt=yes
283 if test "$enable_threads" = "yes"; then
284   AC_SEARCH_LIBS(pthread_create, [pthread])
285   AC_SEARCH_LIBS(pthread_detach, [pthread])
288 dnl -------------------------------------------------------------------
289 dnl Check for functions before libevent, since libevent-1.2 apparently
290 dnl exports strlcpy without defining it in a header.
292 AC_CHECK_FUNCS(
293         _NSGetEnviron \
294         accept4 \
295         clock_gettime \
296         flock \
297         ftime \
298         getaddrinfo \
299         getifaddrs \
300         getrlimit \
301         gettimeofday \
302         gmtime_r \
303         inet_aton \
304         ioctl \
305         issetugid \
306         llround \
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 if test "$enable_threads" = "yes"; then
324   AC_CHECK_HEADERS(pthread.h)
325   AC_CHECK_FUNCS(pthread_create)
328 dnl ------------------------------------------------------
329 dnl Where do you live, libevent?  And how do we call you?
331 if test "$bwin32" = true; then
332   TOR_LIB_WS32=-lws2_32
333   TOR_LIB_IPHLPAPI=-liphlpapi
334   # Some of the cargo-cults recommend -lwsock32 as well, but I don't
335   # think it's actually necessary.
336   TOR_LIB_GDI=-lgdi32
337 else
338   TOR_LIB_WS32=
339   TOR_LIB_GDI=
341 AC_SUBST(TOR_LIB_WS32)
342 AC_SUBST(TOR_LIB_GDI)
343 AC_SUBST(TOR_LIB_IPHLPAPI)
345 dnl We need to do this before we try our disgusting hack below.
346 AC_CHECK_HEADERS([sys/types.h])
348 dnl This is a disgusting hack so we safely include older libevent headers.
349 AC_CHECK_TYPE(u_int64_t, unsigned long long)
350 AC_CHECK_TYPE(u_int32_t, unsigned long)
351 AC_CHECK_TYPE(u_int16_t, unsigned short)
352 AC_CHECK_TYPE(u_int8_t, unsigned char)
354 tor_libevent_pkg_redhat="libevent"
355 tor_libevent_pkg_debian="libevent-dev"
356 tor_libevent_devpkg_redhat="libevent-devel"
357 tor_libevent_devpkg_debian="libevent-dev"
359 dnl On Gnu/Linux or any place we require it, we'll add librt to the Libevent
360 dnl linking for static builds.
361 STATIC_LIBEVENT_FLAGS=""
362 if test "$enable_static_libevent" = "yes"; then
363     if test "$have_rt" = yes; then
364       STATIC_LIBEVENT_FLAGS=" -lrt "
365     fi
368 TOR_SEARCH_LIBRARY(libevent, $trylibeventdir, [-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32], [
369 #ifdef _WIN32
370 #include <winsock2.h>
371 #endif
372 #include <stdlib.h>
373 #include <sys/time.h>
374 #include <sys/types.h>
375 #include <event.h>], [
376 #ifdef _WIN32
377 #include <winsock2.h>
378 #endif
379 void exit(int); void *event_init(void);],
380     [
381 #ifdef _WIN32
382 {WSADATA d; WSAStartup(0x101,&d); }
383 #endif
384 event_init(); exit(0);
385 ], [--with-libevent-dir], [/opt/libevent])
387 dnl Now check for particular libevent functions.
388 save_LIBS="$LIBS"
389 save_LDFLAGS="$LDFLAGS"
390 save_CPPFLAGS="$CPPFLAGS"
391 LIBS="-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32 $LIBS"
392 LDFLAGS="$TOR_LDFLAGS_libevent $LDFLAGS"
393 CPPFLAGS="$TOR_CPPFLAGS_libevent $CPPFLAGS"
394 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)
395 AC_CHECK_MEMBERS([struct event.min_heap_idx], , ,
396 [#include <event.h>
399 AC_CHECK_HEADERS(event2/event.h event2/dns.h event2/bufferevent_ssl.h)
401 LIBS="$save_LIBS"
402 LDFLAGS="$save_LDFLAGS"
403 CPPFLAGS="$save_CPPFLAGS"
406 AM_CONDITIONAL(USE_EXTERNAL_EVDNS, test x$ac_cv_header_event2_dns_h = xyes)
408 if test "$enable_static_libevent" = "yes"; then
409    if test "$tor_cv_library_libevent_dir" = "(system)"; then
410      AC_MSG_ERROR("You must specify an explicit --with-libevent-dir=x option when using --enable-static-libevent")
411    else
412      TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent.a $STATIC_LIBEVENT_FLAGS"
413    fi
414 else
415      TOR_LIBEVENT_LIBS="-levent"
418 dnl This isn't the best test for Libevent 2.0.3-alpha.  Once it's released,
419 dnl we can do much better.
420 if test "$enable_bufferevents" = "yes" ; then
421   if test "$ac_cv_header_event2_bufferevent_ssl_h" != "yes" ; then
422     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.])
423   else
425     CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent"
427     # Check for the right version.  First see if version detection works.
428     AC_MSG_CHECKING([whether we can detect the Libevent version])
429     AC_COMPILE_IFELSE([AC_LANG_SOURCE([
430 #include <event2/event.h>
431 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 10
432 #error
433 int x = y(zz);
434 #else
435 int x = 1;
436 #endif
437   ])], [event_version_number_works=yes; AC_MSG_RESULT([yes]) ],
438      [event_version_number_works=no;  AC_MSG_RESULT([no])])
439     if test "$event_version_number_works" != 'yes'; then
440       AC_MSG_WARN([Version detection on Libevent seems broken.  Your Libevent installation is probably screwed up or very old.])
441     else
442       AC_MSG_CHECKING([whether Libevent is new enough for bufferevents])
443       AC_COMPILE_IFELSE([AC_LANG_SOURCE([
444 #include <event2/event.h>
445 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 0x02000d00
446 #error
447 int x = y(zz);
448 #else
449 int x = 1;
450 #endif
451    ])], [ AC_MSG_RESULT([yes]) ],
452       [ AC_MSG_RESULT([no])
453         AC_MSG_ERROR([Libevent does not seem new enough to support bufferevents.  We require 2.0.13-stable or later]) ] )
454     fi
455   fi
458 LIBS="$save_LIBS"
459 LDFLAGS="$save_LDFLAGS"
460 CPPFLAGS="$save_CPPFLAGS"
462 AM_CONDITIONAL(USE_BUFFEREVENTS, test "$enable_bufferevents" = "yes")
463 if test "$enable_bufferevents" = "yes"; then
464   AC_DEFINE(USE_BUFFEREVENTS, 1, [Defined if we're going to use Libevent's buffered IO API])
465   if test "$enable_static_libevent" = "yes"; then
466     TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent_openssl.a $TOR_LIBEVENT_LIBS"
467   else
468     TOR_LIBEVENT_LIBS="-levent_openssl $TOR_LIBEVENT_LIBS"
469   fi
471 AC_SUBST(TOR_LIBEVENT_LIBS)
473 dnl ------------------------------------------------------
474 dnl Where do you live, libm?
476 dnl On some platforms (Haiku/BeOS) the math library is
477 dnl part of libroot. In which case don't link against lm
478 TOR_LIB_MATH=""
479 save_LIBS="$LIBS"
480 AC_SEARCH_LIBS(pow, [m], , AC_MSG_ERROR([Could not find pow in libm or libc.]))
481 if test "$ac_cv_search_pow" != "none required"; then
482     TOR_LIB_MATH="$ac_cv_search_pow"
484 LIBS="$save_LIBS"
485 AC_SUBST(TOR_LIB_MATH)
487 dnl ------------------------------------------------------
488 dnl Where do you live, openssl?  And how do we call you?
490 tor_openssl_pkg_redhat="openssl"
491 tor_openssl_pkg_debian="libssl"
492 tor_openssl_devpkg_redhat="openssl-devel"
493 tor_openssl_devpkg_debian="libssl-dev"
495 ALT_openssl_WITHVAL=""
496 AC_ARG_WITH(ssl-dir,
497   [  --with-ssl-dir=PATH    Obsolete alias for --with-openssl-dir ],
498   [
499       if test "x$withval" != xno && test "x$withval" != "x" ; then
500          ALT_openssl_WITHVAL="$withval"
501       fi
502   ])
504 TOR_SEARCH_LIBRARY(openssl, $tryssldir, [-lssl -lcrypto $TOR_LIB_GDI],
505     [#include <openssl/rand.h>],
506     [void RAND_add(const void *buf, int num, double entropy);],
507     [RAND_add((void*)0,0,0); exit(0);], [],
508     [/usr/local/openssl /usr/lib/openssl /usr/local/ssl /usr/lib/ssl /usr/local /usr/athena /opt/openssl])
510 dnl XXXX check for OPENSSL_VERSION_NUMBER == SSLeay()
512 if test "$enable_static_openssl" = "yes"; then
513    if test "$tor_cv_library_openssl_dir" = "(system)"; then
514      AC_MSG_ERROR("You must specify an explicit --with-openssl-dir=x option when using --enable-static-openssl")
515    else
516      TOR_OPENSSL_LIBS="$TOR_LIBDIR_openssl/libssl.a $TOR_LIBDIR_openssl/libcrypto.a"
517    fi
518 else
519      TOR_OPENSSL_LIBS="-lssl -lcrypto"
521 AC_SUBST(TOR_OPENSSL_LIBS)
523 dnl ------------------------------------------------------
524 dnl Where do you live, zlib?  And how do we call you?
526 tor_zlib_pkg_redhat="zlib"
527 tor_zlib_pkg_debian="zlib1g"
528 tor_zlib_devpkg_redhat="zlib-devel"
529 tor_zlib_devpkg_debian="zlib1g-dev"
531 TOR_SEARCH_LIBRARY(zlib, $tryzlibdir, [-lz],
532     [#include <zlib.h>],
533     [const char * zlibVersion(void);],
534     [zlibVersion(); exit(0);], [--with-zlib-dir],
535     [/opt/zlib])
537 if test "$enable_static_zlib" = "yes"; then
538    if test "$tor_cv_library_zlib_dir" = "(system)"; then
539      AC_MSG_ERROR("You must specify an explicit --with-zlib-dir=x option when
540  using --enable-static-zlib")
541    else
542      TOR_ZLIB_LIBS="$TOR_LIBDIR_zlib/libz.a"
543    fi
544 else
545      TOR_ZLIB_LIBS="-lz"
547 AC_SUBST(TOR_ZLIB_LIBS)
549 dnl ---------------------------------------------------------------------
550 dnl Now that we know about our major libraries, we can check for compiler
551 dnl and linker hardening options.  We need to do this with the libraries known,
552 dnl since sometimes the linker will like an option but not be willing to
553 dnl use it with a build of a library.
555 all_ldflags_for_check="$TOR_LDFLAGS_zlib $TOR_LDFLAGS_openssl $TOR_LDFLAGS_libevent"
556 all_libs_for_check="$TOR_ZLIB_LIBS $TOR_LIB_MATH $TOR_LIBEVENT_LIBS $TOR_OPENSSL_LIBS $TOR_LIB_WS32 $TOR_LIB_GDI"
558 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
559 #if !defined(__clang__)
560 #error
561 #endif])], have_clang=yes, have_clang=no)
563 if test x$enable_gcc_hardening != xno; then
564     CFLAGS="$CFLAGS -D_FORTIFY_SOURCE=2"
565     if test x$have_clang = xyes; then
566         TOR_CHECK_CFLAGS(-Qunused-arguments)
567     fi
568     TOR_CHECK_CFLAGS(-fstack-protector-all)
569     TOR_CHECK_CFLAGS(-Wstack-protector)
570     TOR_CHECK_CFLAGS(-fwrapv)
571     TOR_CHECK_CFLAGS(--param ssp-buffer-size=1)
572     if test "$bwin32" = "false"; then
573        TOR_CHECK_CFLAGS(-fPIE)
574        TOR_CHECK_LDFLAGS(-pie, "$all_ldflags_for_check", "$all_libs_for_check")
575     fi
578 if test x$enable_linker_hardening != xno; then
579     TOR_CHECK_LDFLAGS(-z relro -z now, "$all_ldflags_for_check", "$all_libs_for_check")
582 dnl ------------------------------------------------------
583 dnl Where do you live, libnatpmp?  And how do we call you?
584 dnl There are no packages for Debian or Redhat as of this patch
586 if test "$natpmp" = "true"; then
587     AC_DEFINE(NAT_PMP, 1, [Define to 1 if we are building with nat-pmp.])
588     TOR_SEARCH_LIBRARY(libnatpmp, $trylibnatpmpdir, [-lnatpmp $TOR_LIB_WS32 $TOR_LIB_IPHLPAPI],
589         [#include <natpmp.h>],
590         [#ifdef _WIN32
591          #define STATICLIB
592          #endif
593          #include <natpmp.h>],
594         [   int r;
595             natpmp_t natpmp;
596             natpmpresp_t response;
597             r = initnatpmp(&natpmp, 0, 0);],
598             [printf("initnatpmp() returned %d (%s)\n", r, r?"FAILED":"SUCCESS");
599             exit(0);],
600         [--with-libnatpmp-dir],
601         [/usr/lib/])
605 dnl ------------------------------------------------------
606 dnl Where do you live, libminiupnpc?  And how do we call you?
607 dnl There are no packages for Debian or Redhat as of this patch
609 if test "$upnp" = "true"; then
610     AC_DEFINE(MINIUPNPC, 1, [Define to 1 if we are building with UPnP.])
612     dnl Before we call TOR_SEARCH_LIBRARY we'll do a quick compile test
613     dnl to see if we have miniupnpc-1.5 or -1.6
614     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include <miniupnpc/miniupnpc.h>],
615         [upnpDiscover(1, 0, 0, 0);exit(0);])],[miniupnpc15="true"],[miniupnpc15="false"])
617     if test "$miniupnpc15" = "true" ; then
618         AC_DEFINE([MINIUPNPC15],[1],[libminiupnpc version 1.5 found])
619         TOR_SEARCH_LIBRARY(libminiupnpc, $trylibminiupnpcdir, [-lminiupnpc $TOR_LIB_WS32 $TOR_LIB_IPHLPAPI],
620             [#include <miniupnpc/miniwget.h>
621              #include <miniupnpc/miniupnpc.h>
622              #include <miniupnpc/upnpcommands.h>],
623             [void upnpDiscover(int delay, const char * multicastif,
624              const char * minissdpdsock, int sameport);],
625             [upnpDiscover(1, 0, 0, 0); exit(0);],
626             [--with-libminiupnpc-dir],
627             [/usr/lib/])
628     else
629         TOR_SEARCH_LIBRARY(libminiupnpc, $trylibminiupnpcdir, [-lminiupnpc $TOR_LIB_WS32 $TOR_LIB_IPHLPAPI],
630             [#include <miniupnpc/miniwget.h>
631              #include <miniupnpc/miniupnpc.h>
632              #include <miniupnpc/upnpcommands.h>],
633             [void upnpDiscover(int delay, const char * multicastif,
634              const char * minissdpdsock, int sameport, int ipv6, int * error);],
635             [upnpDiscover(1, 0, 0, 0, 0, 0); exit(0);],
636             [--with-libminiupnpc-dir],
637             [/usr/lib/])
638     fi
641 dnl Make sure to enable support for large off_t if available.
642 AC_SYS_LARGEFILE
644 AC_CHECK_HEADERS(
645         assert.h \
646         errno.h \
647         fcntl.h \
648         signal.h \
649         string.h \
650         sys/fcntl.h \
651         sys/stat.h \
652         sys/time.h \
653         sys/types.h \
654         time.h \
655         unistd.h
656  , , 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.))
658 dnl These headers are not essential
660 AC_CHECK_HEADERS(
661         arpa/inet.h \
662         crt_externs.h \
663         grp.h \
664         ifaddrs.h \
665         inttypes.h \
666         limits.h \
667         linux/types.h \
668         machine/limits.h \
669         malloc.h \
670         malloc/malloc.h \
671         malloc_np.h \
672         netdb.h \
673         netinet/in.h \
674         netinet/in6.h \
675         pwd.h \
676         stdint.h \
677         sys/file.h \
678         sys/ioctl.h \
679         sys/limits.h \
680         sys/mman.h \
681         sys/param.h \
682         sys/prctl.h \
683         sys/resource.h \
684         sys/socket.h \
685         sys/syslimits.h \
686         sys/time.h \
687         sys/types.h \
688         sys/un.h \
689         sys/utime.h \
690         sys/wait.h \
691         syslog.h \
692         utime.h
695 AC_CHECK_HEADERS(sys/param.h)
697 AC_CHECK_HEADERS(net/if.h, net_if_found=1, net_if_found=0,
698 [#ifdef HAVE_SYS_TYPES_H
699 #include <sys/types.h>
700 #endif
701 #ifdef HAVE_SYS_SOCKET_H
702 #include <sys/socket.h>
703 #endif])
704 AC_CHECK_HEADERS(net/pfvar.h, net_pfvar_found=1, net_pfvar_found=0,
705 [#ifdef HAVE_SYS_TYPES_H
706 #include <sys/types.h>
707 #endif
708 #ifdef HAVE_SYS_SOCKET_H
709 #include <sys/socket.h>
710 #endif
711 #ifdef HAVE_NET_IF_H
712 #include <net/if.h>
713 #endif])
714 AC_CHECK_HEADERS(linux/netfilter_ipv4.h,
715         linux_netfilter_ipv4=1, linux_netfilter_ipv4=0,
716 [#ifdef HAVE_SYS_TYPES_H
717 #include <sys/types.h>
718 #endif
719 #ifdef HAVE_SYS_SOCKET_H
720 #include <sys/socket.h>
721 #endif
722 #ifdef HAVE_LIMITS_H
723 #include <limits.h>
724 #endif
725 #ifdef HAVE_LINUX_TYPES_H
726 #include <linux/types.h>
727 #endif
728 #ifdef HAVE_NETINET_IN6_H
729 #include <netinet/in6.h>
730 #endif
731 #ifdef HAVE_NETINET_IN_H
732 #include <netinet/in.h>
733 #endif])
735 if test x$transparent = xtrue ; then
736    transparent_ok=0
737    if test x$net_if_found = x1 && test x$net_pfvar_found = x1 ; then
738      transparent_ok=1
739    fi
740    if test x$linux_netfilter_ipv4 = x1 ; then
741      transparent_ok=1
742    fi
743    if test x$transparent_ok = x1 ; then
744      AC_DEFINE(USE_TRANSPARENT, 1, "Define to enable transparent proxy support")
745      case $host in
746        *-*-openbsd*)
747          AC_DEFINE(OPENBSD, 1, "Define to handle pf on OpenBSD properly") ;;
748      esac
749    else
750      AC_MSG_NOTICE([Transparent proxy support enabled, but missing headers.])
751    fi
754 AC_CHECK_MEMBERS([struct timeval.tv_sec], , ,
755 [#ifdef HAVE_SYS_TYPES_H
756 #include <sys/types.h>
757 #endif
758 #ifdef HAVE_SYS_TIME_H
759 #include <sys/time.h>
760 #endif])
762 dnl In case we aren't given a working stdint.h, we'll need to grow our own.
763 dnl Watch out.
765 AC_CHECK_SIZEOF(int8_t)
766 AC_CHECK_SIZEOF(int16_t)
767 AC_CHECK_SIZEOF(int32_t)
768 AC_CHECK_SIZEOF(int64_t)
769 AC_CHECK_SIZEOF(uint8_t)
770 AC_CHECK_SIZEOF(uint16_t)
771 AC_CHECK_SIZEOF(uint32_t)
772 AC_CHECK_SIZEOF(uint64_t)
773 AC_CHECK_SIZEOF(intptr_t)
774 AC_CHECK_SIZEOF(uintptr_t)
776 dnl AC_CHECK_TYPES([int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t, uint64_t, intptr_t, uintptr_t])
778 AC_CHECK_SIZEOF(char)
779 AC_CHECK_SIZEOF(short)
780 AC_CHECK_SIZEOF(int)
781 AC_CHECK_SIZEOF(long)
782 AC_CHECK_SIZEOF(long long)
783 AC_CHECK_SIZEOF(__int64)
784 AC_CHECK_SIZEOF(void *)
785 AC_CHECK_SIZEOF(time_t)
786 AC_CHECK_SIZEOF(size_t)
788 AC_CHECK_TYPES([uint, u_char, ssize_t])
790 dnl used to include sockaddr_storage, but everybody has that.
791 AC_CHECK_TYPES([struct in6_addr, struct sockaddr_in6, sa_family_t], , ,
792 [#ifdef HAVE_SYS_TYPES_H
793 #include <sys/types.h>
794 #endif
795 #ifdef HAVE_NETINET_IN_H
796 #include <netinet/in.h>
797 #endif
798 #ifdef HAVE_NETINET_IN6_H
799 #include <netinet/in6.h>
800 #endif
801 #ifdef HAVE_SYS_SOCKET_H
802 #include <sys/socket.h>
803 #endif
804 #ifdef _WIN32
805 #define _WIN32_WINNT 0x0501
806 #define WIN32_LEAN_AND_MEAN
807 #if defined(_MSC_VER) && (_MSC_VER < 1300)
808 #include <winsock.h>
809 #else
810 #include <winsock2.h>
811 #include <ws2tcpip.h>
812 #endif
813 #endif
815 AC_CHECK_MEMBERS([struct in6_addr.s6_addr32, struct in6_addr.s6_addr16, struct sockaddr_in.sin_len, struct sockaddr_in6.sin6_len], , ,
816 [#ifdef HAVE_SYS_TYPES_H
817 #include <sys/types.h>
818 #endif
819 #ifdef HAVE_NETINET_IN_H
820 #include <netinet/in.h>
821 #endif
822 #ifdef HAVE_NETINET_IN6_H
823 #include <netinet/in6.h>
824 #endif
825 #ifdef HAVE_SYS_SOCKET_H
826 #include <sys/socket.h>
827 #endif
828 #ifdef _WIN32
829 #define _WIN32_WINNT 0x0501
830 #define WIN32_LEAN_AND_MEAN
831 #if defined(_MSC_VER) && (_MSC_VER < 1300)
832 #include <winsock.h>
833 #else
834 #include <winsock2.h>
835 #include <ws2tcpip.h>
836 #endif
837 #endif
840 AC_CHECK_TYPES([rlim_t], , ,
841 [#ifdef HAVE_SYS_TYPES_H
842 #include <sys/types.h>
843 #endif
844 #ifdef HAVE_SYS_TIME_H
845 #include <sys/time.h>
846 #endif
847 #ifdef HAVE_SYS_RESOURCE_H
848 #include <sys/resource.h>
849 #endif
852 AC_CACHE_CHECK([whether time_t is signed], tor_cv_time_t_signed, [
853 AC_RUN_IFELSE([AC_LANG_SOURCE([
854 #ifdef HAVE_SYS_TYPES_H
855 #include <sys/types.h>
856 #endif
857 #ifdef HAVE_SYS_TIME_H
858 #include <sys/time.h>
859 #endif
860 #ifdef HAVE_TIME_H
861 #include <time.h>
862 #endif
863 int main(int c, char**v) { if (((time_t)-1)<0) return 1; else return 0; }])],
864   tor_cv_time_t_signed=no, tor_cv_time_t_signed=yes, tor_cv_time_t_signed=cross)
867 if test "$tor_cv_time_t_signed" = cross; then
868   AC_MSG_NOTICE([Cross compiling: assuming that time_t is signed.])
871 if test "$tor_cv_time_t_signed" != no; then
872   AC_DEFINE([TIME_T_IS_SIGNED], 1,
873             [Define to 1 iff time_t is signed])
876 AC_CACHE_CHECK([whether size_t is signed], tor_cv_size_t_signed, [
877 AC_RUN_IFELSE([AC_LANG_SOURCE([
878 #ifdef HAVE_SYS_TYPES_H
879 #include <sys/types.h>
880 #endif
881 int main(int c, char**v) { if (((size_t)-1)<0) return 1; else return 0; }])],
882   tor_cv_size_t_signed=no, tor_cv_size_t_signed=yes, tor_cv_size_t_signed=cross)
885 if test "$tor_cv_size_t_signed" = cross; then
886   AC_MSG_NOTICE([Cross compiling: assuming that size_t is not signed.])
889 if test "$tor_cv_size_t_signed" = yes; then
890   AC_MSG_ERROR([You have a signed size_t; that's grossly nonconformant.])
893 AC_CHECK_SIZEOF(socklen_t, , [AC_INCLUDES_DEFAULT()
894 #ifdef HAVE_SYS_SOCKET_H
895 #include <sys/socket.h>
896 #endif
899 # We want to make sure that we _don't_ have a cell_t defined, like IRIX does.
901 AC_CHECK_SIZEOF(cell_t)
903 # Now make sure that NULL can be represented as zero bytes.
904 AC_CACHE_CHECK([whether memset(0) sets pointers to NULL], tor_cv_null_is_zero,
905 [AC_RUN_IFELSE([AC_LANG_SOURCE(
906 [[#include <stdlib.h>
907 #include <string.h>
908 #include <stdio.h>
909 #ifdef HAVE_STDDEF_H
910 #include <stddef.h>
911 #endif
912 int main () { char *p1,*p2; p1=NULL; memset(&p2,0,sizeof(p2));
913 return memcmp(&p1,&p2,sizeof(char*))?1:0; }]])],
914        [tor_cv_null_is_zero=yes],
915        [tor_cv_null_is_zero=no],
916        [tor_cv_null_is_zero=cross])])
918 if test "$tor_cv_null_is_zero" = 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 NULL is represented as a sequence of 0-valued bytes.])
923 if test "$tor_cv_null_is_zero" != no; then
924   AC_DEFINE([NULL_REP_IS_ZERO_BYTES], 1,
925             [Define to 1 iff memset(0) sets pointers to NULL])
928 # And what happens when we malloc zero?
929 AC_CACHE_CHECK([whether we can malloc(0) safely.], tor_cv_malloc_zero_works,
930 [AC_RUN_IFELSE([AC_LANG_SOURCE(
931 [[#include <stdlib.h>
932 #include <string.h>
933 #include <stdio.h>
934 #ifdef HAVE_STDDEF_H
935 #include <stddef.h>
936 #endif
937 int main () { return malloc(0)?0:1; }]])],
938        [tor_cv_malloc_zero_works=yes],
939        [tor_cv_malloc_zero_works=no],
940        [tor_cv_malloc_zero_works=cross])])
942 if test "$tor_cv_malloc_zero_works" = cross; then
943   # Cross-compiling; let's hope that the target isn't raving mad.
944   AC_MSG_NOTICE([Cross-compiling: we'll assume that we need to check malloc() arguments for 0.])
947 if test "$tor_cv_malloc_zero_works" = yes; then
948   AC_DEFINE([MALLOC_ZERO_WORKS], 1,
949             [Define to 1 iff malloc(0) returns a pointer])
952 # whether we seem to be in a 2s-complement world.
953 AC_CACHE_CHECK([whether we are using 2s-complement arithmetic], tor_cv_twos_complement,
954 [AC_RUN_IFELSE([AC_LANG_SOURCE(
955 [[int main () { int problem = ((-99) != (~99)+1);
956 return problem ? 1 : 0; }]])],
957        [tor_cv_twos_complement=yes],
958        [tor_cv_twos_complement=no],
959        [tor_cv_twos_complement=cross])])
961 if test "$tor_cv_twos_complement" = cross ; then
962   # Cross-compiling; let's hope that the target isn't raving mad.
963   AC_MSG_NOTICE([Cross-compiling: we'll assume that negative integers are represented with two's complement.])
966 if test "$tor_cv_twos_complement" != no ; then
967   AC_DEFINE([USING_TWOS_COMPLEMENT], 1,
968             [Define to 1 iff we represent negative integers with two's complement])
971 # What does shifting a negative value do?
972 AC_CACHE_CHECK([whether right-shift on negative values does sign-extension], tor_cv_sign_extend,
973 [AC_RUN_IFELSE([AC_LANG_SOURCE(
974 [[int main () { int okay = (-60 >> 8) == -1; return okay ? 0 : 1; }]])],
975        [tor_cv_sign_extend=yes],
976        [tor_cv_sign_extend=no],
977        [tor_cv_sign_extend=cross])])
979 if test "$tor_cv_sign_extend" = cross ; then
980   # Cross-compiling; let's hope that the target isn't raving mad.
981   AC_MSG_NOTICE([Cross-compiling: we'll assume that right-shifting negative integers causes sign-extension])
984 if test "$tor_cv_sign_extend" != no ; then
985   AC_DEFINE([RSHIFT_DOES_SIGN_EXTEND], 1,
986             [Define to 1 iff right-shifting a negative value performs sign-extension])
989 # Whether we should use the dmalloc memory allocation debugging library.
990 AC_MSG_CHECKING(whether to use dmalloc (debug memory allocation library))
991 AC_ARG_WITH(dmalloc,
992 [  --with-dmalloc          Use debug memory allocation library. ],
993 [if [[ "$withval" = "yes" ]]; then
994   dmalloc=1
995   AC_MSG_RESULT(yes)
996 else
997   dmalloc=1
998   AC_MSG_RESULT(no)
999 fi], [ dmalloc=0; AC_MSG_RESULT(no) ]
1002 if [[ $dmalloc -eq 1 ]]; then
1003   AC_CHECK_HEADERS(dmalloc.h, , AC_MSG_ERROR(dmalloc header file not found. Do you have the development files for dmalloc installed?))
1004   AC_SEARCH_LIBS(dmalloc_malloc, [dmallocth dmalloc], , AC_MSG_ERROR(Libdmalloc library not found. If you enable it you better have it installed.))
1005   AC_DEFINE(USE_DMALLOC, 1, [Debug memory allocation library])
1006   AC_DEFINE(DMALLOC_FUNC_CHECK, 1, [Enable dmalloc's malloc function check])
1007   AC_CHECK_FUNCS(dmalloc_strdup dmalloc_strndup)
1010 AC_ARG_WITH(tcmalloc,
1011 [  --with-tcmalloc         Use tcmalloc memory allocation library. ],
1012 [ tcmalloc=yes ], [ tcmalloc=no ])
1014 if test x$tcmalloc = xyes ; then
1015    LDFLAGS="-ltcmalloc $LDFLAGS"
1018 using_custom_malloc=no
1019 if test x$enable_openbsd_malloc = xyes ; then
1020    using_custom_malloc=yes
1022 if test x$tcmalloc = xyes ; then
1023    using_custom_malloc=yes
1025 if test $using_custom_malloc = no ; then
1026    AC_CHECK_FUNCS(mallinfo)
1029 # By default, we're going to assume we don't have mlockall()
1030 # bionic and other platforms have various broken mlockall subsystems.
1031 # Some systems don't have a working mlockall, some aren't linkable,
1032 # and some have it but don't declare it.
1033 AC_CHECK_FUNCS(mlockall)
1034 AC_CHECK_DECLS([mlockall], , , [
1035 #ifdef HAVE_SYS_MMAN_H
1036 #include <sys/mman.h>
1037 #endif])
1039 # Allow user to specify an alternate syslog facility
1040 AC_ARG_WITH(syslog-facility,
1041 [  --with-syslog-facility=LOG syslog facility to use (default=LOG_DAEMON)],
1042 syslog_facility="$withval", syslog_facility="LOG_DAEMON")
1043 AC_DEFINE_UNQUOTED(LOGFACILITY,$syslog_facility,[name of the syslog facility])
1044 AC_SUBST(LOGFACILITY)
1046 # Check if we have getresuid and getresgid
1047 AC_CHECK_FUNCS(getresuid getresgid)
1049 # Check for gethostbyname_r in all its glorious incompatible versions.
1050 #   (This logic is based on that in Python's configure.in)
1051 AH_TEMPLATE(HAVE_GETHOSTBYNAME_R,
1052   [Define this if you have any gethostbyname_r()])
1054 AC_CHECK_FUNC(gethostbyname_r, [
1055   AC_MSG_CHECKING([how many arguments gethostbyname_r() wants])
1056   OLD_CFLAGS=$CFLAGS
1057   CFLAGS="$CFLAGS $MY_CPPFLAGS $MY_THREAD_CPPFLAGS $MY_CFLAGS"
1058   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
1059 #include <netdb.h>
1060   ], [[
1061     char *cp1, *cp2;
1062     struct hostent *h1, *h2;
1063     int i1, i2;
1064     (void)gethostbyname_r(cp1,h1,cp2,i1,&h2,&i2);
1065   ]])],[
1066     AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1067     AC_DEFINE(HAVE_GETHOSTBYNAME_R_6_ARG, 1,
1068      [Define this if gethostbyname_r takes 6 arguments])
1069     AC_MSG_RESULT(6)
1070   ], [
1071     AC_TRY_COMPILE([
1072 #include <netdb.h>
1073     ], [
1074       char *cp1, *cp2;
1075       struct hostent *h1;
1076       int i1, i2;
1077       (void)gethostbyname_r(cp1,h1,cp2,i1,&i2);
1078     ], [
1079       AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1080       AC_DEFINE(HAVE_GETHOSTBYNAME_R_5_ARG, 1,
1081         [Define this if gethostbyname_r takes 5 arguments])
1082       AC_MSG_RESULT(5)
1083    ], [
1084       AC_TRY_COMPILE([
1085 #include <netdb.h>
1086      ], [
1087        char *cp1;
1088        struct hostent *h1;
1089        struct hostent_data hd;
1090        (void) gethostbyname_r(cp1,h1,&hd);
1091      ], [
1092        AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1093        AC_DEFINE(HAVE_GETHOSTBYNAME_R_3_ARG, 1,
1094          [Define this if gethostbyname_r takes 3 arguments])
1095        AC_MSG_RESULT(3)
1096      ], [
1097        AC_MSG_RESULT(0)
1098      ])
1099   ])
1100  ])
1101  CFLAGS=$OLD_CFLAGS
1104 AC_CACHE_CHECK([whether the C compiler supports __func__],
1105   tor_cv_have_func_macro,
1106   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1107 #include <stdio.h>
1108 int main(int c, char **v) { puts(__func__); }])],
1109   tor_cv_have_func_macro=yes,
1110   tor_cv_have_func_macro=no))
1112 AC_CACHE_CHECK([whether the C compiler supports __FUNC__],
1113   tor_cv_have_FUNC_macro,
1114   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1115 #include <stdio.h>
1116 int main(int c, char **v) { puts(__FUNC__); }])],
1117   tor_cv_have_FUNC_macro=yes,
1118   tor_cv_have_FUNC_macro=no))
1120 AC_CACHE_CHECK([whether the C compiler supports __FUNCTION__],
1121   tor_cv_have_FUNCTION_macro,
1122   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1123 #include <stdio.h>
1124 int main(int c, char **v) { puts(__FUNCTION__); }])],
1125   tor_cv_have_FUNCTION_macro=yes,
1126   tor_cv_have_FUNCTION_macro=no))
1128 AC_CACHE_CHECK([whether we have extern char **environ already declared],
1129   tor_cv_have_environ_declared,
1130   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1131 /* We define _GNU_SOURCE here because it is also defined in compat.c.
1132  * Without it environ doesn't get declared. */
1133 #define _GNU_SOURCE
1134 #ifdef HAVE_UNISTD_H
1135 #include <unistd.h>
1136 #endif
1137 #include <stdlib.h>
1138 int main(int c, char **v) { char **t = environ; }])],
1139   tor_cv_have_environ_declared=yes,
1140   tor_cv_have_environ_declared=no))
1142 if test "$tor_cv_have_func_macro" = 'yes'; then
1143   AC_DEFINE(HAVE_MACRO__func__, 1, [Defined if the compiler supports __func__])
1146 if test "$tor_cv_have_FUNC_macro" = 'yes'; then
1147   AC_DEFINE(HAVE_MACRO__FUNC__, 1, [Defined if the compiler supports __FUNC__])
1150 if test "$tor_cv_have_FUNCTION_macro" = 'yes'; then
1151   AC_DEFINE(HAVE_MACRO__FUNCTION__, 1,
1152            [Defined if the compiler supports __FUNCTION__])
1155 if test "$tor_cv_have_environ_declared" = 'yes'; then
1156   AC_DEFINE(HAVE_EXTERN_ENVIRON_DECLARED, 1,
1157            [Defined if we have extern char **environ already declared])
1160 # $prefix stores the value of the --prefix command line option, or
1161 # NONE if the option wasn't set.  In the case that it wasn't set, make
1162 # it be the default, so that we can use it to expand directories now.
1163 if test "x$prefix" = "xNONE"; then
1164   prefix=$ac_default_prefix
1167 # and similarly for $exec_prefix
1168 if test "x$exec_prefix" = "xNONE"; then
1169   exec_prefix=$prefix
1172 if test "x$BUILDDIR" = "x"; then
1173   BUILDDIR=`pwd`
1175 AC_SUBST(BUILDDIR)
1176 AH_TEMPLATE([BUILDDIR],[tor's build directory])
1177 AC_DEFINE_UNQUOTED(BUILDDIR,"$BUILDDIR")
1179 if test "x$CONFDIR" = "x"; then
1180   CONFDIR=`eval echo $sysconfdir/tor`
1182 AC_SUBST(CONFDIR)
1183 AH_TEMPLATE([CONFDIR],[tor's configuration directory])
1184 AC_DEFINE_UNQUOTED(CONFDIR,"$CONFDIR")
1186 BINDIR=`eval echo $bindir`
1187 AC_SUBST(BINDIR)
1188 LOCALSTATEDIR=`eval echo $localstatedir`
1189 AC_SUBST(LOCALSTATEDIR)
1191 if test "$bwin32" = true; then
1192   # Test if the linker supports the --nxcompat and --dynamicbase options
1193   # for Windows
1194   save_LDFLAGS="$LDFLAGS"
1195   LDFLAGS="-Wl,--nxcompat -Wl,--dynamicbase"
1196   AC_MSG_CHECKING([whether the linker supports DllCharacteristics])
1197   AC_LINK_IFELSE([AC_LANG_PROGRAM([])],
1198     [AC_MSG_RESULT([yes])]
1199     [save_LDFLAGS="$save_LDFLAGS $LDFLAGS"],
1200     [AC_MSG_RESULT([no])]
1201   )
1202   LDFLAGS="$save_LDFLAGS"
1205 # Set CFLAGS _after_ all the above checks, since our warnings are stricter
1206 # than autoconf's macros like.
1207 if test "$GCC" = yes; then
1208   # Disable GCC's strict aliasing checks.  They are an hours-to-debug
1209   # accident waiting to happen.
1210   CFLAGS="$CFLAGS -Wall -fno-strict-aliasing"
1211 else
1212   # Autoconf sets -g -O2 by default. Override optimization level
1213   # for non-gcc compilers
1214   CFLAGS="$CFLAGS -O"
1215   enable_gcc_warnings=no
1216   enable_gcc_warnings_advisory=no
1219 # OS X Lion started deprecating the system openssl. Let's just disable
1220 # all deprecation warnings on OS X. Also, to potentially make the binary
1221 # a little smaller, let's enable dead_strip.
1222 case "$host_os" in
1224  darwin*)
1225     CFLAGS="$CFLAGS -Wno-deprecated-declarations"
1226     LDFLAGS="$LDFLAGS -dead_strip" ;;
1227 esac
1229 # Add some more warnings which we use in development but not in the
1230 # released versions.  (Some relevant gcc versions can't handle these.)
1231 if test x$enable_gcc_warnings = xyes || test x$enable_gcc_warnings_advisory = xyes; then
1233   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1234 #if !defined(__GNUC__) || (__GNUC__ < 4)
1235 #error
1236 #endif])], have_gcc4=yes, have_gcc4=no)
1238   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1239 #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 2)
1240 #error
1241 #endif])], have_gcc42=yes, have_gcc42=no)
1243   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1244 #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 3)
1245 #error
1246 #endif])], have_gcc43=yes, have_gcc43=no)
1248   save_CFLAGS="$CFLAGS"
1249   CFLAGS="$CFLAGS -Wshorten-64-to-32"
1250   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], have_shorten64_flag=yes,
1251                     have_shorten64_flag=no)
1252   CFLAGS="$save_CFLAGS"
1254   case $host in
1255     *-*-openbsd*)
1256       # Some OpenBSD versions (like 4.8) have -Wsystem-headers by default.
1257       # That's fine, except that the headers don't pass -Wredundant-decls.
1258       # Therefore, let's disable -Wsystem-headers when we're building
1259       # with maximal warnings on OpenBSD.
1260       CFLAGS="$CFLAGS -Wno-system-headers" ;;
1261   esac
1263   CFLAGS="$CFLAGS -W -Wfloat-equal -Wundef -Wpointer-arith"
1264   CFLAGS="$CFLAGS -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings"
1265   CFLAGS="$CFLAGS -Wredundant-decls -Wchar-subscripts -Wcomment -Wformat=2"
1266   CFLAGS="$CFLAGS -Wwrite-strings -Wmissing-declarations -Wredundant-decls"
1267   CFLAGS="$CFLAGS -Wnested-externs -Wbad-function-cast -Wswitch-enum"
1269   if test x$enable_gcc_warnings = xyes; then
1270     CFLAGS="$CFLAGS -Werror"
1271   fi
1273   # Disabled, so we can use mallinfo(): -Waggregate-return
1275   if test x$have_gcc4 = xyes ; then
1276     # These warnings break gcc 3.3.5 and work on gcc 4.0.2
1277     CFLAGS="$CFLAGS -Winit-self -Wmissing-field-initializers -Wdeclaration-after-statement -Wold-style-definition"
1278   fi
1280   if test x$have_gcc42 = xyes ; then
1281     # These warnings break gcc 4.0.2 and work on gcc 4.2
1282     # XXXX020 See if any of these work with earlier versions.
1283     CFLAGS="$CFLAGS -Waddress -Wmissing-noreturn -Wstrict-overflow=1"
1285     # We used to use -Wstrict-overflow=5, but that breaks us heavily under 4.3.
1286   fi
1288   if test x$have_gcc42 = xyes && test x$have_clang = xno; then
1289     # These warnings break gcc 4.0.2 and clang, but work on gcc 4.2
1290     CFLAGS="$CFLAGS -Wnormalized=id -Woverride-init"
1291   fi
1293   if test x$have_gcc43 = xyes ; then
1294     # These warnings break gcc 4.2 and work on gcc 4.3
1295     # XXXX020 See if any of these work with earlier versions.
1296     CFLAGS="$CFLAGS -Wextra -Warray-bounds"
1297   fi
1299   if test x$have_shorten64_flag = xyes ; then
1300     CFLAGS="$CFLAGS -Wshorten-64-to-32"
1301   fi
1303 ##This will break the world on some 64-bit architectures
1304 # CFLAGS="$CFLAGS -Winline"
1309 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent $TOR_CPPFLAGS_openssl $TOR_CPPFLAGS_zlib"
1311 AC_CONFIG_FILES([
1312         Doxyfile
1313         Makefile
1314         contrib/suse/tor.sh
1315         contrib/tor.logrotate
1316         contrib/tor.sh
1317         contrib/torctl
1318         contrib/torify
1319         src/config/torrc.sample
1322 AC_OUTPUT
1324 if test -x /usr/bin/perl && test -x ./contrib/updateVersions.pl ; then
1325   ./contrib/updateVersions.pl