Rename _UseFilteringSSLBufferevents to lose its _. Bug 3155
[tor.git] / configure.ac
blob06b16966f77ac766c95523fd8f322fe5a2975a3f
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.1-alpha-dev])
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         localtime_r \
307         lround \
308         memmem \
309         prctl \
310         rint \
311         socketpair \
312         strlcat \
313         strlcpy \
314         strptime \
315         strtok_r \
316         strtoull \
317         sysconf \
318         uname \
319         vasprintf \
322 if test "$enable_threads" = "yes"; then
323   AC_CHECK_HEADERS(pthread.h)
324   AC_CHECK_FUNCS(pthread_create)
327 dnl ------------------------------------------------------
328 dnl Where do you live, libevent?  And how do we call you?
330 if test "$bwin32" = true; then
331   TOR_LIB_WS32=-lws2_32
332   TOR_LIB_IPHLPAPI=-liphlpapi
333   # Some of the cargo-cults recommend -lwsock32 as well, but I don't
334   # think it's actually necessary.
335   TOR_LIB_GDI=-lgdi32
336 else
337   TOR_LIB_WS32=
338   TOR_LIB_GDI=
340 AC_SUBST(TOR_LIB_WS32)
341 AC_SUBST(TOR_LIB_GDI)
342 AC_SUBST(TOR_LIB_IPHLPAPI)
344 dnl We need to do this before we try our disgusting hack below.
345 AC_CHECK_HEADERS([sys/types.h])
347 dnl This is a disgusting hack so we safely include older libevent headers.
348 AC_CHECK_TYPE(u_int64_t, unsigned long long)
349 AC_CHECK_TYPE(u_int32_t, unsigned long)
350 AC_CHECK_TYPE(u_int16_t, unsigned short)
351 AC_CHECK_TYPE(u_int8_t, unsigned char)
353 tor_libevent_pkg_redhat="libevent"
354 tor_libevent_pkg_debian="libevent-dev"
355 tor_libevent_devpkg_redhat="libevent-devel"
356 tor_libevent_devpkg_debian="libevent-dev"
358 dnl On Gnu/Linux or any place we require it, we'll add librt to the Libevent
359 dnl linking for static builds.
360 STATIC_LIBEVENT_FLAGS=""
361 if test "$enable_static_libevent" = "yes"; then
362     if test "$have_rt" = yes; then
363       STATIC_LIBEVENT_FLAGS=" -lrt "
364     fi
367 TOR_SEARCH_LIBRARY(libevent, $trylibeventdir, [-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32], [
368 #ifdef _WIN32
369 #include <winsock2.h>
370 #endif
371 #include <stdlib.h>
372 #include <sys/time.h>
373 #include <sys/types.h>
374 #include <event.h>], [
375 #ifdef _WIN32
376 #include <winsock2.h>
377 #endif
378 void exit(int); void *event_init(void);],
379     [
380 #ifdef _WIN32
381 {WSADATA d; WSAStartup(0x101,&d); }
382 #endif
383 event_init(); exit(0);
384 ], [--with-libevent-dir], [/opt/libevent])
386 dnl Now check for particular libevent functions.
387 save_LIBS="$LIBS"
388 save_LDFLAGS="$LDFLAGS"
389 save_CPPFLAGS="$CPPFLAGS"
390 LIBS="-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32 $LIBS"
391 LDFLAGS="$TOR_LDFLAGS_libevent $LDFLAGS"
392 CPPFLAGS="$TOR_CPPFLAGS_libevent $CPPFLAGS"
393 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)
394 AC_CHECK_MEMBERS([struct event.min_heap_idx], , ,
395 [#include <event.h>
398 AC_CHECK_HEADERS(event2/event.h event2/dns.h event2/bufferevent_ssl.h)
400 LIBS="$save_LIBS"
401 LDFLAGS="$save_LDFLAGS"
402 CPPFLAGS="$save_CPPFLAGS"
405 AM_CONDITIONAL(USE_EXTERNAL_EVDNS, test x$ac_cv_header_event2_dns_h = xyes)
407 if test "$enable_static_libevent" = "yes"; then
408    if test "$tor_cv_library_libevent_dir" = "(system)"; then
409      AC_MSG_ERROR("You must specify an explicit --with-libevent-dir=x option when using --enable-static-libevent")
410    else
411      TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent.a $STATIC_LIBEVENT_FLAGS"
412    fi
413 else
414      TOR_LIBEVENT_LIBS="-levent"
417 dnl This isn't the best test for Libevent 2.0.3-alpha.  Once it's released,
418 dnl we can do much better.
419 if test "$enable_bufferevents" = "yes" ; then
420   if test "$ac_cv_header_event2_bufferevent_ssl_h" != "yes" ; then
421     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.])
422   else
424     CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent"
426     # Check for the right version.  First see if version detection works.
427     AC_MSG_CHECKING([whether we can detect the Libevent version])
428     AC_COMPILE_IFELSE([AC_LANG_SOURCE([
429 #include <event2/event.h>
430 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 10
431 #error
432 int x = y(zz);
433 #else
434 int x = 1;
435 #endif
436   ])], [event_version_number_works=yes; AC_MSG_RESULT([yes]) ],
437      [event_version_number_works=no;  AC_MSG_RESULT([no])])
438     if test "$event_version_number_works" != 'yes'; then
439       AC_MSG_WARN([Version detection on Libevent seems broken.  Your Libevent installation is probably screwed up or very old.])
440     else
441       AC_MSG_CHECKING([whether Libevent is new enough for bufferevents])
442       AC_COMPILE_IFELSE([AC_LANG_SOURCE([
443 #include <event2/event.h>
444 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 0x02000d00
445 #error
446 int x = y(zz);
447 #else
448 int x = 1;
449 #endif
450    ])], [ AC_MSG_RESULT([yes]) ],
451       [ AC_MSG_RESULT([no])
452         AC_MSG_ERROR([Libevent does not seem new enough to support bufferevents.  We require 2.0.13-stable or later]) ] )
453     fi
454   fi
457 LIBS="$save_LIBS"
458 LDFLAGS="$save_LDFLAGS"
459 CPPFLAGS="$save_CPPFLAGS"
461 AM_CONDITIONAL(USE_BUFFEREVENTS, test "$enable_bufferevents" = "yes")
462 if test "$enable_bufferevents" = "yes"; then
463   AC_DEFINE(USE_BUFFEREVENTS, 1, [Defined if we're going to use Libevent's buffered IO API])
464   if test "$enable_static_libevent" = "yes"; then
465     TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent_openssl.a $TOR_LIBEVENT_LIBS"
466   else
467     TOR_LIBEVENT_LIBS="-levent_openssl $TOR_LIBEVENT_LIBS"
468   fi
470 AC_SUBST(TOR_LIBEVENT_LIBS)
472 dnl ------------------------------------------------------
473 dnl Where do you live, libm?
475 dnl On some platforms (Haiku/BeOS) the math library is
476 dnl part of libroot. In which case don't link against lm
477 TOR_LIB_MATH=""
478 save_LIBS="$LIBS"
479 AC_SEARCH_LIBS(pow, [m], , AC_MSG_ERROR([Could not find pow in libm or libc.]))
480 if test "$ac_cv_search_pow" != "none required"; then
481     TOR_LIB_MATH="$ac_cv_search_pow"
483 LIBS="$save_LIBS"
484 AC_SUBST(TOR_LIB_MATH)
486 dnl ------------------------------------------------------
487 dnl Where do you live, openssl?  And how do we call you?
489 tor_openssl_pkg_redhat="openssl"
490 tor_openssl_pkg_debian="libssl"
491 tor_openssl_devpkg_redhat="openssl-devel"
492 tor_openssl_devpkg_debian="libssl-dev"
494 ALT_openssl_WITHVAL=""
495 AC_ARG_WITH(ssl-dir,
496   [  --with-ssl-dir=PATH    Obsolete alias for --with-openssl-dir ],
497   [
498       if test "x$withval" != xno && test "x$withval" != "x" ; then
499          ALT_openssl_WITHVAL="$withval"
500       fi
501   ])
503 TOR_SEARCH_LIBRARY(openssl, $tryssldir, [-lssl -lcrypto $TOR_LIB_GDI],
504     [#include <openssl/rand.h>],
505     [void RAND_add(const void *buf, int num, double entropy);],
506     [RAND_add((void*)0,0,0); exit(0);], [],
507     [/usr/local/openssl /usr/lib/openssl /usr/local/ssl /usr/lib/ssl /usr/local /usr/athena /opt/openssl])
509 dnl XXXX check for OPENSSL_VERSION_NUMBER == SSLeay()
511 if test "$enable_static_openssl" = "yes"; then
512    if test "$tor_cv_library_openssl_dir" = "(system)"; then
513      AC_MSG_ERROR("You must specify an explicit --with-openssl-dir=x option when using --enable-static-openssl")
514    else
515      TOR_OPENSSL_LIBS="$TOR_LIBDIR_openssl/libssl.a $TOR_LIBDIR_openssl/libcrypto.a"
516    fi
517 else
518      TOR_OPENSSL_LIBS="-lssl -lcrypto"
520 AC_SUBST(TOR_OPENSSL_LIBS)
522 dnl ------------------------------------------------------
523 dnl Where do you live, zlib?  And how do we call you?
525 tor_zlib_pkg_redhat="zlib"
526 tor_zlib_pkg_debian="zlib1g"
527 tor_zlib_devpkg_redhat="zlib-devel"
528 tor_zlib_devpkg_debian="zlib1g-dev"
530 TOR_SEARCH_LIBRARY(zlib, $tryzlibdir, [-lz],
531     [#include <zlib.h>],
532     [const char * zlibVersion(void);],
533     [zlibVersion(); exit(0);], [--with-zlib-dir],
534     [/opt/zlib])
536 if test "$enable_static_zlib" = "yes"; then
537    if test "$tor_cv_library_zlib_dir" = "(system)"; then
538      AC_MSG_ERROR("You must specify an explicit --with-zlib-dir=x option when
539  using --enable-static-zlib")
540    else
541      TOR_ZLIB_LIBS="$TOR_LIBDIR_zlib/libz.a"
542    fi
543 else
544      TOR_ZLIB_LIBS="-lz"
546 AC_SUBST(TOR_ZLIB_LIBS)
548 dnl ---------------------------------------------------------------------
549 dnl Now that we know about our major libraries, we can check for compiler
550 dnl and linker hardening options.  We need to do this with the libraries known,
551 dnl since sometimes the linker will like an option but not be willing to
552 dnl use it with a build of a library.
554 all_ldflags_for_check="$TOR_LDFLAGS_zlib $TOR_LDFLAGS_openssl $TOR_LDFLAGS_libevent"
555 all_libs_for_check="$TOR_ZLIB_LIBS $TOR_LIB_MATH $TOR_LIBEVENT_LIBS $TOR_OPENSSL_LIBS $TOR_LIB_WS32 $TOR_LIB_GDI"
557 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
558 #if !defined(__clang__)
559 #error
560 #endif])], have_clang=yes, have_clang=no)
562 if test x$enable_gcc_hardening != xno; then
563     CFLAGS="$CFLAGS -D_FORTIFY_SOURCE=2"
564     if test x$have_clang = xyes; then
565         TOR_CHECK_CFLAGS(-Qunused-arguments)
566     fi
567     TOR_CHECK_CFLAGS(-fstack-protector-all)
568     TOR_CHECK_CFLAGS(-Wstack-protector)
569     TOR_CHECK_CFLAGS(-fwrapv)
570     TOR_CHECK_CFLAGS(--param ssp-buffer-size=1)
571     if test "$bwin32" = "false"; then
572        TOR_CHECK_CFLAGS(-fPIE)
573        TOR_CHECK_LDFLAGS(-pie, "$all_ldflags_for_check", "$all_libs_for_check")
574     fi
577 if test x$enable_linker_hardening != xno; then
578     TOR_CHECK_LDFLAGS(-z relro -z now, "$all_ldflags_for_check", "$all_libs_for_check")
581 dnl ------------------------------------------------------
582 dnl Where do you live, libnatpmp?  And how do we call you?
583 dnl There are no packages for Debian or Redhat as of this patch
585 if test "$natpmp" = "true"; then
586     AC_DEFINE(NAT_PMP, 1, [Define to 1 if we are building with nat-pmp.])
587     TOR_SEARCH_LIBRARY(libnatpmp, $trylibnatpmpdir, [-lnatpmp $TOR_LIB_WS32 $TOR_LIB_IPHLPAPI],
588         [#include <natpmp.h>],
589         [#ifdef _WIN32
590          #define STATICLIB
591          #endif
592          #include <natpmp.h>],
593         [   int r;
594             natpmp_t natpmp;
595             natpmpresp_t response;
596             r = initnatpmp(&natpmp, 0, 0);],
597             [printf("initnatpmp() returned %d (%s)\n", r, r?"FAILED":"SUCCESS");
598             exit(0);],
599         [--with-libnatpmp-dir],
600         [/usr/lib/])
604 dnl ------------------------------------------------------
605 dnl Where do you live, libminiupnpc?  And how do we call you?
606 dnl There are no packages for Debian or Redhat as of this patch
608 if test "$upnp" = "true"; then
609     AC_DEFINE(MINIUPNPC, 1, [Define to 1 if we are building with UPnP.])
611     dnl Before we call TOR_SEARCH_LIBRARY we'll do a quick compile test
612     dnl to see if we have miniupnpc-1.5 or -1.6
613     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include <miniupnpc/miniupnpc.h>],
614         [upnpDiscover(1, 0, 0, 0);exit(0);])],[miniupnpc15="true"],[miniupnpc15="false"])
616     if test "$miniupnpc15" = "true" ; then
617         AC_DEFINE([MINIUPNPC15],[1],[libminiupnpc version 1.5 found])
618         TOR_SEARCH_LIBRARY(libminiupnpc, $trylibminiupnpcdir, [-lminiupnpc $TOR_LIB_WS32 $TOR_LIB_IPHLPAPI],
619             [#include <miniupnpc/miniwget.h>
620              #include <miniupnpc/miniupnpc.h>
621              #include <miniupnpc/upnpcommands.h>],
622             [void upnpDiscover(int delay, const char * multicastif,
623              const char * minissdpdsock, int sameport);],
624             [upnpDiscover(1, 0, 0, 0); exit(0);],
625             [--with-libminiupnpc-dir],
626             [/usr/lib/])
627     else
628         TOR_SEARCH_LIBRARY(libminiupnpc, $trylibminiupnpcdir, [-lminiupnpc $TOR_LIB_WS32 $TOR_LIB_IPHLPAPI],
629             [#include <miniupnpc/miniwget.h>
630              #include <miniupnpc/miniupnpc.h>
631              #include <miniupnpc/upnpcommands.h>],
632             [void upnpDiscover(int delay, const char * multicastif,
633              const char * minissdpdsock, int sameport, int ipv6, int * error);],
634             [upnpDiscover(1, 0, 0, 0, 0, 0); exit(0);],
635             [--with-libminiupnpc-dir],
636             [/usr/lib/])
637     fi
640 dnl Make sure to enable support for large off_t if available.
641 AC_SYS_LARGEFILE
643 AC_CHECK_HEADERS(
644         assert.h \
645         errno.h \
646         fcntl.h \
647         signal.h \
648         string.h \
649         sys/fcntl.h \
650         sys/stat.h \
651         sys/time.h \
652         sys/types.h \
653         time.h \
654         unistd.h
655  , , 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.))
657 dnl These headers are not essential
659 AC_CHECK_HEADERS(
660         arpa/inet.h \
661         crt_externs.h \
662         grp.h \
663         ifaddrs.h \
664         inttypes.h \
665         limits.h \
666         linux/types.h \
667         machine/limits.h \
668         malloc.h \
669         malloc/malloc.h \
670         malloc_np.h \
671         netdb.h \
672         netinet/in.h \
673         netinet/in6.h \
674         pwd.h \
675         stdint.h \
676         sys/file.h \
677         sys/ioctl.h \
678         sys/limits.h \
679         sys/mman.h \
680         sys/param.h \
681         sys/prctl.h \
682         sys/resource.h \
683         sys/socket.h \
684         sys/syslimits.h \
685         sys/time.h \
686         sys/types.h \
687         sys/un.h \
688         sys/utime.h \
689         sys/wait.h \
690         syslog.h \
691         utime.h
694 AC_CHECK_HEADERS(sys/param.h)
696 AC_CHECK_HEADERS(net/if.h, net_if_found=1, net_if_found=0,
697 [#ifdef HAVE_SYS_TYPES_H
698 #include <sys/types.h>
699 #endif
700 #ifdef HAVE_SYS_SOCKET_H
701 #include <sys/socket.h>
702 #endif])
703 AC_CHECK_HEADERS(net/pfvar.h, net_pfvar_found=1, net_pfvar_found=0,
704 [#ifdef HAVE_SYS_TYPES_H
705 #include <sys/types.h>
706 #endif
707 #ifdef HAVE_SYS_SOCKET_H
708 #include <sys/socket.h>
709 #endif
710 #ifdef HAVE_NET_IF_H
711 #include <net/if.h>
712 #endif])
713 AC_CHECK_HEADERS(linux/netfilter_ipv4.h,
714         linux_netfilter_ipv4=1, linux_netfilter_ipv4=0,
715 [#ifdef HAVE_SYS_TYPES_H
716 #include <sys/types.h>
717 #endif
718 #ifdef HAVE_SYS_SOCKET_H
719 #include <sys/socket.h>
720 #endif
721 #ifdef HAVE_LIMITS_H
722 #include <limits.h>
723 #endif
724 #ifdef HAVE_LINUX_TYPES_H
725 #include <linux/types.h>
726 #endif
727 #ifdef HAVE_NETINET_IN6_H
728 #include <netinet/in6.h>
729 #endif
730 #ifdef HAVE_NETINET_IN_H
731 #include <netinet/in.h>
732 #endif])
734 if test x$transparent = xtrue ; then
735    transparent_ok=0
736    if test x$net_if_found = x1 && test x$net_pfvar_found = x1 ; then
737      transparent_ok=1
738    fi
739    if test x$linux_netfilter_ipv4 = x1 ; then
740      transparent_ok=1
741    fi
742    if test x$transparent_ok = x1 ; then
743      AC_DEFINE(USE_TRANSPARENT, 1, "Define to enable transparent proxy support")
744      case $host in
745        *-*-openbsd*)
746          AC_DEFINE(OPENBSD, 1, "Define to handle pf on OpenBSD properly") ;;
747      esac
748    else
749      AC_MSG_NOTICE([Transparent proxy support enabled, but missing headers.])
750    fi
753 AC_CHECK_MEMBERS([struct timeval.tv_sec], , ,
754 [#ifdef HAVE_SYS_TYPES_H
755 #include <sys/types.h>
756 #endif
757 #ifdef HAVE_SYS_TIME_H
758 #include <sys/time.h>
759 #endif])
761 dnl In case we aren't given a working stdint.h, we'll need to grow our own.
762 dnl Watch out.
764 AC_CHECK_SIZEOF(int8_t)
765 AC_CHECK_SIZEOF(int16_t)
766 AC_CHECK_SIZEOF(int32_t)
767 AC_CHECK_SIZEOF(int64_t)
768 AC_CHECK_SIZEOF(uint8_t)
769 AC_CHECK_SIZEOF(uint16_t)
770 AC_CHECK_SIZEOF(uint32_t)
771 AC_CHECK_SIZEOF(uint64_t)
772 AC_CHECK_SIZEOF(intptr_t)
773 AC_CHECK_SIZEOF(uintptr_t)
775 dnl AC_CHECK_TYPES([int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t, uint64_t, intptr_t, uintptr_t])
777 AC_CHECK_SIZEOF(char)
778 AC_CHECK_SIZEOF(short)
779 AC_CHECK_SIZEOF(int)
780 AC_CHECK_SIZEOF(long)
781 AC_CHECK_SIZEOF(long long)
782 AC_CHECK_SIZEOF(__int64)
783 AC_CHECK_SIZEOF(void *)
784 AC_CHECK_SIZEOF(time_t)
785 AC_CHECK_SIZEOF(size_t)
787 AC_CHECK_TYPES([uint, u_char, ssize_t])
789 dnl used to include sockaddr_storage, but everybody has that.
790 AC_CHECK_TYPES([struct in6_addr, struct sockaddr_in6, sa_family_t], , ,
791 [#ifdef HAVE_SYS_TYPES_H
792 #include <sys/types.h>
793 #endif
794 #ifdef HAVE_NETINET_IN_H
795 #include <netinet/in.h>
796 #endif
797 #ifdef HAVE_NETINET_IN6_H
798 #include <netinet/in6.h>
799 #endif
800 #ifdef HAVE_SYS_SOCKET_H
801 #include <sys/socket.h>
802 #endif
803 #ifdef _WIN32
804 #define _WIN32_WINNT 0x0501
805 #define WIN32_LEAN_AND_MEAN
806 #if defined(_MSC_VER) && (_MSC_VER < 1300)
807 #include <winsock.h>
808 #else
809 #include <winsock2.h>
810 #include <ws2tcpip.h>
811 #endif
812 #endif
814 AC_CHECK_MEMBERS([struct in6_addr.s6_addr32, struct in6_addr.s6_addr16, struct sockaddr_in.sin_len, struct sockaddr_in6.sin6_len], , ,
815 [#ifdef HAVE_SYS_TYPES_H
816 #include <sys/types.h>
817 #endif
818 #ifdef HAVE_NETINET_IN_H
819 #include <netinet/in.h>
820 #endif
821 #ifdef HAVE_NETINET_IN6_H
822 #include <netinet/in6.h>
823 #endif
824 #ifdef HAVE_SYS_SOCKET_H
825 #include <sys/socket.h>
826 #endif
827 #ifdef _WIN32
828 #define _WIN32_WINNT 0x0501
829 #define WIN32_LEAN_AND_MEAN
830 #if defined(_MSC_VER) && (_MSC_VER < 1300)
831 #include <winsock.h>
832 #else
833 #include <winsock2.h>
834 #include <ws2tcpip.h>
835 #endif
836 #endif
839 AC_CHECK_TYPES([rlim_t], , ,
840 [#ifdef HAVE_SYS_TYPES_H
841 #include <sys/types.h>
842 #endif
843 #ifdef HAVE_SYS_TIME_H
844 #include <sys/time.h>
845 #endif
846 #ifdef HAVE_SYS_RESOURCE_H
847 #include <sys/resource.h>
848 #endif
851 AC_CACHE_CHECK([whether time_t is signed], tor_cv_time_t_signed, [
852 AC_RUN_IFELSE([AC_LANG_SOURCE([
853 #ifdef HAVE_SYS_TYPES_H
854 #include <sys/types.h>
855 #endif
856 #ifdef HAVE_SYS_TIME_H
857 #include <sys/time.h>
858 #endif
859 #ifdef HAVE_TIME_H
860 #include <time.h>
861 #endif
862 int main(int c, char**v) { if (((time_t)-1)<0) return 1; else return 0; }])],
863   tor_cv_time_t_signed=no, tor_cv_time_t_signed=yes, tor_cv_time_t_signed=cross)
866 if test "$tor_cv_time_t_signed" = cross; then
867   AC_MSG_NOTICE([Cross compiling: assuming that time_t is signed.])
870 if test "$tor_cv_time_t_signed" != no; then
871   AC_DEFINE([TIME_T_IS_SIGNED], 1,
872             [Define to 1 iff time_t is signed])
875 AC_CACHE_CHECK([whether size_t is signed], tor_cv_size_t_signed, [
876 AC_RUN_IFELSE([AC_LANG_SOURCE([
877 #ifdef HAVE_SYS_TYPES_H
878 #include <sys/types.h>
879 #endif
880 int main(int c, char**v) { if (((size_t)-1)<0) return 1; else return 0; }])],
881   tor_cv_size_t_signed=no, tor_cv_size_t_signed=yes, tor_cv_size_t_signed=cross)
884 if test "$tor_cv_size_t_signed" = cross; then
885   AC_MSG_NOTICE([Cross compiling: assuming that size_t is not signed.])
888 if test "$tor_cv_size_t_signed" = yes; then
889   AC_MSG_ERROR([You have a signed size_t; that's grossly nonconformant.])
892 AC_CHECK_SIZEOF(socklen_t, , [AC_INCLUDES_DEFAULT()
893 #ifdef HAVE_SYS_SOCKET_H
894 #include <sys/socket.h>
895 #endif
898 # We want to make sure that we _don't_ have a cell_t defined, like IRIX does.
900 AC_CHECK_SIZEOF(cell_t)
902 # Now make sure that NULL can be represented as zero bytes.
903 AC_CACHE_CHECK([whether memset(0) sets pointers to NULL], tor_cv_null_is_zero,
904 [AC_RUN_IFELSE([AC_LANG_SOURCE(
905 [[#include <stdlib.h>
906 #include <string.h>
907 #include <stdio.h>
908 #ifdef HAVE_STDDEF_H
909 #include <stddef.h>
910 #endif
911 int main () { char *p1,*p2; p1=NULL; memset(&p2,0,sizeof(p2));
912 return memcmp(&p1,&p2,sizeof(char*))?1:0; }]])],
913        [tor_cv_null_is_zero=yes],
914        [tor_cv_null_is_zero=no],
915        [tor_cv_null_is_zero=cross])])
917 if test "$tor_cv_null_is_zero" = cross ; then
918   # Cross-compiling; let's hope that the target isn't raving mad.
919   AC_MSG_NOTICE([Cross-compiling: we'll assume that NULL is represented as a sequence of 0-valued bytes.])
922 if test "$tor_cv_null_is_zero" != no; then
923   AC_DEFINE([NULL_REP_IS_ZERO_BYTES], 1,
924             [Define to 1 iff memset(0) sets pointers to NULL])
927 # And what happens when we malloc zero?
928 AC_CACHE_CHECK([whether we can malloc(0) safely.], tor_cv_malloc_zero_works,
929 [AC_RUN_IFELSE([AC_LANG_SOURCE(
930 [[#include <stdlib.h>
931 #include <string.h>
932 #include <stdio.h>
933 #ifdef HAVE_STDDEF_H
934 #include <stddef.h>
935 #endif
936 int main () { return malloc(0)?0:1; }]])],
937        [tor_cv_malloc_zero_works=yes],
938        [tor_cv_malloc_zero_works=no],
939        [tor_cv_malloc_zero_works=cross])])
941 if test "$tor_cv_malloc_zero_works" = cross; then
942   # Cross-compiling; let's hope that the target isn't raving mad.
943   AC_MSG_NOTICE([Cross-compiling: we'll assume that we need to check malloc() arguments for 0.])
946 if test "$tor_cv_malloc_zero_works" = yes; then
947   AC_DEFINE([MALLOC_ZERO_WORKS], 1,
948             [Define to 1 iff malloc(0) returns a pointer])
951 # whether we seem to be in a 2s-complement world.
952 AC_CACHE_CHECK([whether we are using 2s-complement arithmetic], tor_cv_twos_complement,
953 [AC_RUN_IFELSE([AC_LANG_SOURCE(
954 [[int main () { int problem = ((-99) != (~99)+1);
955 return problem ? 1 : 0; }]])],
956        [tor_cv_twos_complement=yes],
957        [tor_cv_twos_complement=no],
958        [tor_cv_twos_complement=cross])])
960 if test "$tor_cv_twos_complement" = cross ; then
961   # Cross-compiling; let's hope that the target isn't raving mad.
962   AC_MSG_NOTICE([Cross-compiling: we'll assume that negative integers are represented with two's complement.])
965 if test "$tor_cv_twos_complement" != no ; then
966   AC_DEFINE([USING_TWOS_COMPLEMENT], 1,
967             [Define to 1 iff we represent negative integers with two's complement])
970 # What does shifting a negative value do?
971 AC_CACHE_CHECK([whether right-shift on negative values does sign-extension], tor_cv_sign_extend,
972 [AC_RUN_IFELSE([AC_LANG_SOURCE(
973 [[int main () { int okay = (-60 >> 8) == -1; return okay ? 0 : 1; }]])],
974        [tor_cv_sign_extend=yes],
975        [tor_cv_sign_extend=no],
976        [tor_cv_sign_extend=cross])])
978 if test "$tor_cv_sign_extend" = cross ; then
979   # Cross-compiling; let's hope that the target isn't raving mad.
980   AC_MSG_NOTICE([Cross-compiling: we'll assume that right-shifting negative integers causes sign-extension])
983 if test "$tor_cv_sign_extend" != no ; then
984   AC_DEFINE([RSHIFT_DOES_SIGN_EXTEND], 1,
985             [Define to 1 iff right-shifting a negative value performs sign-extension])
988 # Whether we should use the dmalloc memory allocation debugging library.
989 AC_MSG_CHECKING(whether to use dmalloc (debug memory allocation library))
990 AC_ARG_WITH(dmalloc,
991 [  --with-dmalloc          Use debug memory allocation library. ],
992 [if [[ "$withval" = "yes" ]]; then
993   dmalloc=1
994   AC_MSG_RESULT(yes)
995 else
996   dmalloc=1
997   AC_MSG_RESULT(no)
998 fi], [ dmalloc=0; AC_MSG_RESULT(no) ]
1001 if [[ $dmalloc -eq 1 ]]; then
1002   AC_CHECK_HEADERS(dmalloc.h, , AC_MSG_ERROR(dmalloc header file not found. Do you have the development files for dmalloc installed?))
1003   AC_SEARCH_LIBS(dmalloc_malloc, [dmallocth dmalloc], , AC_MSG_ERROR(Libdmalloc library not found. If you enable it you better have it installed.))
1004   AC_DEFINE(USE_DMALLOC, 1, [Debug memory allocation library])
1005   AC_DEFINE(DMALLOC_FUNC_CHECK, 1, [Enable dmalloc's malloc function check])
1006   AC_CHECK_FUNCS(dmalloc_strdup dmalloc_strndup)
1009 AC_ARG_WITH(tcmalloc,
1010 [  --with-tcmalloc         Use tcmalloc memory allocation library. ],
1011 [ tcmalloc=yes ], [ tcmalloc=no ])
1013 if test x$tcmalloc = xyes ; then
1014    LDFLAGS="-ltcmalloc $LDFLAGS"
1017 using_custom_malloc=no
1018 if test x$enable_openbsd_malloc = xyes ; then
1019    using_custom_malloc=yes
1021 if test x$tcmalloc = xyes ; then
1022    using_custom_malloc=yes
1024 if test $using_custom_malloc = no ; then
1025    AC_CHECK_FUNCS(mallinfo)
1028 # By default, we're going to assume we don't have mlockall()
1029 # bionic and other platforms have various broken mlockall subsystems.
1030 # Some systems don't have a working mlockall, some aren't linkable,
1031 # and some have it but don't declare it.
1032 AC_CHECK_FUNCS(mlockall)
1033 AC_CHECK_DECLS([mlockall], , , [
1034 #ifdef HAVE_SYS_MMAN_H
1035 #include <sys/mman.h>
1036 #endif])
1038 # Allow user to specify an alternate syslog facility
1039 AC_ARG_WITH(syslog-facility,
1040 [  --with-syslog-facility=LOG syslog facility to use (default=LOG_DAEMON)],
1041 syslog_facility="$withval", syslog_facility="LOG_DAEMON")
1042 AC_DEFINE_UNQUOTED(LOGFACILITY,$syslog_facility,[name of the syslog facility])
1043 AC_SUBST(LOGFACILITY)
1045 # Check if we have getresuid and getresgid
1046 AC_CHECK_FUNCS(getresuid getresgid)
1048 # Check for gethostbyname_r in all its glorious incompatible versions.
1049 #   (This logic is based on that in Python's configure.in)
1050 AH_TEMPLATE(HAVE_GETHOSTBYNAME_R,
1051   [Define this if you have any gethostbyname_r()])
1053 AC_CHECK_FUNC(gethostbyname_r, [
1054   AC_MSG_CHECKING([how many arguments gethostbyname_r() wants])
1055   OLD_CFLAGS=$CFLAGS
1056   CFLAGS="$CFLAGS $MY_CPPFLAGS $MY_THREAD_CPPFLAGS $MY_CFLAGS"
1057   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
1058 #include <netdb.h>
1059   ], [[
1060     char *cp1, *cp2;
1061     struct hostent *h1, *h2;
1062     int i1, i2;
1063     (void)gethostbyname_r(cp1,h1,cp2,i1,&h2,&i2);
1064   ]])],[
1065     AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1066     AC_DEFINE(HAVE_GETHOSTBYNAME_R_6_ARG, 1,
1067      [Define this if gethostbyname_r takes 6 arguments])
1068     AC_MSG_RESULT(6)
1069   ], [
1070     AC_TRY_COMPILE([
1071 #include <netdb.h>
1072     ], [
1073       char *cp1, *cp2;
1074       struct hostent *h1;
1075       int i1, i2;
1076       (void)gethostbyname_r(cp1,h1,cp2,i1,&i2);
1077     ], [
1078       AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1079       AC_DEFINE(HAVE_GETHOSTBYNAME_R_5_ARG, 1,
1080         [Define this if gethostbyname_r takes 5 arguments])
1081       AC_MSG_RESULT(5)
1082    ], [
1083       AC_TRY_COMPILE([
1084 #include <netdb.h>
1085      ], [
1086        char *cp1;
1087        struct hostent *h1;
1088        struct hostent_data hd;
1089        (void) gethostbyname_r(cp1,h1,&hd);
1090      ], [
1091        AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1092        AC_DEFINE(HAVE_GETHOSTBYNAME_R_3_ARG, 1,
1093          [Define this if gethostbyname_r takes 3 arguments])
1094        AC_MSG_RESULT(3)
1095      ], [
1096        AC_MSG_RESULT(0)
1097      ])
1098   ])
1099  ])
1100  CFLAGS=$OLD_CFLAGS
1103 AC_CACHE_CHECK([whether the C compiler supports __func__],
1104   tor_cv_have_func_macro,
1105   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1106 #include <stdio.h>
1107 int main(int c, char **v) { puts(__func__); }])],
1108   tor_cv_have_func_macro=yes,
1109   tor_cv_have_func_macro=no))
1111 AC_CACHE_CHECK([whether the C compiler supports __FUNC__],
1112   tor_cv_have_FUNC_macro,
1113   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1114 #include <stdio.h>
1115 int main(int c, char **v) { puts(__FUNC__); }])],
1116   tor_cv_have_FUNC_macro=yes,
1117   tor_cv_have_FUNC_macro=no))
1119 AC_CACHE_CHECK([whether the C compiler supports __FUNCTION__],
1120   tor_cv_have_FUNCTION_macro,
1121   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1122 #include <stdio.h>
1123 int main(int c, char **v) { puts(__FUNCTION__); }])],
1124   tor_cv_have_FUNCTION_macro=yes,
1125   tor_cv_have_FUNCTION_macro=no))
1127 AC_CACHE_CHECK([whether we have extern char **environ already declared],
1128   tor_cv_have_environ_declared,
1129   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1130 /* We define _GNU_SOURCE here because it is also defined in compat.c.
1131  * Without it environ doesn't get declared. */
1132 #define _GNU_SOURCE
1133 #ifdef HAVE_UNISTD_H
1134 #include <unistd.h>
1135 #endif
1136 #include <stdlib.h>
1137 int main(int c, char **v) { char **t = environ; }])],
1138   tor_cv_have_environ_declared=yes,
1139   tor_cv_have_environ_declared=no))
1141 if test "$tor_cv_have_func_macro" = 'yes'; then
1142   AC_DEFINE(HAVE_MACRO__func__, 1, [Defined if the compiler supports __func__])
1145 if test "$tor_cv_have_FUNC_macro" = 'yes'; then
1146   AC_DEFINE(HAVE_MACRO__FUNC__, 1, [Defined if the compiler supports __FUNC__])
1149 if test "$tor_cv_have_FUNCTION_macro" = 'yes'; then
1150   AC_DEFINE(HAVE_MACRO__FUNCTION__, 1,
1151            [Defined if the compiler supports __FUNCTION__])
1154 if test "$tor_cv_have_environ_declared" = 'yes'; then
1155   AC_DEFINE(HAVE_EXTERN_ENVIRON_DECLARED, 1,
1156            [Defined if we have extern char **environ already declared])
1159 # $prefix stores the value of the --prefix command line option, or
1160 # NONE if the option wasn't set.  In the case that it wasn't set, make
1161 # it be the default, so that we can use it to expand directories now.
1162 if test "x$prefix" = "xNONE"; then
1163   prefix=$ac_default_prefix
1166 # and similarly for $exec_prefix
1167 if test "x$exec_prefix" = "xNONE"; then
1168   exec_prefix=$prefix
1171 if test "x$BUILDDIR" = "x"; then
1172   BUILDDIR=`pwd`
1174 AC_SUBST(BUILDDIR)
1175 AH_TEMPLATE([BUILDDIR],[tor's build directory])
1176 AC_DEFINE_UNQUOTED(BUILDDIR,"$BUILDDIR")
1178 if test "x$CONFDIR" = "x"; then
1179   CONFDIR=`eval echo $sysconfdir/tor`
1181 AC_SUBST(CONFDIR)
1182 AH_TEMPLATE([CONFDIR],[tor's configuration directory])
1183 AC_DEFINE_UNQUOTED(CONFDIR,"$CONFDIR")
1185 BINDIR=`eval echo $bindir`
1186 AC_SUBST(BINDIR)
1187 LOCALSTATEDIR=`eval echo $localstatedir`
1188 AC_SUBST(LOCALSTATEDIR)
1190 if test "$bwin32" = true; then
1191   # Test if the linker supports the --nxcompat and --dynamicbase options
1192   # for Windows
1193   save_LDFLAGS="$LDFLAGS"
1194   LDFLAGS="-Wl,--nxcompat -Wl,--dynamicbase"
1195   AC_MSG_CHECKING([whether the linker supports DllCharacteristics])
1196   AC_LINK_IFELSE([AC_LANG_PROGRAM([])],
1197     [AC_MSG_RESULT([yes])]
1198     [save_LDFLAGS="$save_LDFLAGS $LDFLAGS"],
1199     [AC_MSG_RESULT([no])]
1200   )
1201   LDFLAGS="$save_LDFLAGS"
1204 # Set CFLAGS _after_ all the above checks, since our warnings are stricter
1205 # than autoconf's macros like.
1206 if test "$GCC" = yes; then
1207   # Disable GCC's strict aliasing checks.  They are an hours-to-debug
1208   # accident waiting to happen.
1209   CFLAGS="$CFLAGS -Wall -fno-strict-aliasing"
1210 else
1211   # Autoconf sets -g -O2 by default. Override optimization level
1212   # for non-gcc compilers
1213   CFLAGS="$CFLAGS -O"
1214   enable_gcc_warnings=no
1215   enable_gcc_warnings_advisory=no
1218 # OS X Lion started deprecating the system openssl. Let's just disable
1219 # all deprecation warnings on OS X. Also, to potentially make the binary
1220 # a little smaller, let's enable dead_strip.
1221 case "$host_os" in
1223  darwin*)
1224     CFLAGS="$CFLAGS -Wno-deprecated-declarations"
1225     LDFLAGS="$LDFLAGS -dead_strip" ;;
1226 esac
1228 # Add some more warnings which we use in development but not in the
1229 # released versions.  (Some relevant gcc versions can't handle these.)
1230 if test x$enable_gcc_warnings = xyes || test x$enable_gcc_warnings_advisory = xyes; then
1232   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1233 #if !defined(__GNUC__) || (__GNUC__ < 4)
1234 #error
1235 #endif])], have_gcc4=yes, have_gcc4=no)
1237   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1238 #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 2)
1239 #error
1240 #endif])], have_gcc42=yes, have_gcc42=no)
1242   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1243 #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 3)
1244 #error
1245 #endif])], have_gcc43=yes, have_gcc43=no)
1247   save_CFLAGS="$CFLAGS"
1248   CFLAGS="$CFLAGS -Wshorten-64-to-32"
1249   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], have_shorten64_flag=yes,
1250                     have_shorten64_flag=no)
1251   CFLAGS="$save_CFLAGS"
1253   case $host in
1254     *-*-openbsd*)
1255       # Some OpenBSD versions (like 4.8) have -Wsystem-headers by default.
1256       # That's fine, except that the headers don't pass -Wredundant-decls.
1257       # Therefore, let's disable -Wsystem-headers when we're building
1258       # with maximal warnings on OpenBSD.
1259       CFLAGS="$CFLAGS -Wno-system-headers" ;;
1260   esac
1262   CFLAGS="$CFLAGS -W -Wfloat-equal -Wundef -Wpointer-arith"
1263   CFLAGS="$CFLAGS -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings"
1264   CFLAGS="$CFLAGS -Wredundant-decls -Wchar-subscripts -Wcomment -Wformat=2"
1265   CFLAGS="$CFLAGS -Wwrite-strings -Wmissing-declarations -Wredundant-decls"
1266   CFLAGS="$CFLAGS -Wnested-externs -Wbad-function-cast -Wswitch-enum"
1268   if test x$enable_gcc_warnings = xyes; then
1269     CFLAGS="$CFLAGS -Werror"
1270   fi
1272   # Disabled, so we can use mallinfo(): -Waggregate-return
1274   if test x$have_gcc4 = xyes ; then
1275     # These warnings break gcc 3.3.5 and work on gcc 4.0.2
1276     CFLAGS="$CFLAGS -Winit-self -Wmissing-field-initializers -Wdeclaration-after-statement -Wold-style-definition"
1277   fi
1279   if test x$have_gcc42 = xyes ; then
1280     # These warnings break gcc 4.0.2 and work on gcc 4.2
1281     # XXXX020 See if any of these work with earlier versions.
1282     CFLAGS="$CFLAGS -Waddress -Wmissing-noreturn -Wstrict-overflow=1"
1284     # We used to use -Wstrict-overflow=5, but that breaks us heavily under 4.3.
1285   fi
1287   if test x$have_gcc42 = xyes && test x$have_clang = xno; then
1288     # These warnings break gcc 4.0.2 and clang, but work on gcc 4.2
1289     CFLAGS="$CFLAGS -Wnormalized=id -Woverride-init"
1290   fi
1292   if test x$have_gcc43 = xyes ; then
1293     # These warnings break gcc 4.2 and work on gcc 4.3
1294     # XXXX020 See if any of these work with earlier versions.
1295     CFLAGS="$CFLAGS -Wextra -Warray-bounds"
1296   fi
1298   if test x$have_shorten64_flag = xyes ; then
1299     CFLAGS="$CFLAGS -Wshorten-64-to-32"
1300   fi
1302 ##This will break the world on some 64-bit architectures
1303 # CFLAGS="$CFLAGS -Winline"
1308 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent $TOR_CPPFLAGS_openssl $TOR_CPPFLAGS_zlib"
1310 AC_CONFIG_FILES([
1311         Doxyfile
1312         Makefile
1313         contrib/suse/tor.sh
1314         contrib/tor.logrotate
1315         contrib/tor.sh
1316         contrib/torctl
1317         contrib/torify
1318         src/config/torrc.sample
1321 AC_OUTPUT
1323 if test -x /usr/bin/perl && test -x ./contrib/updateVersions.pl ; then
1324   ./contrib/updateVersions.pl