put the 0.2.8.10 changelog in the releasenotes too
[tor.git] / configure.ac
blobeb1fac3b2de46a2f8fa443678d1a03969602e2da
1 dnl Copyright (c) 2001-2004, Roger Dingledine
2 dnl Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson
3 dnl Copyright (c) 2007-2015, The Tor Project, Inc.
4 dnl See LICENSE for licensing information
6 AC_PREREQ([2.63])
7 AC_INIT([tor],[0.2.8.10])
8 AC_CONFIG_SRCDIR([src/or/main.c])
9 AC_CONFIG_MACRO_DIR([m4])
11 # "foreign" means we don't follow GNU package layout standards
12 # "1.11" means we require automake version 1.11 or newer
13 # "subdir-objects" means put .o files in the same directory as the .c files
14 AM_INIT_AUTOMAKE([foreign 1.11 subdir-objects])
16 m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
17 AC_CONFIG_HEADERS([orconfig.h])
19 AC_CANONICAL_HOST
21 PKG_PROG_PKG_CONFIG
23 if test -f "/etc/redhat-release"; then
24   if test -f "/usr/kerberos/include"; then
25     CPPFLAGS="$CPPFLAGS -I/usr/kerberos/include"
26   fi
29 # Not a no-op; we want to make sure that CPPFLAGS is set before we use
30 # the += operator on it in src/or/Makefile.am
31 CPPFLAGS="$CPPFLAGS -I\${top_srcdir}/src/common"
33 #XXXX020 We should make these enabled or not, before 0.2.0.x-final
34 AC_ARG_ENABLE(openbsd-malloc,
35    AS_HELP_STRING(--enable-openbsd-malloc, [use malloc code from OpenBSD.  Linux only]))
36 AC_ARG_ENABLE(instrument-downloads,
37    AS_HELP_STRING(--enable-instrument-downloads, [instrument downloads of directory resources etc.]))
38 AC_ARG_ENABLE(static-openssl,
39    AS_HELP_STRING(--enable-static-openssl, [link against a static openssl library. Requires --with-openssl-dir]))
40 AC_ARG_ENABLE(static-libevent,
41    AS_HELP_STRING(--enable-static-libevent, [link against a static libevent library. Requires --with-libevent-dir]))
42 AC_ARG_ENABLE(static-zlib,
43    AS_HELP_STRING(--enable-static-zlib, [link against a static zlib library. Requires --with-zlib-dir]))
44 AC_ARG_ENABLE(static-tor,
45    AS_HELP_STRING(--enable-static-tor, [create an entirely static Tor binary. Requires --with-openssl-dir and --with-libevent-dir and --with-zlib-dir]))
46 AC_ARG_ENABLE(unittests,
47    AS_HELP_STRING(--disable-unittests, [don't build unit tests for Tor. Risky!]))
48 AC_ARG_ENABLE(coverage,
49    AS_HELP_STRING(--enable-coverage, [enable coverage support in the unit-test build]))
50 AC_ARG_ENABLE(asserts-in-tests,
51    AS_HELP_STRING(--disable-asserts-in-tests, [disable tor_assert() calls in the unit tests, for branch coverage]))
52 AC_ARG_ENABLE(system-torrc,
53    AS_HELP_STRING(--disable-system-torrc, [don't look for a system-wide torrc file]))
55 if test "x$enable_coverage" != "xyes" -a "x$enable_asserts_in_tests" = "xno" ; then
56     AC_MSG_ERROR([Can't disable assertions outside of coverage build])
59 AM_CONDITIONAL(UNITTESTS_ENABLED, test "x$enable_unittests" != "xno")
60 AM_CONDITIONAL(COVERAGE_ENABLED, test "x$enable_coverage" = "xyes")
61 AM_CONDITIONAL(DISABLE_ASSERTS_IN_UNIT_TESTS, test "x$enable_asserts_in_tests" = "xno")
63 if test "$enable_static_tor" = "yes"; then
64   enable_static_libevent="yes";
65   enable_static_openssl="yes";
66   enable_static_zlib="yes";
67   CFLAGS="$CFLAGS -static"
70 if test "$enable_system_torrc" = "no"; then
71   AC_DEFINE(DISABLE_SYSTEM_TORRC, 1,
72             [Defined if we're not going to look for a torrc in SYSCONF])
75 AM_CONDITIONAL(USE_OPENBSD_MALLOC, test "x$enable_openbsd_malloc" = "xyes")
76 if test "x$enable_instrument_downloads" = "xyes"; then
77   AC_DEFINE(INSTRUMENT_DOWNLOADS, 1,
78             [Defined if we want to keep track of how much of each kind of resource we download.])
81 AC_ARG_ENABLE(transparent,
82      AS_HELP_STRING(--disable-transparent, [disable transparent proxy support]),
83      [case "${enableval}" in
84         "yes") transparent=true ;;
85         "no")  transparent=false ;;
86         *) AC_MSG_ERROR(bad value for --enable-transparent) ;;
87       esac], [transparent=true])
89 AC_ARG_ENABLE(asciidoc,
90      AS_HELP_STRING(--disable-asciidoc, [don't use asciidoc (disables building of manpages)]),
91      [case "${enableval}" in
92         "yes") asciidoc=true ;;
93         "no")  asciidoc=false ;;
94         *) AC_MSG_ERROR(bad value for --disable-asciidoc) ;;
95       esac], [asciidoc=true])
97 # systemd notify support
98 AC_ARG_ENABLE(systemd,
99       AS_HELP_STRING(--enable-systemd, [enable systemd notification support]),
100       [case "${enableval}" in
101         "yes") systemd=true ;;
102         "no")  systemd=false ;;
103         * ) AC_MSG_ERROR(bad value for --enable-systemd) ;;
104       esac], [systemd=auto])
108 # systemd support
109 if test "x$enable_systemd" = "xno"; then
110     have_systemd=no;
111 else
112     PKG_CHECK_MODULES(SYSTEMD,
113         [libsystemd-daemon],
114         have_systemd=yes,
115         have_systemd=no)
116     if test "x$have_systemd" = "xno"; then
117         AC_MSG_NOTICE([Okay, checking for systemd a different way...])
118         PKG_CHECK_MODULES(SYSTEMD,
119             [libsystemd],
120             have_systemd=yes,
121             have_systemd=no)
122     fi
125 if test "x$have_systemd" = "xyes"; then
126     AC_DEFINE(HAVE_SYSTEMD,1,[Have systemd])
127     TOR_SYSTEMD_CFLAGS="${SYSTEMD_CFLAGS}"
128     TOR_SYSTEMD_LIBS="${SYSTEMD_LIBS}"
129     PKG_CHECK_MODULES(LIBSYSTEMD209, [libsystemd >= 209],
130          [AC_DEFINE(HAVE_SYSTEMD_209,1,[Have systemd v209 or more])], [])
132 AC_SUBST(TOR_SYSTEMD_CFLAGS)
133 AC_SUBST(TOR_SYSTEMD_LIBS)
135 if test "x$enable_systemd" = "xyes" -a "x$have_systemd" != "xyes" ; then
136     AC_MSG_ERROR([Explicitly requested systemd support, but systemd not found])
139 case "$host" in
140    *-*-solaris* )
141      AC_DEFINE(_REENTRANT, 1, [Define on some platforms to activate x_r() functions in time.h])
142      ;;
143 esac
145 AC_ARG_ENABLE(gcc-warnings,
146      AS_HELP_STRING(--enable-gcc-warnings, [enable verbose warnings]))
147 AC_ARG_ENABLE(gcc-warnings-advisory,
148      AS_HELP_STRING(--enable-gcc-warnings-advisory, [enable verbose warnings, excluding -Werror]))
150 dnl Others suggest '/gs /safeseh /nxcompat /dynamicbase' for non-gcc on Windows
151 AC_ARG_ENABLE(gcc-hardening,
152     AS_HELP_STRING(--disable-gcc-hardening, [disable compiler security checks]))
154 AC_ARG_ENABLE(expensive-hardening,
155     AS_HELP_STRING(--enable-expensive-hardening, [enable more expensive compiler hardening; makes Tor slower]))
157 dnl Linker hardening options
158 dnl Currently these options are ELF specific - you can't use this with MacOSX
159 AC_ARG_ENABLE(linker-hardening,
160     AS_HELP_STRING(--disable-linker-hardening, [disable linker security fixups]))
162 AC_ARG_ENABLE(local-appdata,
163    AS_HELP_STRING(--enable-local-appdata, [default to host local application data paths on Windows]))
164 if test "$enable_local_appdata" = "yes"; then
165   AC_DEFINE(ENABLE_LOCAL_APPDATA, 1,
166             [Defined if we default to host local appdata paths on Windows])
169 # Tor2web mode flag
170 AC_ARG_ENABLE(tor2web-mode,
171      AS_HELP_STRING(--enable-tor2web-mode, [support tor2web non-anonymous mode]),
172 [if test "x$enableval" = "xyes"; then
173     CFLAGS="$CFLAGS -D ENABLE_TOR2WEB_MODE=1"
174 fi])
176 AC_ARG_ENABLE(bufferevents,
177      AS_HELP_STRING(--enable-bufferevents, [use Libevent's buffered IO]))
179 AC_ARG_ENABLE(tool-name-check,
180      AS_HELP_STRING(--disable-tool-name-check, [check for sanely named toolchain when cross-compiling]))
182 AC_ARG_ENABLE(seccomp,
183      AS_HELP_STRING(--disable-seccomp, [do not attempt to use libseccomp]))
185 AC_ARG_ENABLE(libscrypt,
186      AS_HELP_STRING(--disable-libscrypt, [do not attempt to use libscrypt]))
188 dnl check for the correct "ar" when cross-compiling
189 AN_MAKEVAR([AR], [AC_PROG_AR])
190 AN_PROGRAM([ar], [AC_PROG_AR])
191 AC_DEFUN([AC_PROG_AR], [AC_CHECK_TOOL([AR], [ar], [ar])])
192 AC_PROG_AR
194 dnl Check whether the above macro has settled for a simply named tool even
195 dnl though we're cross compiling. We must do this before running AC_PROG_CC,
196 dnl because that will find any cc on the system, not only the cross-compiler,
197 dnl and then verify that a binary built with this compiler runs on the
198 dnl build system. It will then come to the false conclusion that we're not
199 dnl cross-compiling.
200 if test "x$enable_tool_name_check" != "xno"; then
201     if test "x$ac_tool_warned" = "xyes"; then
202         AC_MSG_ERROR([We are cross compiling but could not find a properly named toolchain. Do you have your cross-compiling toolchain in PATH? (You can --disable-tool-name-check to ignore this.)])
203         elif test "x$ac_ct_AR" != "x" -a "x$cross_compiling" = "xmaybe"; then
204                 AC_MSG_ERROR([We think we are cross compiling but could not find a properly named toolchain. Do you have your cross-compiling toolchain in PATH? (You can --disable-tool-name-check to ignore this.)])
205         fi
208 AC_PROG_CC
209 AC_PROG_CPP
210 AC_PROG_MAKE_SET
211 AC_PROG_RANLIB
213 AC_PATH_PROG([PERL], [perl])
215 dnl autoconf 2.59 appears not to support AC_PROG_SED
216 AC_CHECK_PROG([SED],[sed],[sed],[/bin/false])
218 dnl check for asciidoc and a2x
219 AC_PATH_PROG([ASCIIDOC], [asciidoc], none)
220 AC_PATH_PROGS([A2X], [a2x a2x.py], none)
222 AM_CONDITIONAL(USE_ASCIIDOC, test "x$asciidoc" = "xtrue")
224 AM_CONDITIONAL(USE_FW_HELPER, test "x$natpmp" = "xtrue" || test "x$upnp" = "xtrue")
225 AM_CONDITIONAL(NAT_PMP, test "x$natpmp" = "xtrue")
226 AM_CONDITIONAL(MINIUPNPC, test "x$upnp" = "xtrue")
227 AM_PROG_CC_C_O
228 AC_PROG_CC_C99
230 AC_ARG_VAR([PYTHON], [path to Python binary])
231 AC_CHECK_PROGS(PYTHON, [python python2 python2.7 python3 python3.3])
232 if test "x$PYTHON" = "x"; then
233   AC_MSG_WARN([Python unavailable; some tests will not be run.])
235 AM_CONDITIONAL(USEPYTHON, [test "x$PYTHON" != "x"])
237 ifdef([AC_C_FLEXIBLE_ARRAY_MEMBER], [
238 AC_C_FLEXIBLE_ARRAY_MEMBER
239 ], [
240  dnl Maybe we've got an old autoconf...
241  AC_CACHE_CHECK([for flexible array members],
242      tor_cv_c_flexarray,
243      [AC_COMPILE_IFELSE(
244        AC_LANG_PROGRAM([
245  struct abc { int a; char b[]; };
246 ], [
247  struct abc *def = malloc(sizeof(struct abc)+sizeof(char));
248  def->b[0] = 33;
250   [tor_cv_c_flexarray=yes],
251   [tor_cv_c_flexarray=no])])
252  if test "$tor_cv_flexarray" = "yes"; then
253    AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [], [Define to nothing if C supports flexible array members, and to 1 if it does not.])
254  else
255    AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [1], [Define to nothing if C supports flexible array members, and to 1 if it does not.])
256  fi
259 AC_CACHE_CHECK([for working C99 mid-block declaration syntax],
260       tor_cv_c_c99_decl,
261       [AC_COMPILE_IFELSE(
262          [AC_LANG_PROGRAM([], [int x; x = 3; int y; y = 4 + x;])],
263          [tor_cv_c_c99_decl=yes],
264          [tor_cv_c_c99_decl=no] )])
265 if test "$tor_cv_c_c99_decl" != "yes"; then
266   AC_MSG_ERROR([Your compiler doesn't support c99 mid-block declarations. This is required as of Tor 0.2.6.x])
269 AC_CACHE_CHECK([for working C99 designated initializers],
270       tor_cv_c_c99_designated_init,
271       [AC_COMPILE_IFELSE(
272          [AC_LANG_PROGRAM([struct s { int a; int b; };],
273                [[ struct s ss = { .b = 5, .a = 6 }; ]])],
274          [tor_cv_c_c99_designated_init=yes],
275          [tor_cv_c_c99_designated_init=no] )])
277 if test "$tor_cv_c_c99_designated_init" != "yes"; then
278   AC_MSG_ERROR([Your compiler doesn't support c99 designated initializers. This is required as of Tor 0.2.6.x])
281 TORUSER=_tor
282 AC_ARG_WITH(tor-user,
283         AS_HELP_STRING(--with-tor-user=NAME, [specify username for tor daemon]),
284         [
285            TORUSER=$withval
286         ]
288 AC_SUBST(TORUSER)
290 TORGROUP=_tor
291 AC_ARG_WITH(tor-group,
292         AS_HELP_STRING(--with-tor-group=NAME, [specify group name for tor daemon]),
293         [
294            TORGROUP=$withval
295         ]
297 AC_SUBST(TORGROUP)
300 dnl If _WIN32 is defined and non-zero, we are building for win32
301 AC_MSG_CHECKING([for win32])
302 AC_RUN_IFELSE([AC_LANG_SOURCE([
303 int main(int c, char **v) {
304 #ifdef _WIN32
305 #if _WIN32
306   return 0;
307 #else
308   return 1;
309 #endif
310 #else
311   return 2;
312 #endif
313 }])],
314 bwin32=true; AC_MSG_RESULT([yes]),
315 bwin32=false; AC_MSG_RESULT([no]),
316 bwin32=cross; AC_MSG_RESULT([cross])
319 if test "$bwin32" = "cross"; then
320 AC_MSG_CHECKING([for win32 (cross)])
321 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
322 #ifdef _WIN32
323 int main(int c, char **v) {return 0;}
324 #else
325 #error
326 int main(int c, char **v) {return x(y);}
327 #endif
328 ])],
329 bwin32=true; AC_MSG_RESULT([yes]),
330 bwin32=false; AC_MSG_RESULT([no]))
333 AH_BOTTOM([
334 #ifdef _WIN32
335 /* Defined to access windows functions and definitions for >=WinXP */
336 # ifndef WINVER
337 #  define WINVER 0x0501
338 # endif
340 /* Defined to access _other_ windows functions and definitions for >=WinXP */
341 # ifndef _WIN32_WINNT
342 #  define _WIN32_WINNT 0x0501
343 # endif
345 /* Defined to avoid including some windows headers as part of Windows.h */
346 # ifndef WIN32_LEAN_AND_MEAN
347 #  define WIN32_LEAN_AND_MEAN 1
348 # endif
349 #endif
353 AM_CONDITIONAL(BUILD_NT_SERVICES, test "x$bwin32" = "xtrue")
355 dnl Enable C99 when compiling with MIPSpro
356 AC_MSG_CHECKING([for MIPSpro compiler])
357 AC_COMPILE_IFELSE([AC_LANG_PROGRAM(, [
358 #if (defined(__sgi) && defined(_COMPILER_VERSION))
359 #error
360   return x(y);
361 #endif
362 ])],
363 bmipspro=false; AC_MSG_RESULT(no),
364 bmipspro=true; AC_MSG_RESULT(yes))
366 if test "$bmipspro" = "true"; then
367   CFLAGS="$CFLAGS -c99"
370 AC_C_BIGENDIAN
372 AC_SEARCH_LIBS(socket, [socket network])
373 AC_SEARCH_LIBS(gethostbyname, [nsl])
374 AC_SEARCH_LIBS(dlopen, [dl])
375 AC_SEARCH_LIBS(inet_aton, [resolv])
376 AC_SEARCH_LIBS(backtrace, [execinfo])
377 saved_LIBS="$LIBS"
378 AC_SEARCH_LIBS([clock_gettime], [rt])
379 if test "$LIBS" != "$saved_LIBS"; then
380    # Looks like we need -lrt for clock_gettime().
381    have_rt=yes
384 AC_SEARCH_LIBS(pthread_create, [pthread])
385 AC_SEARCH_LIBS(pthread_detach, [pthread])
387 AM_CONDITIONAL(THREADS_WIN32, test "$bwin32" = "true")
388 AM_CONDITIONAL(THREADS_PTHREADS, test "$bwin32" = "false")
390 AC_CHECK_FUNCS(
391         _NSGetEnviron \
392         RtlSecureZeroMemory \
393         SecureZeroMemory \
394         accept4 \
395         backtrace \
396         backtrace_symbols_fd \
397         eventfd \
398         explicit_bzero \
399         timingsafe_memcmp \
400         flock \
401         ftime \
402         getaddrinfo \
403         getifaddrs \
404         getpass \
405         getrlimit \
406         gettimeofday \
407         gmtime_r \
408         htonll \
409         inet_aton \
410         ioctl \
411         issetugid \
412         llround \
413         localtime_r \
414         lround \
415         memmem \
416         memset_s \
417         pipe \
418         pipe2 \
419         prctl \
420         readpassphrase \
421         rint \
422         sigaction \
423         socketpair \
424         statvfs \
425         strlcat \
426         strlcpy \
427         strnlen \
428         strptime \
429         strtok_r \
430         strtoull \
431         sysconf \
432         sysctl \
433         uname \
434         usleep \
435         vasprintf \
436         _vscprintf
439 # Apple messed up when they added two functions functions in Sierra: they
440 # forgot to decorate them with appropriate AVAILABLE_MAC_OS_VERSION
441 # checks. So we should only probe for those functions if we are sure that we
442 # are not targetting OSX 10.11 or earlier.
443 AC_MSG_CHECKING([for a pre-Sierra OSX build target])
444 AC_TRY_COMPILE([
445 #ifdef __APPLE__
446 #  include <AvailabilityMacros.h>
447 #  ifndef MAC_OS_VERSION_10_12
448 #    define MAC_OS_VERSION_10_12 101200
449 #  endif
450 #  if defined(MAC_OS_X_VERSION_MIN_REQUIRED)
451 #    if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_VERSION_10_12
452 #      error "Running on Mac OSX 10.11 or earlier"
453 #    endif
454 #  endif
455 #endif
456 ], [],
457    [on_macos_pre_10_12=no ; AC_MSG_RESULT([no])],
458    [on_macos_pre_10_12=yes; AC_MSG_RESULT([yes])])
460 if test "$on_macos_pre_10_12" = "no"; then
461   AC_CHECK_FUNCS(
462         clock_gettime \
463         getentropy \
464   )
467 if test "$bwin32" != "true"; then
468   AC_CHECK_HEADERS(pthread.h)
469   AC_CHECK_FUNCS(pthread_create)
470   AC_CHECK_FUNCS(pthread_condattr_setclock)
473 if test "$bwin32" = "true"; then
474   AC_CHECK_DECLS([SecureZeroMemory, _getwch], , , [
475 #include <windows.h>
476 #include <conio.h>
477 #include <wchar.h>
478                  ])
481 AM_CONDITIONAL(BUILD_READPASSPHRASE_C,
482   test "x$ac_cv_func_readpassphrase" = "xno" && test "$bwin32" = "false")
484 dnl ------------------------------------------------------
485 dnl Where do you live, libevent?  And how do we call you?
487 if test "$bwin32" = "true"; then
488   TOR_LIB_WS32=-lws2_32
489   TOR_LIB_IPHLPAPI=-liphlpapi
490   # Some of the cargo-cults recommend -lwsock32 as well, but I don't
491   # think it's actually necessary.
492   TOR_LIB_GDI=-lgdi32
493 else
494   TOR_LIB_WS32=
495   TOR_LIB_GDI=
497 AC_SUBST(TOR_LIB_WS32)
498 AC_SUBST(TOR_LIB_GDI)
499 AC_SUBST(TOR_LIB_IPHLPAPI)
501 tor_libevent_pkg_redhat="libevent"
502 tor_libevent_pkg_debian="libevent-dev"
503 tor_libevent_devpkg_redhat="libevent-devel"
504 tor_libevent_devpkg_debian="libevent-dev"
506 dnl On Gnu/Linux or any place we require it, we'll add librt to the Libevent
507 dnl linking for static builds.
508 STATIC_LIBEVENT_FLAGS=""
509 if test "$enable_static_libevent" = "yes"; then
510     if test "$have_rt" = "yes"; then
511       STATIC_LIBEVENT_FLAGS=" -lrt "
512     fi
515 TOR_SEARCH_LIBRARY(libevent, $trylibeventdir, [-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32], [
516 #ifdef _WIN32
517 #include <winsock2.h>
518 #endif
519 #include <sys/time.h>
520 #include <sys/types.h>
521 #include <event.h>], [
522 #ifdef _WIN32
523 #include <winsock2.h>
524 #endif
525 void *event_init(void);],
526     [
527 #ifdef _WIN32
528 {WSADATA d; WSAStartup(0x101,&d); }
529 #endif
530 event_init();
531 ], [--with-libevent-dir], [/opt/libevent])
533 dnl Now check for particular libevent functions.
534 save_LIBS="$LIBS"
535 save_LDFLAGS="$LDFLAGS"
536 save_CPPFLAGS="$CPPFLAGS"
537 LIBS="-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32 $LIBS"
538 LDFLAGS="$TOR_LDFLAGS_libevent $LDFLAGS"
539 CPPFLAGS="$TOR_CPPFLAGS_libevent $CPPFLAGS"
540 AC_CHECK_FUNCS([event_get_version_number \
541                 evutil_secure_rng_set_urandom_device_file \
542                 evutil_secure_rng_init \
543                ])
544 AC_CHECK_MEMBERS([struct event.min_heap_idx], , ,
545 [#include <event.h>
548 AC_CHECK_HEADERS(event2/event.h event2/dns.h event2/bufferevent_ssl.h)
550 LIBS="$STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32 $save_LIBS"
552 AM_CONDITIONAL(USE_EXTERNAL_EVDNS,
553   test "x$ac_cv_header_event2_dns_h" = "xyes")
555 if test "$enable_static_libevent" = "yes"; then
556    if test "$tor_cv_library_libevent_dir" = "(system)"; then
557      AC_MSG_ERROR("You must specify an explicit --with-libevent-dir=x option when using --enable-static-libevent")
558    else
559      TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent.a $STATIC_LIBEVENT_FLAGS"
560    fi
561 else
562      if test "x$ac_cv_header_event2_event_h" = "xyes"; then
563        AC_SEARCH_LIBS(event_new, [event event_core], , AC_MSG_ERROR("libevent2 is installed but linking it failed while searching for event_new"))
564        AC_SEARCH_LIBS(evdns_base_new, [event event_extra], , AC_MSG_ERROR("libevent2 is installed but linking it failed while searching for evdns_base_new"))
566        if test "$ac_cv_search_event_new" != "none required"; then
567          TOR_LIBEVENT_LIBS="$ac_cv_search_event_new"
568        fi
569        if test "$ac_cv_search_evdns_base_new" != "none required"; then
570          TOR_LIBEVENT_LIBS="$ac_cv_search_evdns_base_new $TOR_LIBEVENT_LIBS"
571        fi
572      else
573        TOR_LIBEVENT_LIBS="-levent"
574      fi
577 LIBS="$save_LIBS"
578 LDFLAGS="$save_LDFLAGS"
579 CPPFLAGS="$save_CPPFLAGS"
581 dnl This isn't the best test for Libevent 2.0.3-alpha.  Once it's released,
582 dnl we can do much better.
583 if test "$enable_bufferevents" = "yes"; then
584   if test "$ac_cv_header_event2_bufferevent_ssl_h" != "yes"; then
585     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.])
586   else
588     CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent"
590     # Check for the right version.  First see if version detection works.
591     AC_MSG_CHECKING([whether we can detect the Libevent version])
592     AC_COMPILE_IFELSE([AC_LANG_SOURCE([
593 #include <event2/event.h>
594 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 10
595 #error
596 int x = y(zz);
597 #else
598 int x = 1;
599 #endif
600   ])], [event_version_number_works=yes; AC_MSG_RESULT([yes]) ],
601      [event_version_number_works=no;  AC_MSG_RESULT([no])])
602     if test "$event_version_number_works" != "yes"; then
603       AC_MSG_WARN([Version detection on Libevent seems broken.  Your Libevent installation is probably screwed up or very old.])
604     else
605       AC_MSG_CHECKING([whether Libevent is new enough for bufferevents])
606       AC_COMPILE_IFELSE([AC_LANG_SOURCE([
607 #include <event2/event.h>
608 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 0x02000d00
609 #error
610 int x = y(zz);
611 #else
612 int x = 1;
613 #endif
614    ])], [ AC_MSG_RESULT([yes]) ],
615       [ AC_MSG_RESULT([no])
616         AC_MSG_ERROR([Libevent does not seem new enough to support bufferevents.  We require 2.0.13-stable or later]) ] )
617     fi
618   fi
621 LIBS="$save_LIBS"
622 LDFLAGS="$save_LDFLAGS"
623 CPPFLAGS="$save_CPPFLAGS"
625 AM_CONDITIONAL(USE_BUFFEREVENTS, test "$enable_bufferevents" = "yes")
626 if test "$enable_bufferevents" = "yes"; then
627   AC_DEFINE(USE_BUFFEREVENTS, 1, [Defined if we're going to use Libevent's buffered IO API])
628   if test "$enable_static_libevent" = "yes"; then
629     TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent_openssl.a $TOR_LIBEVENT_LIBS"
630   else
631     TOR_LIBEVENT_LIBS="-levent_openssl $TOR_LIBEVENT_LIBS"
632   fi
634 AC_SUBST(TOR_LIBEVENT_LIBS)
636 dnl ------------------------------------------------------
637 dnl Where do you live, libm?
639 dnl On some platforms (Haiku/BeOS) the math library is
640 dnl part of libroot. In which case don't link against lm
641 TOR_LIB_MATH=""
642 save_LIBS="$LIBS"
643 AC_SEARCH_LIBS(pow, [m], , AC_MSG_ERROR([Could not find pow in libm or libc.]))
644 if test "$ac_cv_search_pow" != "none required"; then
645     TOR_LIB_MATH="$ac_cv_search_pow"
647 LIBS="$save_LIBS"
648 AC_SUBST(TOR_LIB_MATH)
650 dnl ------------------------------------------------------
651 dnl Where do you live, openssl?  And how do we call you?
653 tor_openssl_pkg_redhat="openssl"
654 tor_openssl_pkg_debian="libssl-dev"
655 tor_openssl_devpkg_redhat="openssl-devel"
656 tor_openssl_devpkg_debian="libssl-dev"
658 ALT_openssl_WITHVAL=""
659 AC_ARG_WITH(ssl-dir,
660   AS_HELP_STRING(--with-ssl-dir=PATH, [obsolete alias for --with-openssl-dir]),
661   [
662       if test "x$withval" != "xno" && test "x$withval" != "x"; then
663          ALT_openssl_WITHVAL="$withval"
664       fi
665   ])
667 TOR_SEARCH_LIBRARY(openssl, $tryssldir, [-lssl -lcrypto $TOR_LIB_GDI],
668     [#include <openssl/rand.h>],
669     [void RAND_add(const void *buf, int num, double entropy);],
670     [RAND_add((void*)0,0,0);], [],
671     [/usr/local/openssl /usr/lib/openssl /usr/local/ssl /usr/lib/ssl /usr/local /usr/athena /opt/openssl])
673 dnl XXXX check for OPENSSL_VERSION_NUMBER == SSLeay()
675 if test "$enable_static_openssl" = "yes"; then
676    if test "$tor_cv_library_openssl_dir" = "(system)"; then
677      AC_MSG_ERROR("You must specify an explicit --with-openssl-dir=x option when using --enable-static-openssl")
678    else
679      TOR_OPENSSL_LIBS="$TOR_LIBDIR_openssl/libssl.a $TOR_LIBDIR_openssl/libcrypto.a"
680    fi
681 else
682      TOR_OPENSSL_LIBS="-lssl -lcrypto"
684 AC_SUBST(TOR_OPENSSL_LIBS)
686 dnl Now check for particular openssl functions.
687 save_LIBS="$LIBS"
688 save_LDFLAGS="$LDFLAGS"
689 save_CPPFLAGS="$CPPFLAGS"
690 LIBS="$TOR_OPENSSL_LIBS $LIBS"
691 LDFLAGS="$TOR_LDFLAGS_openssl $LDFLAGS"
692 CPPFLAGS="$TOR_CPPFLAGS_openssl $CPPFLAGS"
694 AC_TRY_COMPILE([
695 #include <openssl/opensslv.h>
696 #if OPENSSL_VERSION_NUMBER < 0x1000000fL
697 #error "too old"
698 #endif
699    ], [],
700    [ : ],
701    [ AC_ERROR([OpenSSL is too old. We require 1.0.0 or later. You can specify a path to a newer one with --with-openssl-dir.]) ])
703 AC_TRY_COMPILE([
704 #include <openssl/opensslv.h>
705 #include <openssl/evp.h>
706 #if defined(OPENSSL_NO_EC) || defined(OPENSSL_NO_ECDH) || defined(OPENSSL_NO_ECDSA)
707 #error "no ECC"
708 #endif
709 #if !defined(NID_X9_62_prime256v1) || !defined(NID_secp224r1)
710 #error "curves unavailable"
711 #endif
712    ], [],
713    [ : ],
714    [ AC_ERROR([OpenSSL is built without full ECC support, including curves P256 and P224. You can specify a path to one with ECC support with --with-openssl-dir.]) ])
716 AC_CHECK_MEMBERS([struct ssl_method_st.get_cipher_by_char], , ,
717 [#include <openssl/ssl.h>
720 AC_CHECK_FUNCS([ \
721                 SSL_SESSION_get_master_key \
722                 SSL_get_server_random \
723                 SSL_get_client_ciphers \
724                 SSL_get_client_random \
725                 SSL_CIPHER_find \
726                 TLS_method
727                ])
729 dnl Check if OpenSSL has scrypt implementation.
730 AC_CHECK_FUNCS([ EVP_PBE_scrypt ])
732 LIBS="$save_LIBS"
733 LDFLAGS="$save_LDFLAGS"
734 CPPFLAGS="$save_CPPFLAGS"
736 dnl ------------------------------------------------------
737 dnl Where do you live, zlib?  And how do we call you?
739 tor_zlib_pkg_redhat="zlib"
740 tor_zlib_pkg_debian="zlib1g"
741 tor_zlib_devpkg_redhat="zlib-devel"
742 tor_zlib_devpkg_debian="zlib1g-dev"
744 TOR_SEARCH_LIBRARY(zlib, $tryzlibdir, [-lz],
745     [#include <zlib.h>],
746     [const char * zlibVersion(void);],
747     [zlibVersion();], [--with-zlib-dir],
748     [/opt/zlib])
750 if test "$enable_static_zlib" = "yes"; then
751    if test "$tor_cv_library_zlib_dir" = "(system)"; then
752      AC_MSG_ERROR("You must specify an explicit --with-zlib-dir=x option when
753  using --enable-static-zlib")
754    else
755      TOR_ZLIB_LIBS="$TOR_LIBDIR_zlib/libz.a"
756    fi
757 else
758      TOR_ZLIB_LIBS="-lz"
760 AC_SUBST(TOR_ZLIB_LIBS)
762 dnl ----------------------------------------------------------------------
763 dnl Check if libcap is available for capabilities.
765 tor_cap_pkg_debian="libcap2"
766 tor_cap_pkg_redhat="libcap"
767 tor_cap_devpkg_debian="libcap-dev"
768 tor_cap_devpkg_redhat="libcap-devel"
770 AC_CHECK_LIB([cap], [cap_init], [],
771   AC_MSG_NOTICE([Libcap was not found. Capabilities will not be usable.])
773 AC_CHECK_FUNCS(cap_set_proc)
775 dnl ---------------------------------------------------------------------
776 dnl Now that we know about our major libraries, we can check for compiler
777 dnl and linker hardening options.  We need to do this with the libraries known,
778 dnl since sometimes the linker will like an option but not be willing to
779 dnl use it with a build of a library.
781 all_ldflags_for_check="$TOR_LDFLAGS_zlib $TOR_LDFLAGS_openssl $TOR_LDFLAGS_libevent"
782 all_libs_for_check="$TOR_ZLIB_LIBS $TOR_LIB_MATH $TOR_LIBEVENT_LIBS $TOR_OPENSSL_LIBS $TOR_SYSTEMD_LIBS $TOR_LIB_WS32 $TOR_LIB_GDI $TOR_CAP_LIBS"
784 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
785 #if !defined(__clang__)
786 #error
787 #endif])], have_clang=yes, have_clang=no)
789 if test "x$enable_gcc_hardening" != "xno"; then
790     CFLAGS="$CFLAGS -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2"
791     if test "x$have_clang" = "xyes"; then
792         TOR_CHECK_CFLAGS(-Qunused-arguments)
793     fi
794     TOR_CHECK_CFLAGS(-fstack-protector-all, also_link)
795     AS_VAR_PUSHDEF([can_compile], [tor_cv_cflags_-fstack-protector-all])
796     AS_VAR_PUSHDEF([can_link], [tor_can_link_-fstack-protector-all])
797 m4_ifdef([AS_VAR_IF],[
798     AS_VAR_IF(can_compile, [yes],
799         AS_VAR_IF(can_link, [yes],
800                   [],
801                   AC_MSG_ERROR([We tried to build with stack protection; it looks like your compiler supports it but your libc does not provide it. Are you missing libssp? (You can --disable-gcc-hardening to ignore this error.)]))
802         )])
803     AS_VAR_POPDEF([can_link])
804     AS_VAR_POPDEF([can_compile])
805     TOR_CHECK_CFLAGS(-Wstack-protector)
806     TOR_CHECK_CFLAGS(-fwrapv)
807     TOR_CHECK_CFLAGS(--param ssp-buffer-size=1)
808     if test "$bwin32" = "false"; then
809        TOR_CHECK_CFLAGS(-fPIE)
810        TOR_CHECK_LDFLAGS(-pie, "$all_ldflags_for_check", "$all_libs_for_check")
811     fi
814 if test "x$enable_expensive_hardening" = "xyes"; then
815    TOR_CHECK_CFLAGS([-fsanitize=address])
816    TOR_CHECK_CFLAGS([-fsanitize=undefined])
817    TOR_CHECK_CFLAGS([-fno-omit-frame-pointer])
820 if test "x$enable_linker_hardening" != "xno"; then
821     TOR_CHECK_LDFLAGS(-z relro -z now, "$all_ldflags_for_check", "$all_libs_for_check")
824 # For backtrace support
825 TOR_CHECK_LDFLAGS(-rdynamic)
827 dnl ------------------------------------------------------
828 dnl Now see if we have a -fomit-frame-pointer compiler option.
830 saved_CFLAGS="$CFLAGS"
831 TOR_CHECK_CFLAGS(-fomit-frame-pointer)
832 F_OMIT_FRAME_POINTER=''
833 if test "$saved_CFLAGS" != "$CFLAGS"; then
834   if test "x$enable_expensive_hardening" != "xyes"; then
835     F_OMIT_FRAME_POINTER='-fomit-frame-pointer'
836   fi
838 CFLAGS="$saved_CFLAGS"
839 AC_SUBST(F_OMIT_FRAME_POINTER)
841 dnl ------------------------------------------------------
842 dnl If we are adding -fomit-frame-pointer (or if the compiler's doing it
843 dnl for us, as GCC 4.6 and later do at many optimization levels), then
844 dnl we should try to add -fasynchronous-unwind-tables so that our backtrace
845 dnl code will work.
846 TOR_CHECK_CFLAGS(-fasynchronous-unwind-tables)
848 dnl ============================================================
849 dnl Check for libseccomp
851 if test "x$enable_seccomp" != "xno"; then
852   AC_CHECK_HEADERS([seccomp.h])
853   AC_SEARCH_LIBS(seccomp_init, [seccomp])
856 dnl ============================================================
857 dnl Check for libscrypt
859 if test "x$enable_libscrypt" != "xno"; then
860   AC_CHECK_HEADERS([libscrypt.h])
861   AC_SEARCH_LIBS(libscrypt_scrypt, [scrypt])
862   AC_CHECK_FUNCS([libscrypt_scrypt])
865 dnl ============================================================
866 dnl We need an implementation of curve25519.
868 dnl set these defaults.
869 build_curve25519_donna=no
870 build_curve25519_donna_c64=no
871 use_curve25519_donna=no
872 use_curve25519_nacl=no
873 CURVE25519_LIBS=
875 dnl The best choice is using curve25519-donna-c64, but that requires
876 dnl that we
877 AC_CACHE_CHECK([whether we can use curve25519-donna-c64],
878   tor_cv_can_use_curve25519_donna_c64,
879   [AC_RUN_IFELSE(
880     [AC_LANG_PROGRAM([dnl
881       #include <stdint.h>
882       typedef unsigned uint128_t __attribute__((mode(TI)));
883   int func(uint64_t a, uint64_t b) {
884            uint128_t c = ((uint128_t)a) * b;
885            int ok = ((uint64_t)(c>>96)) == 522859 &&
886              (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
887                  (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
888                  (((uint64_t)(c))&0xffffffffL) == 0;
889            return ok;
890       }
891   ], [dnl
892     int ok = func( ((uint64_t)2000000000) * 1000000000,
893                    ((uint64_t)1234567890) << 24);
894         return !ok;
895       ])],
896   [tor_cv_can_use_curve25519_donna_c64=yes],
897       [tor_cv_can_use_curve25519_donna_c64=no],
898   [AC_LINK_IFELSE(
899         [AC_LANG_PROGRAM([dnl
900       #include <stdint.h>
901       typedef unsigned uint128_t __attribute__((mode(TI)));
902   int func(uint64_t a, uint64_t b) {
903            uint128_t c = ((uint128_t)a) * b;
904            int ok = ((uint64_t)(c>>96)) == 522859 &&
905              (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
906                  (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
907                  (((uint64_t)(c))&0xffffffffL) == 0;
908            return ok;
909       }
910   ], [dnl
911     int ok = func( ((uint64_t)2000000000) * 1000000000,
912                  ((uint64_t)1234567890) << 24);
913         return !ok;
914       ])],
915           [tor_cv_can_use_curve25519_donna_c64=cross],
916       [tor_cv_can_use_curve25519_donna_c64=no])])])
918 AC_CHECK_HEADERS([crypto_scalarmult_curve25519.h \
919                   nacl/crypto_scalarmult_curve25519.h])
921 AC_CACHE_CHECK([for nacl compiled with a fast curve25519 implementation],
922   tor_cv_can_use_curve25519_nacl,
923   [tor_saved_LIBS="$LIBS"
924    LIBS="$LIBS -lnacl"
925    AC_LINK_IFELSE(
926      [AC_LANG_PROGRAM([dnl
927        #ifdef HAVE_CRYPTO_SCALARMULT_CURVE25519_H
928        #include <crypto_scalarmult_curve25519.h>
929    #elif defined(HAVE_NACL_CRYPTO_SCALARMULT_CURVE25519_H)
930    #include <nacl/crypto_scalarmult_curve25519.h>
931    #endif
932        #ifdef crypto_scalarmult_curve25519_ref_BYTES
933    #error Hey, this is the reference implementation! That's not fast.
934    #endif
935      ], [
936    unsigned char *a, *b, *c; crypto_scalarmult_curve25519(a,b,c);
937      ])], [tor_cv_can_use_curve25519_nacl=yes],
938      [tor_cv_can_use_curve25519_nacl=no])
939    LIBS="$tor_saved_LIBS" ])
941  dnl Okay, now we need to figure out which one to actually use. Fall back
942  dnl to curve25519-donna.c
944  if test "x$tor_cv_can_use_curve25519_donna_c64" != "xno"; then
945    build_curve25519_donna_c64=yes
946    use_curve25519_donna=yes
947  elif test "x$tor_cv_can_use_curve25519_nacl" = "xyes"; then
948    use_curve25519_nacl=yes
949    CURVE25519_LIBS=-lnacl
950  else
951    build_curve25519_donna=yes
952    use_curve25519_donna=yes
953  fi
955 if test "x$use_curve25519_donna" = "xyes"; then
956   AC_DEFINE(USE_CURVE25519_DONNA, 1,
957             [Defined if we should use an internal curve25519_donna{,_c64} implementation])
959 if test "x$use_curve25519_nacl" = "xyes"; then
960   AC_DEFINE(USE_CURVE25519_NACL, 1,
961             [Defined if we should use a curve25519 from nacl])
963 AM_CONDITIONAL(BUILD_CURVE25519_DONNA,
964   test "x$build_curve25519_donna" = "xyes")
965 AM_CONDITIONAL(BUILD_CURVE25519_DONNA_C64,
966   test "x$build_curve25519_donna_c64" = "xyes")
967 AC_SUBST(CURVE25519_LIBS)
969 dnl Make sure to enable support for large off_t if available.
970 AC_SYS_LARGEFILE
972 AC_CHECK_HEADERS(
973         assert.h \
974         errno.h \
975         fcntl.h \
976         signal.h \
977         string.h \
978         sys/capability.h \
979         sys/fcntl.h \
980         sys/stat.h \
981         sys/time.h \
982         sys/types.h \
983         time.h \
984         unistd.h
985  , , 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.))
987 dnl These headers are not essential
989 AC_CHECK_HEADERS(
990         arpa/inet.h \
991         crt_externs.h \
992         execinfo.h \
993         grp.h \
994         ifaddrs.h \
995         inttypes.h \
996         limits.h \
997         linux/types.h \
998         machine/limits.h \
999         malloc.h \
1000         malloc/malloc.h \
1001         malloc_np.h \
1002         netdb.h \
1003         netinet/in.h \
1004         netinet/in6.h \
1005         pwd.h \
1006         readpassphrase.h \
1007         stdint.h \
1008         sys/eventfd.h \
1009         sys/file.h \
1010         sys/ioctl.h \
1011         sys/limits.h \
1012         sys/mman.h \
1013         sys/param.h \
1014         sys/prctl.h \
1015         sys/resource.h \
1016         sys/select.h \
1017         sys/socket.h \
1018         sys/statvfs.h \
1019         sys/syscall.h \
1020         sys/sysctl.h \
1021         sys/syslimits.h \
1022         sys/time.h \
1023         sys/types.h \
1024         sys/un.h \
1025         sys/utime.h \
1026         sys/wait.h \
1027         syslog.h \
1028         utime.h
1031 AC_CHECK_HEADERS(sys/param.h)
1033 AC_CHECK_HEADERS(net/if.h, net_if_found=1, net_if_found=0,
1034 [#ifdef HAVE_SYS_TYPES_H
1035 #include <sys/types.h>
1036 #endif
1037 #ifdef HAVE_SYS_SOCKET_H
1038 #include <sys/socket.h>
1039 #endif])
1040 AC_CHECK_HEADERS(net/pfvar.h, net_pfvar_found=1, net_pfvar_found=0,
1041 [#ifdef HAVE_SYS_TYPES_H
1042 #include <sys/types.h>
1043 #endif
1044 #ifdef HAVE_SYS_SOCKET_H
1045 #include <sys/socket.h>
1046 #endif
1047 #ifdef HAVE_NET_IF_H
1048 #include <net/if.h>
1049 #endif
1050 #ifdef HAVE_NETINET_IN_H
1051 #include <netinet/in.h>
1052 #endif])
1054 AC_CHECK_HEADERS(linux/if.h,[],[],
1056 #ifdef HAVE_SYS_SOCKET_H
1057 #include <sys/socket.h>
1058 #endif
1061 AC_CHECK_HEADERS(linux/netfilter_ipv4.h,
1062         linux_netfilter_ipv4=1, linux_netfilter_ipv4=0,
1063 [#ifdef HAVE_SYS_TYPES_H
1064 #include <sys/types.h>
1065 #endif
1066 #ifdef HAVE_SYS_SOCKET_H
1067 #include <sys/socket.h>
1068 #endif
1069 #ifdef HAVE_LIMITS_H
1070 #include <limits.h>
1071 #endif
1072 #ifdef HAVE_LINUX_TYPES_H
1073 #include <linux/types.h>
1074 #endif
1075 #ifdef HAVE_NETINET_IN6_H
1076 #include <netinet/in6.h>
1077 #endif
1078 #ifdef HAVE_NETINET_IN_H
1079 #include <netinet/in.h>
1080 #endif])
1082 AC_CHECK_HEADERS(linux/netfilter_ipv6/ip6_tables.h,
1083         linux_netfilter_ipv6_ip6_tables=1, linux_netfilter_ipv6_ip6_tables=0,
1084 [#ifdef HAVE_SYS_TYPES_H
1085 #include <sys/types.h>
1086 #endif
1087 #ifdef HAVE_SYS_SOCKET_H
1088 #include <sys/socket.h>
1089 #endif
1090 #ifdef HAVE_LIMITS_H
1091 #include <limits.h>
1092 #endif
1093 #ifdef HAVE_LINUX_TYPES_H
1094 #include <linux/types.h>
1095 #endif
1096 #ifdef HAVE_NETINET_IN6_H
1097 #include <netinet/in6.h>
1098 #endif
1099 #ifdef HAVE_NETINET_IN_H
1100 #include <netinet/in.h>
1101 #endif
1102 #ifdef HAVE_LINUX_IF_H
1103 #include <linux/if.h>
1104 #endif])
1106 if test "x$transparent" = "xtrue"; then
1107    transparent_ok=0
1108    if test "x$net_if_found" = "x1" && test "x$net_pfvar_found" = "x1"; then
1109      transparent_ok=1
1110    fi
1111    if test "x$linux_netfilter_ipv4" = "x1"; then
1112      transparent_ok=1
1113    fi
1114    if test "x$linux_netfilter_ipv6_ip6_tables" = "x1"; then
1115      transparent_ok=1
1116    fi
1117    if test "x$transparent_ok" = "x1"; then
1118      AC_DEFINE(USE_TRANSPARENT, 1, "Define to enable transparent proxy support")
1119      case "$host" in
1120        *-*-openbsd* | *-*-bitrig*)
1121          AC_DEFINE(OPENBSD, 1, "Define to handle pf on OpenBSD properly") ;;
1122      esac
1123    else
1124      AC_MSG_NOTICE([Transparent proxy support enabled, but missing headers.])
1125    fi
1128 AC_CHECK_MEMBERS([struct timeval.tv_sec], , ,
1129 [#ifdef HAVE_SYS_TYPES_H
1130 #include <sys/types.h>
1131 #endif
1132 #ifdef HAVE_SYS_TIME_H
1133 #include <sys/time.h>
1134 #endif])
1136 dnl In case we aren't given a working stdint.h, we'll need to grow our own.
1137 dnl Watch out.
1139 AC_CHECK_SIZEOF(int8_t)
1140 AC_CHECK_SIZEOF(int16_t)
1141 AC_CHECK_SIZEOF(int32_t)
1142 AC_CHECK_SIZEOF(int64_t)
1143 AC_CHECK_SIZEOF(uint8_t)
1144 AC_CHECK_SIZEOF(uint16_t)
1145 AC_CHECK_SIZEOF(uint32_t)
1146 AC_CHECK_SIZEOF(uint64_t)
1147 AC_CHECK_SIZEOF(intptr_t)
1148 AC_CHECK_SIZEOF(uintptr_t)
1150 dnl AC_CHECK_TYPES([int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t, uint64_t, intptr_t, uintptr_t])
1152 AC_CHECK_SIZEOF(char)
1153 AC_CHECK_SIZEOF(short)
1154 AC_CHECK_SIZEOF(int)
1155 AC_CHECK_SIZEOF(long)
1156 AC_CHECK_SIZEOF(long long)
1157 AC_CHECK_SIZEOF(__int64)
1158 AC_CHECK_SIZEOF(void *)
1159 AC_CHECK_SIZEOF(time_t)
1160 AC_CHECK_SIZEOF(size_t)
1161 AC_CHECK_SIZEOF(pid_t)
1163 AC_CHECK_TYPES([uint, u_char, ssize_t])
1165 AC_PC_FROM_UCONTEXT([:])
1167 dnl used to include sockaddr_storage, but everybody has that.
1168 AC_CHECK_TYPES([struct in6_addr, struct sockaddr_in6, sa_family_t], , ,
1169 [#ifdef HAVE_SYS_TYPES_H
1170 #include <sys/types.h>
1171 #endif
1172 #ifdef HAVE_NETINET_IN_H
1173 #include <netinet/in.h>
1174 #endif
1175 #ifdef HAVE_NETINET_IN6_H
1176 #include <netinet/in6.h>
1177 #endif
1178 #ifdef HAVE_SYS_SOCKET_H
1179 #include <sys/socket.h>
1180 #endif
1181 #ifdef _WIN32
1182 #define _WIN32_WINNT 0x0501
1183 #define WIN32_LEAN_AND_MEAN
1184 #include <winsock2.h>
1185 #include <ws2tcpip.h>
1186 #endif
1188 AC_CHECK_MEMBERS([struct in6_addr.s6_addr32, struct in6_addr.s6_addr16, struct sockaddr_in.sin_len, struct sockaddr_in6.sin6_len], , ,
1189 [#ifdef HAVE_SYS_TYPES_H
1190 #include <sys/types.h>
1191 #endif
1192 #ifdef HAVE_NETINET_IN_H
1193 #include <netinet/in.h>
1194 #endif
1195 #ifdef HAVE_NETINET_IN6_H
1196 #include <netinet/in6.h>
1197 #endif
1198 #ifdef HAVE_SYS_SOCKET_H
1199 #include <sys/socket.h>
1200 #endif
1201 #ifdef _WIN32
1202 #define _WIN32_WINNT 0x0501
1203 #define WIN32_LEAN_AND_MEAN
1204 #include <winsock2.h>
1205 #include <ws2tcpip.h>
1206 #endif
1209 AC_CHECK_TYPES([rlim_t], , ,
1210 [#ifdef HAVE_SYS_TYPES_H
1211 #include <sys/types.h>
1212 #endif
1213 #ifdef HAVE_SYS_TIME_H
1214 #include <sys/time.h>
1215 #endif
1216 #ifdef HAVE_SYS_RESOURCE_H
1217 #include <sys/resource.h>
1218 #endif
1221 AX_CHECK_SIGN([time_t],
1222        [ : ],
1223        [ : ], [
1224 #ifdef HAVE_SYS_TYPES_H
1225 #include <sys/types.h>
1226 #endif
1227 #ifdef HAVE_SYS_TIME_H
1228 #include <sys/time.h>
1229 #endif
1230 #ifdef HAVE_TIME_H
1231 #include <time.h>
1232 #endif
1235 if test "$ax_cv_decl_time_t_signed" = "no"; then
1236   AC_MSG_ERROR([You have an unsigned time_t; Tor does not support that. Please tell the Tor developers about your interesting platform.])
1239 AX_CHECK_SIGN([size_t],
1240        [ tor_cv_size_t_signed=yes ],
1241        [ tor_cv_size_t_signed=no ], [
1242 #ifdef HAVE_SYS_TYPES_H
1243 #include <sys/types.h>
1244 #endif
1247 if test "$ax_cv_decl_size_t_signed" = "yes"; then
1248   AC_MSG_ERROR([You have a signed size_t; that's grossly nonconformant.])
1251 AX_CHECK_SIGN([enum always],
1252        [ AC_DEFINE(ENUM_VALS_ARE_SIGNED, 1, [Define if enum is always signed]) ],
1253        [ : ], [
1254  enum always { AAA, BBB, CCC };
1257 AC_CHECK_SIZEOF(socklen_t, , [AC_INCLUDES_DEFAULT()
1258 #ifdef HAVE_SYS_SOCKET_H
1259 #include <sys/socket.h>
1260 #endif
1263 # We want to make sure that we _don't_ have a cell_t defined, like IRIX does.
1265 AC_CHECK_SIZEOF(cell_t)
1267 # Now make sure that NULL can be represented as zero bytes.
1268 AC_CACHE_CHECK([whether memset(0) sets pointers to NULL], tor_cv_null_is_zero,
1269 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1270 [[#include <stdlib.h>
1271 #include <string.h>
1272 #include <stdio.h>
1273 #ifdef HAVE_STDDEF_H
1274 #include <stddef.h>
1275 #endif
1276 int main () { char *p1,*p2; p1=NULL; memset(&p2,0,sizeof(p2));
1277 return memcmp(&p1,&p2,sizeof(char*))?1:0; }]])],
1278        [tor_cv_null_is_zero=yes],
1279        [tor_cv_null_is_zero=no],
1280        [tor_cv_null_is_zero=cross])])
1282 if test "$tor_cv_null_is_zero" = "cross"; then
1283   # Cross-compiling; let's hope that the target isn't raving mad.
1284   AC_MSG_NOTICE([Cross-compiling: we'll assume that NULL is represented as a sequence of 0-valued bytes.])
1287 if test "$tor_cv_null_is_zero" != "no"; then
1288   AC_DEFINE([NULL_REP_IS_ZERO_BYTES], 1,
1289             [Define to 1 iff memset(0) sets pointers to NULL])
1292 AC_CACHE_CHECK([whether memset(0) sets doubles to 0.0], tor_cv_dbl0_is_zero,
1293 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1294 [[#include <stdlib.h>
1295 #include <string.h>
1296 #include <stdio.h>
1297 #ifdef HAVE_STDDEF_H
1298 #include <stddef.h>
1299 #endif
1300 int main () { double d1,d2; d1=0; memset(&d2,0,sizeof(d2));
1301 return memcmp(&d1,&d2,sizeof(d1))?1:0; }]])],
1302        [tor_cv_dbl0_is_zero=yes],
1303        [tor_cv_dbl0_is_zero=no],
1304        [tor_cv_dbl0_is_zero=cross])])
1306 if test "$tor_cv_dbl0_is_zero" = "cross"; then
1307   # Cross-compiling; let's hope that the target isn't raving mad.
1308   AC_MSG_NOTICE([Cross-compiling: we'll assume that 0.0 can be represented as a sequence of 0-valued bytes.])
1311 if test "$tor_cv_dbl0_is_zero" != "no"; then
1312   AC_DEFINE([DOUBLE_0_REP_IS_ZERO_BYTES], 1,
1313             [Define to 1 iff memset(0) sets doubles to 0.0])
1316 # And what happens when we malloc zero?
1317 AC_CACHE_CHECK([whether we can malloc(0) safely.], tor_cv_malloc_zero_works,
1318 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1319 [[#include <stdlib.h>
1320 #include <string.h>
1321 #include <stdio.h>
1322 #ifdef HAVE_STDDEF_H
1323 #include <stddef.h>
1324 #endif
1325 int main () { return malloc(0)?0:1; }]])],
1326        [tor_cv_malloc_zero_works=yes],
1327        [tor_cv_malloc_zero_works=no],
1328        [tor_cv_malloc_zero_works=cross])])
1330 if test "$tor_cv_malloc_zero_works" = "cross"; then
1331   # Cross-compiling; let's hope that the target isn't raving mad.
1332   AC_MSG_NOTICE([Cross-compiling: we'll assume that we need to check malloc() arguments for 0.])
1335 if test "$tor_cv_malloc_zero_works" = "yes"; then
1336   AC_DEFINE([MALLOC_ZERO_WORKS], 1,
1337             [Define to 1 iff malloc(0) returns a pointer])
1340 # whether we seem to be in a 2s-complement world.
1341 AC_CACHE_CHECK([whether we are using 2s-complement arithmetic], tor_cv_twos_complement,
1342 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1343 [[int main () { int problem = ((-99) != (~99)+1);
1344 return problem ? 1 : 0; }]])],
1345        [tor_cv_twos_complement=yes],
1346        [tor_cv_twos_complement=no],
1347        [tor_cv_twos_complement=cross])])
1349 if test "$tor_cv_twos_complement" = "cross"; then
1350   # Cross-compiling; let's hope that the target isn't raving mad.
1351   AC_MSG_NOTICE([Cross-compiling: we'll assume that negative integers are represented with two's complement.])
1354 if test "$tor_cv_twos_complement" != "no"; then
1355   AC_DEFINE([USING_TWOS_COMPLEMENT], 1,
1356             [Define to 1 iff we represent negative integers with
1357              two's complement])
1360 # What does shifting a negative value do?
1361 AC_CACHE_CHECK([whether right-shift on negative values does sign-extension], tor_cv_sign_extend,
1362 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1363 [[int main () { int okay = (-60 >> 8) == -1; return okay ? 0 : 1; }]])],
1364        [tor_cv_sign_extend=yes],
1365        [tor_cv_sign_extend=no],
1366        [tor_cv_sign_extend=cross])])
1368 if test "$tor_cv_sign_extend" = "cross"; then
1369   # Cross-compiling; let's hope that the target isn't raving mad.
1370   AC_MSG_NOTICE([Cross-compiling: we'll assume that right-shifting negative integers causes sign-extension])
1373 if test "$tor_cv_sign_extend" != "no"; then
1374   AC_DEFINE([RSHIFT_DOES_SIGN_EXTEND], 1,
1375             [Define to 1 iff right-shifting a negative value performs sign-extension])
1378 # Whether we should use the dmalloc memory allocation debugging library.
1379 AC_MSG_CHECKING(whether to use dmalloc (debug memory allocation library))
1380 AC_ARG_WITH(dmalloc,
1381 AS_HELP_STRING(--with-dmalloc, [use debug memory allocation library]),
1382 [if [[ "$withval" = "yes" ]]; then
1383   dmalloc=1
1384   AC_MSG_RESULT(yes)
1385 else
1386   dmalloc=1
1387   AC_MSG_RESULT(no)
1388 fi], [ dmalloc=0; AC_MSG_RESULT(no) ]
1391 if [[ $dmalloc -eq 1 ]]; then
1392   AC_CHECK_HEADERS(dmalloc.h, , AC_MSG_ERROR(dmalloc header file not found. Do you have the development files for dmalloc installed?))
1393   AC_SEARCH_LIBS(dmalloc_malloc, [dmallocth dmalloc], , AC_MSG_ERROR(Libdmalloc library not found. If you enable it you better have it installed.))
1394   AC_DEFINE(USE_DMALLOC, 1, [Debug memory allocation library])
1395   AC_CHECK_FUNCS(dmalloc_strdup dmalloc_strndup)
1398 AC_ARG_WITH(tcmalloc,
1399 AS_HELP_STRING(--with-tcmalloc, [use tcmalloc memory allocation library]),
1400 [ tcmalloc=yes ], [ tcmalloc=no ])
1402 if test "x$tcmalloc" = "xyes"; then
1403    LDFLAGS="-ltcmalloc $LDFLAGS"
1406 using_custom_malloc=no
1407 if test "x$enable_openbsd_malloc" = "xyes"; then
1408    using_custom_malloc=yes
1410 if test "x$tcmalloc" = "xyes"; then
1411    using_custom_malloc=yes
1413 if test "$using_custom_malloc" = "no"; then
1414    AC_CHECK_FUNCS(mallinfo)
1417 # By default, we're going to assume we don't have mlockall()
1418 # bionic and other platforms have various broken mlockall subsystems.
1419 # Some systems don't have a working mlockall, some aren't linkable,
1420 # and some have it but don't declare it.
1421 AC_CHECK_FUNCS(mlockall)
1422 AC_CHECK_DECLS([mlockall], , , [
1423 #ifdef HAVE_SYS_MMAN_H
1424 #include <sys/mman.h>
1425 #endif])
1427 # Allow user to specify an alternate syslog facility
1428 AC_ARG_WITH(syslog-facility,
1429 AS_HELP_STRING(--with-syslog-facility=LOG, [syslog facility to use (default=LOG_DAEMON)]),
1430 syslog_facility="$withval", syslog_facility="LOG_DAEMON")
1431 AC_DEFINE_UNQUOTED(LOGFACILITY,$syslog_facility,[name of the syslog facility])
1432 AC_SUBST(LOGFACILITY)
1434 # Check if we have getresuid and getresgid
1435 AC_CHECK_FUNCS(getresuid getresgid)
1437 # Check for gethostbyname_r in all its glorious incompatible versions.
1438 #   (This logic is based on that in Python's configure.in)
1439 AH_TEMPLATE(HAVE_GETHOSTBYNAME_R,
1440   [Define this if you have any gethostbyname_r()])
1442 AC_CHECK_FUNC(gethostbyname_r, [
1443   AC_MSG_CHECKING([how many arguments gethostbyname_r() wants])
1444   OLD_CFLAGS=$CFLAGS
1445   CFLAGS="$CFLAGS $MY_CPPFLAGS $MY_THREAD_CPPFLAGS $MY_CFLAGS"
1446   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
1447 #include <netdb.h>
1448   ], [[
1449     char *cp1, *cp2;
1450     struct hostent *h1, *h2;
1451     int i1, i2;
1452     (void)gethostbyname_r(cp1,h1,cp2,i1,&h2,&i2);
1453   ]])],[
1454     AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1455     AC_DEFINE(HAVE_GETHOSTBYNAME_R_6_ARG, 1,
1456      [Define this if gethostbyname_r takes 6 arguments])
1457     AC_MSG_RESULT(6)
1458   ], [
1459     AC_TRY_COMPILE([
1460 #include <netdb.h>
1461     ], [
1462       char *cp1, *cp2;
1463       struct hostent *h1;
1464       int i1, i2;
1465       (void)gethostbyname_r(cp1,h1,cp2,i1,&i2);
1466     ], [
1467       AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1468       AC_DEFINE(HAVE_GETHOSTBYNAME_R_5_ARG, 1,
1469         [Define this if gethostbyname_r takes 5 arguments])
1470       AC_MSG_RESULT(5)
1471    ], [
1472       AC_TRY_COMPILE([
1473 #include <netdb.h>
1474      ], [
1475        char *cp1;
1476        struct hostent *h1;
1477        struct hostent_data hd;
1478        (void) gethostbyname_r(cp1,h1,&hd);
1479      ], [
1480        AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1481        AC_DEFINE(HAVE_GETHOSTBYNAME_R_3_ARG, 1,
1482          [Define this if gethostbyname_r takes 3 arguments])
1483        AC_MSG_RESULT(3)
1484      ], [
1485        AC_MSG_RESULT(0)
1486      ])
1487   ])
1488  ])
1489  CFLAGS=$OLD_CFLAGS
1492 AC_CACHE_CHECK([whether the C compiler supports __func__],
1493   tor_cv_have_func_macro,
1494   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1495 #include <stdio.h>
1496 int main(int c, char **v) { puts(__func__); }])],
1497   tor_cv_have_func_macro=yes,
1498   tor_cv_have_func_macro=no))
1500 AC_CACHE_CHECK([whether the C compiler supports __FUNC__],
1501   tor_cv_have_FUNC_macro,
1502   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1503 #include <stdio.h>
1504 int main(int c, char **v) { puts(__FUNC__); }])],
1505   tor_cv_have_FUNC_macro=yes,
1506   tor_cv_have_FUNC_macro=no))
1508 AC_CACHE_CHECK([whether the C compiler supports __FUNCTION__],
1509   tor_cv_have_FUNCTION_macro,
1510   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1511 #include <stdio.h>
1512 int main(int c, char **v) { puts(__FUNCTION__); }])],
1513   tor_cv_have_FUNCTION_macro=yes,
1514   tor_cv_have_FUNCTION_macro=no))
1516 AC_CACHE_CHECK([whether we have extern char **environ already declared],
1517   tor_cv_have_environ_declared,
1518   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1519 /* We define _GNU_SOURCE here because it is also defined in compat.c.
1520  * Without it environ doesn't get declared. */
1521 #define _GNU_SOURCE
1522 #ifdef HAVE_UNISTD_H
1523 #include <unistd.h>
1524 #endif
1525 #include <stdlib.h>
1526 int main(int c, char **v) { char **t = environ; }])],
1527   tor_cv_have_environ_declared=yes,
1528   tor_cv_have_environ_declared=no))
1530 if test "$tor_cv_have_func_macro" = "yes"; then
1531   AC_DEFINE(HAVE_MACRO__func__, 1, [Defined if the compiler supports __func__])
1534 if test "$tor_cv_have_FUNC_macro" = "yes"; then
1535   AC_DEFINE(HAVE_MACRO__FUNC__, 1, [Defined if the compiler supports __FUNC__])
1538 if test "$tor_cv_have_FUNCTION_macro" = "yes"; then
1539   AC_DEFINE(HAVE_MACRO__FUNCTION__, 1,
1540            [Defined if the compiler supports __FUNCTION__])
1543 if test "$tor_cv_have_environ_declared" = "yes"; then
1544   AC_DEFINE(HAVE_EXTERN_ENVIRON_DECLARED, 1,
1545            [Defined if we have extern char **environ already declared])
1548 # $prefix stores the value of the --prefix command line option, or
1549 # NONE if the option wasn't set.  In the case that it wasn't set, make
1550 # it be the default, so that we can use it to expand directories now.
1551 if test "x$prefix" = "xNONE"; then
1552   prefix=$ac_default_prefix
1555 # and similarly for $exec_prefix
1556 if test "x$exec_prefix" = "xNONE"; then
1557   exec_prefix=$prefix
1560 if test "x$BUILDDIR" = "x"; then
1561   BUILDDIR=`pwd`
1563 AC_SUBST(BUILDDIR)
1564 AH_TEMPLATE([BUILDDIR],[tor's build directory])
1565 AC_DEFINE_UNQUOTED(BUILDDIR,"$BUILDDIR")
1567 if test "x$CONFDIR" = "x"; then
1568   CONFDIR=`eval echo $sysconfdir/tor`
1570 AC_SUBST(CONFDIR)
1571 AH_TEMPLATE([CONFDIR],[tor's configuration directory])
1572 AC_DEFINE_UNQUOTED(CONFDIR,"$CONFDIR")
1574 BINDIR=`eval echo $bindir`
1575 AC_SUBST(BINDIR)
1576 LOCALSTATEDIR=`eval echo $localstatedir`
1577 AC_SUBST(LOCALSTATEDIR)
1579 if test "$bwin32" = "true"; then
1580   # Test if the linker supports the --nxcompat and --dynamicbase options
1581   # for Windows
1582   save_LDFLAGS="$LDFLAGS"
1583   LDFLAGS="-Wl,--nxcompat -Wl,--dynamicbase"
1584   AC_MSG_CHECKING([whether the linker supports DllCharacteristics])
1585   AC_LINK_IFELSE([AC_LANG_PROGRAM([])],
1586     [AC_MSG_RESULT([yes])]
1587     [save_LDFLAGS="$save_LDFLAGS $LDFLAGS"],
1588     [AC_MSG_RESULT([no])]
1589   )
1590   LDFLAGS="$save_LDFLAGS"
1593 # Set CFLAGS _after_ all the above checks, since our warnings are stricter
1594 # than autoconf's macros like.
1595 if test "$GCC" = "yes"; then
1596   # Disable GCC's strict aliasing checks.  They are an hours-to-debug
1597   # accident waiting to happen.
1598   CFLAGS="$CFLAGS -Wall -fno-strict-aliasing"
1599 else
1600   # Override optimization level for non-gcc compilers
1601   CFLAGS="$CFLAGS -O"
1602   enable_gcc_warnings=no
1603   enable_gcc_warnings_advisory=no
1606 # OS X Lion started deprecating the system openssl. Let's just disable
1607 # all deprecation warnings on OS X. Also, to potentially make the binary
1608 # a little smaller, let's enable dead_strip.
1609 case "$host_os" in
1611  darwin*)
1612     CFLAGS="$CFLAGS -Wno-deprecated-declarations"
1613     LDFLAGS="$LDFLAGS -dead_strip" ;;
1614 esac
1616 # Add some more warnings which we use in development but not in the
1617 # released versions.  (Some relevant gcc versions can't handle these.)
1618 if test "x$enable_gcc_warnings" = "xyes" ||
1619   test "x$enable_gcc_warnings_advisory" = "xyes"; then
1621   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1622 #if !defined(__GNUC__) || (__GNUC__ < 4)
1623 #error
1624 #endif])], have_gcc4=yes, have_gcc4=no)
1626   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1627 #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 2)
1628 #error
1629 #endif])], have_gcc42=yes, have_gcc42=no)
1631   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1632 #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 3)
1633 #error
1634 #endif])], have_gcc43=yes, have_gcc43=no)
1636   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1637 #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 6)
1638 #error
1639 #endif])], have_gcc46=yes, have_gcc46=no)
1642   save_CFLAGS="$CFLAGS"
1643   CFLAGS="$CFLAGS -Wshorten-64-to-32"
1644   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], have_shorten64_flag=yes,
1645                     have_shorten64_flag=no)
1646   CFLAGS="$save_CFLAGS"
1648   case "$host" in
1649     *-*-openbsd* | *-*-bitrig*)
1650       # Some OpenBSD versions (like 4.8) have -Wsystem-headers by default.
1651       # That's fine, except that the headers don't pass -Wredundant-decls.
1652       # Therefore, let's disable -Wsystem-headers when we're building
1653       # with maximal warnings on OpenBSD.
1654       CFLAGS="$CFLAGS -Wno-system-headers" ;;
1655   esac
1657   CFLAGS="$CFLAGS -W -Wfloat-equal -Wundef -Wpointer-arith"
1658   CFLAGS="$CFLAGS -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings"
1659   CFLAGS="$CFLAGS -Wredundant-decls -Wchar-subscripts -Wcomment -Wformat=2"
1660   CFLAGS="$CFLAGS -Wwrite-strings -Wmissing-declarations -Wredundant-decls"
1661   CFLAGS="$CFLAGS -Wnested-externs -Wbad-function-cast -Wswitch-enum"
1663   if test "x$enable_gcc_warnings" = "xyes"; then
1664     CFLAGS="$CFLAGS -Werror"
1665   fi
1667   # Disabled, so we can use mallinfo(): -Waggregate-return
1669   if test "x$have_gcc4" = "xyes"; then
1670     # These warnings break gcc 3.3.5 and work on gcc 4.0.2
1671     CFLAGS="$CFLAGS -Winit-self -Wmissing-field-initializers -Wold-style-definition"
1672   fi
1674   if test "x$have_gcc42" = "xyes"; then
1675     # These warnings break gcc 4.0.2 and work on gcc 4.2
1676     # XXXX020 See if any of these work with earlier versions.
1677     CFLAGS="$CFLAGS -Waddress -Wmissing-noreturn -Wstrict-overflow=1"
1679     # We used to use -Wstrict-overflow=5, but that breaks us heavily under 4.3.
1680   fi
1682   if test "x$have_gcc42" = "xyes" && test "x$have_clang" = "xno"; then
1683     # These warnings break gcc 4.0.2 and clang, but work on gcc 4.2
1684     CFLAGS="$CFLAGS -Wnormalized=id -Woverride-init"
1685   fi
1687   if test "x$have_gcc43" = "xyes"; then
1688     # These warnings break gcc 4.2 and work on gcc 4.3
1689     # XXXX020 See if any of these work with earlier versions.
1690     CFLAGS="$CFLAGS -Wextra -Warray-bounds"
1691   fi
1693   if test "x$have_gcc46" = "xyes"; then
1694     # This warning was added in gcc 4.3, but it appears to generate
1695     # spurious warnings in gcc 4.4.  I don't know if it works in 4.5.
1696     CFLAGS="$CFLAGS -Wlogical-op"
1697   fi
1699   if test "x$have_shorten64_flag" = "xyes"; then
1700     CFLAGS="$CFLAGS -Wshorten-64-to-32"
1701   fi
1705 ##This will break the world on some 64-bit architectures
1706 # CFLAGS="$CFLAGS -Winline"
1709 if test "$enable_coverage" = "yes" && test "$have_clang" = "no"; then
1710    case "$host_os" in
1711     darwin*)
1712       AC_MSG_WARN([Tried to enable coverage on OSX without using the clang compiler. This might not work! If coverage fails, use CC=clang when configuring with --enable-profiling.])
1713    esac
1716 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent $TOR_CPPFLAGS_openssl $TOR_CPPFLAGS_zlib"
1718 AC_CONFIG_FILES([
1719         Doxyfile
1720         Makefile
1721         contrib/dist/suse/tor.sh
1722         contrib/operator-tools/tor.logrotate
1723         contrib/dist/tor.sh
1724         contrib/dist/torctl
1725         contrib/dist/tor.service
1726         src/config/torrc.sample
1727         src/config/torrc.minimal
1728         scripts/maint/checkOptionDocs.pl
1729         scripts/maint/updateVersions.pl
1732 if test "x$asciidoc" = "xtrue" && test "$ASCIIDOC" = "none"; then
1733   regular_mans="doc/tor doc/tor-gencert doc/tor-resolve doc/torify"
1734   for file in $regular_mans ; do
1735     if ! [[ -f "$srcdir/$file.1.in" ]] || ! [[ -f "$srcdir/$file.html.in" ]] ; then
1736       echo "==================================";
1737       echo;
1738       echo "Building Tor has failed since manpages cannot be built.";
1739       echo;
1740       echo "You need asciidoc installed to be able to build the manpages.";
1741       echo "To build without manpages, use the --disable-asciidoc argument";
1742       echo "when calling configure.";
1743       echo;
1744       echo "==================================";
1745       exit 1;
1746     fi
1747   done
1750 AC_OUTPUT