Add the poll() syscall as permitted by the sandbox
[tor.git] / configure.ac
blob15ecbe60e1bdad45328b55717a5b669e64a0e36f
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.9.15-dev])
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_USE_SYSTEM_EXTENSIONS
20 AC_CANONICAL_HOST
22 PKG_PROG_PKG_CONFIG
24 if test -f "/etc/redhat-release"; then
25   if test -f "/usr/kerberos/include"; then
26     CPPFLAGS="$CPPFLAGS -I/usr/kerberos/include"
27   fi
30 # Not a no-op; we want to make sure that CPPFLAGS is set before we use
31 # the += operator on it in src/or/Makefile.am
32 CPPFLAGS="$CPPFLAGS -I\${top_srcdir}/src/common"
34 AC_ARG_ENABLE(openbsd-malloc,
35    AS_HELP_STRING(--enable-openbsd-malloc, [use malloc code from OpenBSD.  Linux only]))
36 AC_ARG_ENABLE(static-openssl,
37    AS_HELP_STRING(--enable-static-openssl, [link against a static openssl library. Requires --with-openssl-dir]))
38 AC_ARG_ENABLE(static-libevent,
39    AS_HELP_STRING(--enable-static-libevent, [link against a static libevent library. Requires --with-libevent-dir]))
40 AC_ARG_ENABLE(static-zlib,
41    AS_HELP_STRING(--enable-static-zlib, [link against a static zlib library. Requires --with-zlib-dir]))
42 AC_ARG_ENABLE(static-tor,
43    AS_HELP_STRING(--enable-static-tor, [create an entirely static Tor binary. Requires --with-openssl-dir and --with-libevent-dir and --with-zlib-dir]))
44 AC_ARG_ENABLE(unittests,
45    AS_HELP_STRING(--disable-unittests, [don't build unit tests for Tor. Risky!]))
46 AC_ARG_ENABLE(coverage,
47    AS_HELP_STRING(--enable-coverage, [enable coverage support in the unit-test build]))
48 AC_ARG_ENABLE(asserts-in-tests,
49    AS_HELP_STRING(--disable-asserts-in-tests, [disable tor_assert() calls in the unit tests, for branch coverage]))
50 AC_ARG_ENABLE(system-torrc,
51    AS_HELP_STRING(--disable-system-torrc, [don't look for a system-wide torrc file]))
53 if test "x$enable_coverage" != "xyes" -a "x$enable_asserts_in_tests" = "xno" ; then
54     AC_MSG_ERROR([Can't disable assertions outside of coverage build])
57 AM_CONDITIONAL(UNITTESTS_ENABLED, test "x$enable_unittests" != "xno")
58 AM_CONDITIONAL(COVERAGE_ENABLED, test "x$enable_coverage" = "xyes")
59 AM_CONDITIONAL(DISABLE_ASSERTS_IN_UNIT_TESTS, test "x$enable_asserts_in_tests" = "xno")
61 if test "$enable_static_tor" = "yes"; then
62   enable_static_libevent="yes";
63   enable_static_openssl="yes";
64   enable_static_zlib="yes";
65   CFLAGS="$CFLAGS -static"
68 if test "$enable_system_torrc" = "no"; then
69   AC_DEFINE(DISABLE_SYSTEM_TORRC, 1,
70             [Defined if we're not going to look for a torrc in SYSCONF])
73 AM_CONDITIONAL(USE_OPENBSD_MALLOC, test "x$enable_openbsd_malloc" = "xyes")
75 AC_ARG_ENABLE(asciidoc,
76      AS_HELP_STRING(--disable-asciidoc, [don't use asciidoc (disables building of manpages)]),
77      [case "${enableval}" in
78         "yes") asciidoc=true ;;
79         "no")  asciidoc=false ;;
80         *) AC_MSG_ERROR(bad value for --disable-asciidoc) ;;
81       esac], [asciidoc=true])
83 # systemd notify support
84 AC_ARG_ENABLE(systemd,
85       AS_HELP_STRING(--enable-systemd, [enable systemd notification support]),
86       [case "${enableval}" in
87         "yes") systemd=true ;;
88         "no")  systemd=false ;;
89         * ) AC_MSG_ERROR(bad value for --enable-systemd) ;;
90       esac], [systemd=auto])
94 # systemd support
95 if test "x$enable_systemd" = "xno"; then
96     have_systemd=no;
97 else
98     PKG_CHECK_MODULES(SYSTEMD,
99         [libsystemd-daemon],
100         have_systemd=yes,
101         have_systemd=no)
102     if test "x$have_systemd" = "xno"; then
103         AC_MSG_NOTICE([Okay, checking for systemd a different way...])
104         PKG_CHECK_MODULES(SYSTEMD,
105             [libsystemd],
106             have_systemd=yes,
107             have_systemd=no)
108     fi
111 if test "x$have_systemd" = "xyes"; then
112     AC_DEFINE(HAVE_SYSTEMD,1,[Have systemd])
113     TOR_SYSTEMD_CFLAGS="${SYSTEMD_CFLAGS}"
114     TOR_SYSTEMD_LIBS="${SYSTEMD_LIBS}"
115     PKG_CHECK_MODULES(LIBSYSTEMD209, [libsystemd >= 209],
116          [AC_DEFINE(HAVE_SYSTEMD_209,1,[Have systemd v209 or more])], [])
118 AC_SUBST(TOR_SYSTEMD_CFLAGS)
119 AC_SUBST(TOR_SYSTEMD_LIBS)
121 if test "x$enable_systemd" = "xyes" -a "x$have_systemd" != "xyes" ; then
122     AC_MSG_ERROR([Explicitly requested systemd support, but systemd not found])
125 case "$host" in
126    *-*-solaris* )
127      AC_DEFINE(_REENTRANT, 1, [Define on some platforms to activate x_r() functions in time.h])
128      ;;
129 esac
131 AC_ARG_ENABLE(gcc-warnings,
132      AS_HELP_STRING(--enable-gcc-warnings, [deprecated alias for enable-fatal-warnings]))
133 AC_ARG_ENABLE(fatal-warnings,
134      AS_HELP_STRING(--enable-fatal-warnings, [tell the compiler to treat all warnings as errors.]))
135 AC_ARG_ENABLE(gcc-warnings-advisory,
136      AS_HELP_STRING(--disable-gcc-warnings-advisory, [disable the regular verbose warnings]))
138 dnl Others suggest '/gs /safeseh /nxcompat /dynamicbase' for non-gcc on Windows
139 AC_ARG_ENABLE(gcc-hardening,
140     AS_HELP_STRING(--disable-gcc-hardening, [disable compiler security checks]))
142 AC_ARG_ENABLE(expensive-hardening,
143     AS_HELP_STRING(--enable-expensive-hardening, [enable more expensive compiler hardening; makes Tor slower]))
145 dnl Linker hardening options
146 dnl Currently these options are ELF specific - you can't use this with MacOSX
147 AC_ARG_ENABLE(linker-hardening,
148     AS_HELP_STRING(--disable-linker-hardening, [disable linker security fixups]))
150 AC_ARG_ENABLE(local-appdata,
151    AS_HELP_STRING(--enable-local-appdata, [default to host local application data paths on Windows]))
152 if test "$enable_local_appdata" = "yes"; then
153   AC_DEFINE(ENABLE_LOCAL_APPDATA, 1,
154             [Defined if we default to host local appdata paths on Windows])
157 # Tor2web mode flag
158 AC_ARG_ENABLE(tor2web-mode,
159      AS_HELP_STRING(--enable-tor2web-mode, [support tor2web non-anonymous mode]),
160 [if test "x$enableval" = "xyes"; then
161     CFLAGS="$CFLAGS -D ENABLE_TOR2WEB_MODE=1"
162 fi])
164 AC_ARG_ENABLE(tool-name-check,
165      AS_HELP_STRING(--disable-tool-name-check, [check for sanely named toolchain when cross-compiling]))
167 AC_ARG_ENABLE(seccomp,
168      AS_HELP_STRING(--disable-seccomp, [do not attempt to use libseccomp]))
170 AC_ARG_ENABLE(libscrypt,
171      AS_HELP_STRING(--disable-libscrypt, [do not attempt to use libscrypt]))
173 dnl check for the correct "ar" when cross-compiling
174 AN_MAKEVAR([AR], [AC_PROG_AR])
175 AN_PROGRAM([ar], [AC_PROG_AR])
176 AC_DEFUN([AC_PROG_AR], [AC_CHECK_TOOL([AR], [ar], [ar])])
177 AC_PROG_AR
179 dnl Check whether the above macro has settled for a simply named tool even
180 dnl though we're cross compiling. We must do this before running AC_PROG_CC,
181 dnl because that will find any cc on the system, not only the cross-compiler,
182 dnl and then verify that a binary built with this compiler runs on the
183 dnl build system. It will then come to the false conclusion that we're not
184 dnl cross-compiling.
185 if test "x$enable_tool_name_check" != "xno"; then
186     if test "x$ac_tool_warned" = "xyes"; then
187         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.)])
188         elif test "x$ac_ct_AR" != "x" -a "x$cross_compiling" = "xmaybe"; then
189                 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.)])
190         fi
193 AC_PROG_CC
194 AC_PROG_CPP
195 AC_PROG_MAKE_SET
196 AC_PROG_RANLIB
198 AC_PATH_PROG([PERL], [perl])
200 dnl autoconf 2.59 appears not to support AC_PROG_SED
201 AC_CHECK_PROG([SED],[sed],[sed],[/bin/false])
203 dnl check for asciidoc and a2x
204 AC_PATH_PROG([ASCIIDOC], [asciidoc], none)
205 AC_PATH_PROGS([A2X], [a2x a2x.py], none)
207 AM_CONDITIONAL(USE_ASCIIDOC, test "x$asciidoc" = "xtrue")
209 AM_CONDITIONAL(USE_FW_HELPER, test "x$natpmp" = "xtrue" || test "x$upnp" = "xtrue")
210 AM_CONDITIONAL(NAT_PMP, test "x$natpmp" = "xtrue")
211 AM_CONDITIONAL(MINIUPNPC, test "x$upnp" = "xtrue")
212 AM_PROG_CC_C_O
213 AC_PROG_CC_C99
215 AC_ARG_VAR([PYTHON], [path to Python binary])
216 AC_CHECK_PROGS(PYTHON, [python python2 python2.7 python3 python3.3])
217 if test "x$PYTHON" = "x"; then
218   AC_MSG_WARN([Python unavailable; some tests will not be run.])
220 AM_CONDITIONAL(USEPYTHON, [test "x$PYTHON" != "x"])
222 ifdef([AC_C_FLEXIBLE_ARRAY_MEMBER], [
223 AC_C_FLEXIBLE_ARRAY_MEMBER
224 ], [
225  dnl Maybe we've got an old autoconf...
226  AC_CACHE_CHECK([for flexible array members],
227      tor_cv_c_flexarray,
228      [AC_COMPILE_IFELSE(
229        AC_LANG_PROGRAM([
230  struct abc { int a; char b[]; };
231 ], [
232  struct abc *def = malloc(sizeof(struct abc)+sizeof(char));
233  def->b[0] = 33;
235   [tor_cv_c_flexarray=yes],
236   [tor_cv_c_flexarray=no])])
237  if test "$tor_cv_flexarray" = "yes"; then
238    AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [], [Define to nothing if C supports flexible array members, and to 1 if it does not.])
239  else
240    AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [1], [Define to nothing if C supports flexible array members, and to 1 if it does not.])
241  fi
244 AC_CACHE_CHECK([for working C99 mid-block declaration syntax],
245       tor_cv_c_c99_decl,
246       [AC_COMPILE_IFELSE(
247          [AC_LANG_PROGRAM([], [int x; x = 3; int y; y = 4 + x;])],
248          [tor_cv_c_c99_decl=yes],
249          [tor_cv_c_c99_decl=no] )])
250 if test "$tor_cv_c_c99_decl" != "yes"; then
251   AC_MSG_ERROR([Your compiler doesn't support c99 mid-block declarations. This is required as of Tor 0.2.6.x])
254 AC_CACHE_CHECK([for working C99 designated initializers],
255       tor_cv_c_c99_designated_init,
256       [AC_COMPILE_IFELSE(
257          [AC_LANG_PROGRAM([struct s { int a; int b; };],
258                [[ struct s ss = { .b = 5, .a = 6 }; ]])],
259          [tor_cv_c_c99_designated_init=yes],
260          [tor_cv_c_c99_designated_init=no] )])
262 if test "$tor_cv_c_c99_designated_init" != "yes"; then
263   AC_MSG_ERROR([Your compiler doesn't support c99 designated initializers. This is required as of Tor 0.2.6.x])
266 TORUSER=_tor
267 AC_ARG_WITH(tor-user,
268         AS_HELP_STRING(--with-tor-user=NAME, [specify username for tor daemon]),
269         [
270            TORUSER=$withval
271         ]
273 AC_SUBST(TORUSER)
275 TORGROUP=_tor
276 AC_ARG_WITH(tor-group,
277         AS_HELP_STRING(--with-tor-group=NAME, [specify group name for tor daemon]),
278         [
279            TORGROUP=$withval
280         ]
282 AC_SUBST(TORGROUP)
285 dnl If _WIN32 is defined and non-zero, we are building for win32
286 AC_MSG_CHECKING([for win32])
287 AC_RUN_IFELSE([AC_LANG_SOURCE([
288 int main(int c, char **v) {
289 #ifdef _WIN32
290 #if _WIN32
291   return 0;
292 #else
293   return 1;
294 #endif
295 #else
296   return 2;
297 #endif
298 }])],
299 bwin32=true; AC_MSG_RESULT([yes]),
300 bwin32=false; AC_MSG_RESULT([no]),
301 bwin32=cross; AC_MSG_RESULT([cross])
304 if test "$bwin32" = "cross"; then
305 AC_MSG_CHECKING([for win32 (cross)])
306 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
307 #ifdef _WIN32
308 int main(int c, char **v) {return 0;}
309 #else
310 #error
311 int main(int c, char **v) {return x(y);}
312 #endif
313 ])],
314 bwin32=true; AC_MSG_RESULT([yes]),
315 bwin32=false; AC_MSG_RESULT([no]))
318 AH_BOTTOM([
319 #ifdef _WIN32
320 /* Defined to access windows functions and definitions for >=WinXP */
321 # ifndef WINVER
322 #  define WINVER 0x0501
323 # endif
325 /* Defined to access _other_ windows functions and definitions for >=WinXP */
326 # ifndef _WIN32_WINNT
327 #  define _WIN32_WINNT 0x0501
328 # endif
330 /* Defined to avoid including some windows headers as part of Windows.h */
331 # ifndef WIN32_LEAN_AND_MEAN
332 #  define WIN32_LEAN_AND_MEAN 1
333 # endif
334 #endif
338 AM_CONDITIONAL(BUILD_NT_SERVICES, test "x$bwin32" = "xtrue")
340 dnl Enable C99 when compiling with MIPSpro
341 AC_MSG_CHECKING([for MIPSpro compiler])
342 AC_COMPILE_IFELSE([AC_LANG_PROGRAM(, [
343 #if (defined(__sgi) && defined(_COMPILER_VERSION))
344 #error
345   return x(y);
346 #endif
347 ])],
348 bmipspro=false; AC_MSG_RESULT(no),
349 bmipspro=true; AC_MSG_RESULT(yes))
351 if test "$bmipspro" = "true"; then
352   CFLAGS="$CFLAGS -c99"
355 AC_C_BIGENDIAN
357 AC_SEARCH_LIBS(socket, [socket network])
358 AC_SEARCH_LIBS(gethostbyname, [nsl])
359 AC_SEARCH_LIBS(dlopen, [dl])
360 AC_SEARCH_LIBS(inet_aton, [resolv])
361 AC_SEARCH_LIBS(backtrace, [execinfo])
362 saved_LIBS="$LIBS"
363 AC_SEARCH_LIBS([clock_gettime], [rt])
364 if test "$LIBS" != "$saved_LIBS"; then
365    # Looks like we need -lrt for clock_gettime().
366    have_rt=yes
369 AC_SEARCH_LIBS(pthread_create, [pthread])
370 AC_SEARCH_LIBS(pthread_detach, [pthread])
372 AM_CONDITIONAL(THREADS_WIN32, test "$bwin32" = "true")
373 AM_CONDITIONAL(THREADS_PTHREADS, test "$bwin32" = "false")
375 AC_CHECK_FUNCS(
376         _NSGetEnviron \
377         RtlSecureZeroMemory \
378         SecureZeroMemory \
379         accept4 \
380         backtrace \
381         backtrace_symbols_fd \
382         eventfd \
383         explicit_bzero \
384         timingsafe_memcmp \
385         flock \
386         ftime \
387         getaddrinfo \
388         getifaddrs \
389         getpass \
390         getrlimit \
391         gettimeofday \
392         gmtime_r \
393         gnu_get_libc_version \
394         htonll \
395         inet_aton \
396         ioctl \
397         issetugid \
398         llround \
399         localtime_r \
400         lround \
401         memmem \
402         memset_s \
403         pipe \
404         pipe2 \
405         prctl \
406         readpassphrase \
407         rint \
408         sigaction \
409         socketpair \
410         statvfs \
411         strlcat \
412         strlcpy \
413         strnlen \
414         strptime \
415         strtok_r \
416         strtoull \
417         sysconf \
418         sysctl \
419         truncate \
420         uname \
421         usleep \
422         vasprintf \
423         _vscprintf
426 # Apple messed up when they added two functions functions in Sierra: they
427 # forgot to decorate them with appropriate AVAILABLE_MAC_OS_VERSION
428 # checks. So we should only probe for those functions if we are sure that we
429 # are not targetting OSX 10.11 or earlier.
430 AC_MSG_CHECKING([for a pre-Sierra OSX build target])
431 AC_TRY_COMPILE([
432 #ifdef __APPLE__
433 #  include <AvailabilityMacros.h>
434 #  ifndef MAC_OS_X_VERSION_10_12
435 #    define MAC_OS_X_VERSION_10_12 101200
436 #  endif
437 #  if defined(MAC_OS_X_VERSION_MIN_REQUIRED)
438 #    if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_12
439 #      error "Running on Mac OSX 10.11 or earlier"
440 #    endif
441 #  endif
442 #endif
443 ], [],
444    [on_macos_pre_10_12=no ; AC_MSG_RESULT([no])],
445    [on_macos_pre_10_12=yes; AC_MSG_RESULT([yes])])
447 if test "$on_macos_pre_10_12" = "no"; then
448   AC_CHECK_FUNCS(
449         clock_gettime \
450         getentropy \
451   )
454 if test "$bwin32" != "true"; then
455   AC_CHECK_HEADERS(pthread.h)
456   AC_CHECK_FUNCS(pthread_create)
457   AC_CHECK_FUNCS(pthread_condattr_setclock)
460 if test "$bwin32" = "true"; then
461   AC_CHECK_DECLS([SecureZeroMemory, _getwch], , , [
462 #include <windows.h>
463 #include <conio.h>
464 #include <wchar.h>
465                  ])
468 AM_CONDITIONAL(BUILD_READPASSPHRASE_C,
469   test "x$ac_cv_func_readpassphrase" = "xno" && test "$bwin32" = "false")
471 dnl ------------------------------------------------------
472 dnl Where do you live, libevent?  And how do we call you?
474 if test "$bwin32" = "true"; then
475   TOR_LIB_WS32=-lws2_32
476   TOR_LIB_IPHLPAPI=-liphlpapi
477   # Some of the cargo-cults recommend -lwsock32 as well, but I don't
478   # think it's actually necessary.
479   TOR_LIB_GDI=-lgdi32
480 else
481   TOR_LIB_WS32=
482   TOR_LIB_GDI=
484 AC_SUBST(TOR_LIB_WS32)
485 AC_SUBST(TOR_LIB_GDI)
486 AC_SUBST(TOR_LIB_IPHLPAPI)
488 tor_libevent_pkg_redhat="libevent"
489 tor_libevent_pkg_debian="libevent-dev"
490 tor_libevent_devpkg_redhat="libevent-devel"
491 tor_libevent_devpkg_debian="libevent-dev"
493 dnl On Gnu/Linux or any place we require it, we'll add librt to the Libevent
494 dnl linking for static builds.
495 STATIC_LIBEVENT_FLAGS=""
496 if test "$enable_static_libevent" = "yes"; then
497     if test "$have_rt" = "yes"; then
498       STATIC_LIBEVENT_FLAGS=" -lrt "
499     fi
502 TOR_SEARCH_LIBRARY(libevent, $trylibeventdir, [-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32], [
503 #ifdef _WIN32
504 #include <winsock2.h>
505 #endif
506 #include <sys/time.h>
507 #include <sys/types.h>
508 #include <event2/event.h>], [
509 #ifdef _WIN32
510 #include <winsock2.h>
511 #endif
512 struct event_base;
513 struct event_base *event_base_new(void);],
514     [
515 #ifdef _WIN32
516 {WSADATA d; WSAStartup(0x101,&d); }
517 #endif
518 event_base_new();
519 ], [--with-libevent-dir], [/opt/libevent])
521 dnl Determine the incantation needed to link libevent.
522 save_LIBS="$LIBS"
523 save_LDFLAGS="$LDFLAGS"
524 save_CPPFLAGS="$CPPFLAGS"
526 LIBS="$STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32 $save_LIBS"
527 LDFLAGS="$TOR_LDFLAGS_libevent $LDFLAGS"
528 CPPFLAGS="$TOR_CPPFLAGS_libevent $CPPFLAGS"
530 AC_CHECK_HEADERS(event2/event.h event2/dns.h event2/bufferevent_ssl.h)
532 if test "$enable_static_libevent" = "yes"; then
533    if test "$tor_cv_library_libevent_dir" = "(system)"; then
534      AC_MSG_ERROR("You must specify an explicit --with-libevent-dir=x option when using --enable-static-libevent")
535    else
536      TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent.a $STATIC_LIBEVENT_FLAGS"
537    fi
538 else
539      if test "x$ac_cv_header_event2_event_h" = "xyes"; then
540        AC_SEARCH_LIBS(event_new, [event event_core], , AC_MSG_ERROR("libevent2 is installed but linking it failed while searching for event_new"))
541        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"))
543        if test "$ac_cv_search_event_new" != "none required"; then
544          TOR_LIBEVENT_LIBS="$ac_cv_search_event_new"
545        fi
546        if test "$ac_cv_search_evdns_base_new" != "none required"; then
547          TOR_LIBEVENT_LIBS="$ac_cv_search_evdns_base_new $TOR_LIBEVENT_LIBS"
548        fi
549      else
550        AC_MSG_ERROR("libevent2 is required but the headers could not be found")
551      fi
554 dnl Now check for particular libevent functions.
555 AC_CHECK_FUNCS([evutil_secure_rng_set_urandom_device_file \
556                 evutil_secure_rng_add_bytes \
559 LIBS="$save_LIBS"
560 LDFLAGS="$save_LDFLAGS"
561 CPPFLAGS="$save_CPPFLAGS"
563 dnl Check that libevent is at least at version 2.0.10, the first stable
564 dnl release of its series
565 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent"
566 AC_MSG_CHECKING([whether Libevent is new enough])
567 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
568 #include <event2/event.h>
569 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 0x02000a00
570 #error
571 int x = y(zz);
572 #else
573 int x = 1;
574 #endif
575 ])], [ AC_MSG_RESULT([yes]) ],
576    [ AC_MSG_RESULT([no])
577      AC_MSG_ERROR([Libevent is not new enough.  We require 2.0.10-stable or later]) ] )
579 LIBS="$save_LIBS"
580 LDFLAGS="$save_LDFLAGS"
581 CPPFLAGS="$save_CPPFLAGS"
583 AC_SUBST(TOR_LIBEVENT_LIBS)
585 dnl ------------------------------------------------------
586 dnl Where do you live, libm?
588 dnl On some platforms (Haiku/BeOS) the math library is
589 dnl part of libroot. In which case don't link against lm
590 TOR_LIB_MATH=""
591 save_LIBS="$LIBS"
592 AC_SEARCH_LIBS(pow, [m], , AC_MSG_ERROR([Could not find pow in libm or libc.]))
593 if test "$ac_cv_search_pow" != "none required"; then
594     TOR_LIB_MATH="$ac_cv_search_pow"
596 LIBS="$save_LIBS"
597 AC_SUBST(TOR_LIB_MATH)
599 dnl ------------------------------------------------------
600 dnl Where do you live, openssl?  And how do we call you?
602 tor_openssl_pkg_redhat="openssl"
603 tor_openssl_pkg_debian="libssl-dev"
604 tor_openssl_devpkg_redhat="openssl-devel"
605 tor_openssl_devpkg_debian="libssl-dev"
607 ALT_openssl_WITHVAL=""
608 AC_ARG_WITH(ssl-dir,
609   AS_HELP_STRING(--with-ssl-dir=PATH, [obsolete alias for --with-openssl-dir]),
610   [
611       if test "x$withval" != "xno" && test "x$withval" != "x"; then
612          ALT_openssl_WITHVAL="$withval"
613       fi
614   ])
616 TOR_SEARCH_LIBRARY(openssl, $tryssldir, [-lssl -lcrypto $TOR_LIB_GDI],
617     [#include <openssl/rand.h>],
618     [void RAND_add(const void *buf, int num, double entropy);],
619     [RAND_add((void*)0,0,0);], [],
620     [/usr/local/openssl /usr/lib/openssl /usr/local/ssl /usr/lib/ssl /usr/local /usr/athena /opt/openssl])
622 dnl XXXX check for OPENSSL_VERSION_NUMBER == SSLeay()
624 if test "$enable_static_openssl" = "yes"; then
625    if test "$tor_cv_library_openssl_dir" = "(system)"; then
626      AC_MSG_ERROR("You must specify an explicit --with-openssl-dir=x option when using --enable-static-openssl")
627    else
628      TOR_OPENSSL_LIBS="$TOR_LIBDIR_openssl/libssl.a $TOR_LIBDIR_openssl/libcrypto.a"
629    fi
630 else
631      TOR_OPENSSL_LIBS="-lssl -lcrypto"
633 AC_SUBST(TOR_OPENSSL_LIBS)
635 dnl Now check for particular openssl functions.
636 save_LIBS="$LIBS"
637 save_LDFLAGS="$LDFLAGS"
638 save_CPPFLAGS="$CPPFLAGS"
639 LIBS="$TOR_OPENSSL_LIBS $LIBS"
640 LDFLAGS="$TOR_LDFLAGS_openssl $LDFLAGS"
641 CPPFLAGS="$TOR_CPPFLAGS_openssl $CPPFLAGS"
643 AC_TRY_COMPILE([
644 #include <openssl/opensslv.h>
645 #if !defined(LIBRESSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER < 0x1000100fL
646 #error "too old"
647 #endif
648    ], [],
649    [ : ],
650    [ AC_ERROR([OpenSSL is too old. We require 1.0.1 or later. You can specify a path to a newer one with --with-openssl-dir.]) ])
652 AC_TRY_COMPILE([
653 #include <openssl/opensslv.h>
654 #include <openssl/evp.h>
655 #if defined(OPENSSL_NO_EC) || defined(OPENSSL_NO_ECDH) || defined(OPENSSL_NO_ECDSA)
656 #error "no ECC"
657 #endif
658 #if !defined(NID_X9_62_prime256v1) || !defined(NID_secp224r1)
659 #error "curves unavailable"
660 #endif
661    ], [],
662    [ : ],
663    [ 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.]) ])
665 AC_CHECK_MEMBERS([struct ssl_method_st.get_cipher_by_char], , ,
666 [#include <openssl/ssl.h>
669 AC_CHECK_FUNCS([ \
670                 SSL_SESSION_get_master_key \
671                 SSL_get_server_random \
672                 SSL_get_client_ciphers \
673                 SSL_get_client_random \
674                 SSL_CIPHER_find \
675                 TLS_method
676                ])
678 dnl Check if OpenSSL has scrypt implementation.
679 AC_CHECK_FUNCS([ EVP_PBE_scrypt ])
681 dnl Check if OpenSSL structures are opaque
682 AC_CHECK_MEMBERS([SSL.state], , ,
683 [#include <openssl/ssl.h>
686 LIBS="$save_LIBS"
687 LDFLAGS="$save_LDFLAGS"
688 CPPFLAGS="$save_CPPFLAGS"
690 dnl ------------------------------------------------------
691 dnl Where do you live, zlib?  And how do we call you?
693 tor_zlib_pkg_redhat="zlib"
694 tor_zlib_pkg_debian="zlib1g"
695 tor_zlib_devpkg_redhat="zlib-devel"
696 tor_zlib_devpkg_debian="zlib1g-dev"
698 TOR_SEARCH_LIBRARY(zlib, $tryzlibdir, [-lz],
699     [#include <zlib.h>],
700     [const char * zlibVersion(void);],
701     [zlibVersion();], [--with-zlib-dir],
702     [/opt/zlib])
704 if test "$enable_static_zlib" = "yes"; then
705    if test "$tor_cv_library_zlib_dir" = "(system)"; then
706      AC_MSG_ERROR("You must specify an explicit --with-zlib-dir=x option when
707  using --enable-static-zlib")
708    else
709      TOR_ZLIB_LIBS="$TOR_LIBDIR_zlib/libz.a"
710    fi
711 else
712      TOR_ZLIB_LIBS="-lz"
714 AC_SUBST(TOR_ZLIB_LIBS)
716 dnl ----------------------------------------------------------------------
717 dnl Check if libcap is available for capabilities.
719 tor_cap_pkg_debian="libcap2"
720 tor_cap_pkg_redhat="libcap"
721 tor_cap_devpkg_debian="libcap-dev"
722 tor_cap_devpkg_redhat="libcap-devel"
724 AC_CHECK_LIB([cap], [cap_init], [],
725   AC_MSG_NOTICE([Libcap was not found. Capabilities will not be usable.])
727 AC_CHECK_FUNCS(cap_set_proc)
729 dnl ---------------------------------------------------------------------
730 dnl Now that we know about our major libraries, we can check for compiler
731 dnl and linker hardening options.  We need to do this with the libraries known,
732 dnl since sometimes the linker will like an option but not be willing to
733 dnl use it with a build of a library.
735 all_ldflags_for_check="$TOR_LDFLAGS_zlib $TOR_LDFLAGS_openssl $TOR_LDFLAGS_libevent"
736 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"
738 CFLAGS_FTRAPV=
739 CFLAGS_FWRAPV=
740 CFLAGS_ASAN=
741 CFLAGS_UBSAN=
743 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
744 #if !defined(__clang__)
745 #error
746 #endif])], have_clang=yes, have_clang=no)
748 if test "x$enable_gcc_hardening" != "xno"; then
749     CFLAGS="$CFLAGS -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2"
750     if test "x$have_clang" = "xyes"; then
751         TOR_CHECK_CFLAGS(-Qunused-arguments)
752     fi
753     TOR_CHECK_CFLAGS(-fstack-protector-all, also_link)
754     AS_VAR_PUSHDEF([can_compile], [tor_cv_cflags_-fstack-protector-all])
755     AS_VAR_PUSHDEF([can_link], [tor_can_link_-fstack-protector-all])
756 m4_ifdef([AS_VAR_IF],[
757     AS_VAR_IF(can_compile, [yes],
758         AS_VAR_IF(can_link, [yes],
759                   [],
760                   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.)]))
761         )])
762     AS_VAR_POPDEF([can_link])
763     AS_VAR_POPDEF([can_compile])
764     TOR_CHECK_CFLAGS(-Wstack-protector)
765     TOR_CHECK_CFLAGS(--param ssp-buffer-size=1)
766     if test "$bwin32" = "false"; then
767        TOR_CHECK_CFLAGS(-fPIE)
768        TOR_CHECK_LDFLAGS(-pie, "$all_ldflags_for_check", "$all_libs_for_check")
769     fi
770     TOR_TRY_COMPILE_WITH_CFLAGS(-fwrapv, also_link, CFLAGS_FWRAPV="-fwrapv", true)
773 if test "x$enable_expensive_hardening" = "xyes"; then
774     TOR_TRY_COMPILE_WITH_CFLAGS(-ftrapv, also_link, CFLAGS_FTRAPV="-ftrapv", true)
775    if test "$tor_cv_cflags__ftrapv" = "yes" && test "$tor_can_link__ftrapv" != "yes"; then
776       AC_MSG_WARN([The compiler supports -ftrapv, but for some reason I was not able to link with -ftrapv. Are you missing run-time support? Run-time hardening will not work as well as it should.])
777    fi
779    if test "$tor_cv_cflags__ftrapv" != "yes"; then
780      AC_MSG_ERROR([You requested expensive hardening, but the compiler does not seem to support -ftrapv.])
781    fi
783    TOR_TRY_COMPILE_WITH_CFLAGS([-fsanitize=address], also_link, CFLAGS_ASAN="-fsanitize=address", true)
784     if test "$tor_cv_cflags__fsanitize_address" = "yes" && test "$tor_can_link__fsanitize_address" != "yes"; then
785       AC_MSG_ERROR([The compiler supports -fsanitize=address, but for some reason I was not able to link when using it. Are you missing run-time support? With GCC you need libubsan.so, and with Clang you need libclang_rt.ubsan*])
786     fi
788    TOR_TRY_COMPILE_WITH_CFLAGS([-fsanitize=undefined], also_link, CFLAGS_UBSAN="-fsanitize=undefined", true)
789     if test "$tor_cv_cflags__fsanitize_address" = "yes" && test "$tor_can_link__fsanitize_address" != "yes"; then
790       AC_MSG_ERROR([The compiler supports -fsanitize=undefined, but for some reason I was not able to link when using it. Are you missing run-time support? With GCC you need libasan.so, and with Clang you need libclang_rt.ubsan*])
791     fi
793 TOR_CHECK_CFLAGS([-fno-omit-frame-pointer])
796 CFLAGS_BUGTRAP="$CFLAGS_FTRAPV $CFLAGS_ASAN $CFLAGS_UBSAN"
797 CFLAGS_CONSTTIME="$CFLAGS_FWRAPV"
799 mulodi_fixes_ftrapv=no
800 if test "$have_clang" = "yes"; then
801   saved_CFLAGS="$CFLAGS"
802   CFLAGS="$CFLAGS $CFLAGS_FTRAPV"
803   AC_MSG_CHECKING([whether clang -ftrapv can link a 64-bit int multiply])
804   AC_LINK_IFELSE([
805       AC_LANG_SOURCE([[
806           #include <stdint.h>
807           #include <stdlib.h>
808           int main(int argc, char **argv)
809           {
810             int64_t x = ((int64_t)atoi(argv[1])) * (int64_t)atoi(argv[2])
811                         * (int64_t)atoi(argv[3]);
812             return x == 9;
813           } ]])],
814           [ftrapv_can_link=yes; AC_MSG_RESULT([yes])],
815           [ftrapv_can_link=no; AC_MSG_RESULT([no])])
816   if test "$ftrapv_can_link" = "no"; then
817     AC_MSG_CHECKING([whether defining __mulodi4 fixes that])
818     AC_LINK_IFELSE([
819       AC_LANG_SOURCE([[
820           #include <stdint.h>
821           #include <stdlib.h>
822           int64_t __mulodi4(int64_t a, int64_t b, int *overflow) {
823              *overflow=0;
824              return a;
825           }
826           int main(int argc, char **argv)
827           {
828             int64_t x = ((int64_t)atoi(argv[1])) * (int64_t)atoi(argv[2])
829                         * (int64_t)atoi(argv[3]);
830             return x == 9;
831           } ]])],
832           [mulodi_fixes_ftrapv=yes; AC_MSG_RESULT([yes])],
833           [mulodi_fixes_ftrapv=no; AC_MSG_RESULT([no])])
834   fi
835   CFLAGS="$saved_CFLAGS"
838 AM_CONDITIONAL(ADD_MULODI4, test "$mulodi_fixes_ftrapv" = "yes")
840 dnl These cflags add bunches of branches, and we haven't been able to
841 dnl persuade ourselves that they're suitable for code that needs to be
842 dnl constant time.
843 AC_SUBST(CFLAGS_BUGTRAP)
844 dnl These cflags are variant ones sutable for code that needs to be
845 dnl constant-time.
846 AC_SUBST(CFLAGS_CONSTTIME)
848 if test "x$enable_linker_hardening" != "xno"; then
849     TOR_CHECK_LDFLAGS(-z relro -z now, "$all_ldflags_for_check", "$all_libs_for_check")
852 # For backtrace support
853 TOR_CHECK_LDFLAGS(-rdynamic)
855 dnl ------------------------------------------------------
856 dnl Now see if we have a -fomit-frame-pointer compiler option.
858 saved_CFLAGS="$CFLAGS"
859 TOR_CHECK_CFLAGS(-fomit-frame-pointer)
860 F_OMIT_FRAME_POINTER=''
861 if test "$saved_CFLAGS" != "$CFLAGS"; then
862   if test "x$enable_expensive_hardening" != "xyes"; then
863     F_OMIT_FRAME_POINTER='-fomit-frame-pointer'
864   fi
866 CFLAGS="$saved_CFLAGS"
867 AC_SUBST(F_OMIT_FRAME_POINTER)
869 dnl ------------------------------------------------------
870 dnl If we are adding -fomit-frame-pointer (or if the compiler's doing it
871 dnl for us, as GCC 4.6 and later do at many optimization levels), then
872 dnl we should try to add -fasynchronous-unwind-tables so that our backtrace
873 dnl code will work.
874 TOR_CHECK_CFLAGS(-fasynchronous-unwind-tables)
876 dnl ============================================================
877 dnl Check for libseccomp
879 if test "x$enable_seccomp" != "xno"; then
880   AC_CHECK_HEADERS([seccomp.h])
881   AC_SEARCH_LIBS(seccomp_init, [seccomp])
884 dnl ============================================================
885 dnl Check for libscrypt
887 if test "x$enable_libscrypt" != "xno"; then
888   AC_CHECK_HEADERS([libscrypt.h])
889   AC_SEARCH_LIBS(libscrypt_scrypt, [scrypt])
890   AC_CHECK_FUNCS([libscrypt_scrypt])
893 dnl ============================================================
894 dnl We need an implementation of curve25519.
896 dnl set these defaults.
897 build_curve25519_donna=no
898 build_curve25519_donna_c64=no
899 use_curve25519_donna=no
900 use_curve25519_nacl=no
901 CURVE25519_LIBS=
903 dnl The best choice is using curve25519-donna-c64, but that requires
904 dnl that we
905 AC_CACHE_CHECK([whether we can use curve25519-donna-c64],
906   tor_cv_can_use_curve25519_donna_c64,
907   [AC_RUN_IFELSE(
908     [AC_LANG_PROGRAM([dnl
909       #include <stdint.h>
910       typedef unsigned uint128_t __attribute__((mode(TI)));
911   int func(uint64_t a, uint64_t b) {
912            uint128_t c = ((uint128_t)a) * b;
913            int ok = ((uint64_t)(c>>96)) == 522859 &&
914              (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
915                  (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
916                  (((uint64_t)(c))&0xffffffffL) == 0;
917            return ok;
918       }
919   ], [dnl
920     int ok = func( ((uint64_t)2000000000) * 1000000000,
921                    ((uint64_t)1234567890) << 24);
922         return !ok;
923       ])],
924   [tor_cv_can_use_curve25519_donna_c64=yes],
925       [tor_cv_can_use_curve25519_donna_c64=no],
926   [AC_LINK_IFELSE(
927         [AC_LANG_PROGRAM([dnl
928       #include <stdint.h>
929       typedef unsigned uint128_t __attribute__((mode(TI)));
930   int func(uint64_t a, uint64_t b) {
931            uint128_t c = ((uint128_t)a) * b;
932            int ok = ((uint64_t)(c>>96)) == 522859 &&
933              (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
934                  (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
935                  (((uint64_t)(c))&0xffffffffL) == 0;
936            return ok;
937       }
938   ], [dnl
939     int ok = func( ((uint64_t)2000000000) * 1000000000,
940                  ((uint64_t)1234567890) << 24);
941         return !ok;
942       ])],
943           [tor_cv_can_use_curve25519_donna_c64=cross],
944       [tor_cv_can_use_curve25519_donna_c64=no])])])
946 AC_CHECK_HEADERS([crypto_scalarmult_curve25519.h \
947                   nacl/crypto_scalarmult_curve25519.h])
949 AC_CACHE_CHECK([for nacl compiled with a fast curve25519 implementation],
950   tor_cv_can_use_curve25519_nacl,
951   [tor_saved_LIBS="$LIBS"
952    LIBS="$LIBS -lnacl"
953    AC_LINK_IFELSE(
954      [AC_LANG_PROGRAM([dnl
955        #ifdef HAVE_CRYPTO_SCALARMULT_CURVE25519_H
956        #include <crypto_scalarmult_curve25519.h>
957    #elif defined(HAVE_NACL_CRYPTO_SCALARMULT_CURVE25519_H)
958    #include <nacl/crypto_scalarmult_curve25519.h>
959    #endif
960        #ifdef crypto_scalarmult_curve25519_ref_BYTES
961    #error Hey, this is the reference implementation! That's not fast.
962    #endif
963      ], [
964    unsigned char *a, *b, *c; crypto_scalarmult_curve25519(a,b,c);
965      ])], [tor_cv_can_use_curve25519_nacl=yes],
966      [tor_cv_can_use_curve25519_nacl=no])
967    LIBS="$tor_saved_LIBS" ])
969  dnl Okay, now we need to figure out which one to actually use. Fall back
970  dnl to curve25519-donna.c
972  if test "x$tor_cv_can_use_curve25519_donna_c64" != "xno"; then
973    build_curve25519_donna_c64=yes
974    use_curve25519_donna=yes
975  elif test "x$tor_cv_can_use_curve25519_nacl" = "xyes"; then
976    use_curve25519_nacl=yes
977    CURVE25519_LIBS=-lnacl
978  else
979    build_curve25519_donna=yes
980    use_curve25519_donna=yes
981  fi
983 if test "x$use_curve25519_donna" = "xyes"; then
984   AC_DEFINE(USE_CURVE25519_DONNA, 1,
985             [Defined if we should use an internal curve25519_donna{,_c64} implementation])
987 if test "x$use_curve25519_nacl" = "xyes"; then
988   AC_DEFINE(USE_CURVE25519_NACL, 1,
989             [Defined if we should use a curve25519 from nacl])
991 AM_CONDITIONAL(BUILD_CURVE25519_DONNA,
992   test "x$build_curve25519_donna" = "xyes")
993 AM_CONDITIONAL(BUILD_CURVE25519_DONNA_C64,
994   test "x$build_curve25519_donna_c64" = "xyes")
995 AC_SUBST(CURVE25519_LIBS)
997 dnl Make sure to enable support for large off_t if available.
998 AC_SYS_LARGEFILE
1000 AC_CHECK_HEADERS([assert.h \
1001                   errno.h \
1002                   fcntl.h \
1003                   signal.h \
1004                   string.h \
1005                   sys/capability.h \
1006                   sys/fcntl.h \
1007                   sys/stat.h \
1008                   sys/time.h \
1009                   sys/types.h \
1010                   time.h \
1011                   unistd.h \
1012                   arpa/inet.h \
1013                   crt_externs.h \
1014                   execinfo.h \
1015                   gnu/libc-version.h \
1016                   grp.h \
1017                   ifaddrs.h \
1018                   inttypes.h \
1019                   limits.h \
1020                   linux/types.h \
1021                   machine/limits.h \
1022                   malloc.h \
1023                   malloc/malloc.h \
1024                   malloc_np.h \
1025                   netdb.h \
1026                   netinet/in.h \
1027                   netinet/in6.h \
1028                   pwd.h \
1029                   readpassphrase.h \
1030                   stdint.h \
1031                   sys/eventfd.h \
1032                   sys/file.h \
1033                   sys/ioctl.h \
1034                   sys/limits.h \
1035                   sys/mman.h \
1036                   sys/param.h \
1037                   sys/prctl.h \
1038                   sys/random.h \
1039                   sys/resource.h \
1040                   sys/select.h \
1041                   sys/socket.h \
1042                   sys/statvfs.h \
1043                   sys/syscall.h \
1044                   sys/sysctl.h \
1045                   sys/syslimits.h \
1046                   sys/time.h \
1047                   sys/types.h \
1048                   sys/un.h \
1049                   sys/utime.h \
1050                   sys/wait.h \
1051                   syslog.h \
1052                   utime.h])
1054 AC_CHECK_HEADERS(sys/param.h)
1056 AC_CHECK_HEADERS(net/if.h, net_if_found=1, net_if_found=0,
1057 [#ifdef HAVE_SYS_TYPES_H
1058 #include <sys/types.h>
1059 #endif
1060 #ifdef HAVE_SYS_SOCKET_H
1061 #include <sys/socket.h>
1062 #endif])
1063 AC_CHECK_HEADERS(net/pfvar.h, net_pfvar_found=1, net_pfvar_found=0,
1064 [#ifdef HAVE_SYS_TYPES_H
1065 #include <sys/types.h>
1066 #endif
1067 #ifdef HAVE_SYS_SOCKET_H
1068 #include <sys/socket.h>
1069 #endif
1070 #ifdef HAVE_NET_IF_H
1071 #include <net/if.h>
1072 #endif
1073 #ifdef HAVE_NETINET_IN_H
1074 #include <netinet/in.h>
1075 #endif])
1077 AC_CHECK_HEADERS(linux/if.h,[],[],
1079 #ifdef HAVE_SYS_SOCKET_H
1080 #include <sys/socket.h>
1081 #endif
1084 AC_CHECK_HEADERS(linux/netfilter_ipv4.h,
1085         linux_netfilter_ipv4=1, linux_netfilter_ipv4=0,
1086 [#ifdef HAVE_SYS_TYPES_H
1087 #include <sys/types.h>
1088 #endif
1089 #ifdef HAVE_SYS_SOCKET_H
1090 #include <sys/socket.h>
1091 #endif
1092 #ifdef HAVE_LIMITS_H
1093 #include <limits.h>
1094 #endif
1095 #ifdef HAVE_LINUX_TYPES_H
1096 #include <linux/types.h>
1097 #endif
1098 #ifdef HAVE_NETINET_IN6_H
1099 #include <netinet/in6.h>
1100 #endif
1101 #ifdef HAVE_NETINET_IN_H
1102 #include <netinet/in.h>
1103 #endif])
1105 AC_CHECK_HEADERS(linux/netfilter_ipv6/ip6_tables.h,
1106         linux_netfilter_ipv6_ip6_tables=1, linux_netfilter_ipv6_ip6_tables=0,
1107 [#ifdef HAVE_SYS_TYPES_H
1108 #include <sys/types.h>
1109 #endif
1110 #ifdef HAVE_SYS_SOCKET_H
1111 #include <sys/socket.h>
1112 #endif
1113 #ifdef HAVE_LIMITS_H
1114 #include <limits.h>
1115 #endif
1116 #ifdef HAVE_LINUX_TYPES_H
1117 #include <linux/types.h>
1118 #endif
1119 #ifdef HAVE_NETINET_IN6_H
1120 #include <netinet/in6.h>
1121 #endif
1122 #ifdef HAVE_NETINET_IN_H
1123 #include <netinet/in.h>
1124 #endif
1125 #ifdef HAVE_LINUX_IF_H
1126 #include <linux/if.h>
1127 #endif])
1129 transparent_ok=0
1130 if test "x$net_if_found" = "x1" && test "x$net_pfvar_found" = "x1"; then
1131   transparent_ok=1
1133 if test "x$linux_netfilter_ipv4" = "x1"; then
1134   transparent_ok=1
1136 if test "x$linux_netfilter_ipv6_ip6_tables" = "x1"; then
1137   transparent_ok=1
1139 if test "x$transparent_ok" = "x1"; then
1140   AC_DEFINE(USE_TRANSPARENT, 1, "Define to enable transparent proxy support")
1141   case "$host" in
1142     *-*-openbsd* | *-*-bitrig*)
1143       AC_DEFINE(OPENBSD, 1, "Define to handle pf on OpenBSD properly") ;;
1144   esac
1145 else
1146   AC_MSG_NOTICE([Transparent proxy support enabled, but missing headers.])
1149 AC_CHECK_MEMBERS([struct timeval.tv_sec], , ,
1150 [#ifdef HAVE_SYS_TYPES_H
1151 #include <sys/types.h>
1152 #endif
1153 #ifdef HAVE_SYS_TIME_H
1154 #include <sys/time.h>
1155 #endif])
1157 dnl In case we aren't given a working stdint.h, we'll need to grow our own.
1158 dnl Watch out.
1160 AC_CHECK_SIZEOF(int8_t)
1161 AC_CHECK_SIZEOF(int16_t)
1162 AC_CHECK_SIZEOF(int32_t)
1163 AC_CHECK_SIZEOF(int64_t)
1164 AC_CHECK_SIZEOF(uint8_t)
1165 AC_CHECK_SIZEOF(uint16_t)
1166 AC_CHECK_SIZEOF(uint32_t)
1167 AC_CHECK_SIZEOF(uint64_t)
1168 AC_CHECK_SIZEOF(intptr_t)
1169 AC_CHECK_SIZEOF(uintptr_t)
1171 dnl AC_CHECK_TYPES([int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t, uint64_t, intptr_t, uintptr_t])
1173 AC_CHECK_SIZEOF(char)
1174 AC_CHECK_SIZEOF(short)
1175 AC_CHECK_SIZEOF(int)
1176 AC_CHECK_SIZEOF(long)
1177 AC_CHECK_SIZEOF(long long)
1178 AC_CHECK_SIZEOF(__int64)
1179 AC_CHECK_SIZEOF(void *)
1180 AC_CHECK_SIZEOF(time_t)
1181 AC_CHECK_SIZEOF(size_t)
1182 AC_CHECK_SIZEOF(pid_t)
1184 AC_CHECK_TYPES([uint, u_char, ssize_t])
1186 AC_PC_FROM_UCONTEXT([:])
1188 dnl used to include sockaddr_storage, but everybody has that.
1189 AC_CHECK_TYPES([struct in6_addr, struct sockaddr_in6, sa_family_t], , ,
1190 [#ifdef HAVE_SYS_TYPES_H
1191 #include <sys/types.h>
1192 #endif
1193 #ifdef HAVE_NETINET_IN_H
1194 #include <netinet/in.h>
1195 #endif
1196 #ifdef HAVE_NETINET_IN6_H
1197 #include <netinet/in6.h>
1198 #endif
1199 #ifdef HAVE_SYS_SOCKET_H
1200 #include <sys/socket.h>
1201 #endif
1202 #ifdef _WIN32
1203 #define _WIN32_WINNT 0x0501
1204 #define WIN32_LEAN_AND_MEAN
1205 #include <winsock2.h>
1206 #include <ws2tcpip.h>
1207 #endif
1209 AC_CHECK_MEMBERS([struct in6_addr.s6_addr32, struct in6_addr.s6_addr16, struct sockaddr_in.sin_len, struct sockaddr_in6.sin6_len], , ,
1210 [#ifdef HAVE_SYS_TYPES_H
1211 #include <sys/types.h>
1212 #endif
1213 #ifdef HAVE_NETINET_IN_H
1214 #include <netinet/in.h>
1215 #endif
1216 #ifdef HAVE_NETINET_IN6_H
1217 #include <netinet/in6.h>
1218 #endif
1219 #ifdef HAVE_SYS_SOCKET_H
1220 #include <sys/socket.h>
1221 #endif
1222 #ifdef _WIN32
1223 #define _WIN32_WINNT 0x0501
1224 #define WIN32_LEAN_AND_MEAN
1225 #include <winsock2.h>
1226 #include <ws2tcpip.h>
1227 #endif
1230 AC_CHECK_TYPES([rlim_t], , ,
1231 [#ifdef HAVE_SYS_TYPES_H
1232 #include <sys/types.h>
1233 #endif
1234 #ifdef HAVE_SYS_TIME_H
1235 #include <sys/time.h>
1236 #endif
1237 #ifdef HAVE_SYS_RESOURCE_H
1238 #include <sys/resource.h>
1239 #endif
1242 AX_CHECK_SIGN([time_t],
1243        [ : ],
1244        [ : ], [
1245 #ifdef HAVE_SYS_TYPES_H
1246 #include <sys/types.h>
1247 #endif
1248 #ifdef HAVE_SYS_TIME_H
1249 #include <sys/time.h>
1250 #endif
1251 #ifdef HAVE_TIME_H
1252 #include <time.h>
1253 #endif
1256 if test "$ax_cv_decl_time_t_signed" = "no"; then
1257   AC_MSG_ERROR([You have an unsigned time_t; Tor does not support that. Please tell the Tor developers about your interesting platform.])
1260 AX_CHECK_SIGN([size_t],
1261        [ tor_cv_size_t_signed=yes ],
1262        [ tor_cv_size_t_signed=no ], [
1263 #ifdef HAVE_SYS_TYPES_H
1264 #include <sys/types.h>
1265 #endif
1268 if test "$ax_cv_decl_size_t_signed" = "yes"; then
1269   AC_MSG_ERROR([You have a signed size_t; that's grossly nonconformant.])
1272 AX_CHECK_SIGN([enum always],
1273        [ AC_DEFINE(ENUM_VALS_ARE_SIGNED, 1, [Define if enum is always signed]) ],
1274        [ : ], [
1275  enum always { AAA, BBB, CCC };
1278 AC_CHECK_SIZEOF(socklen_t, , [AC_INCLUDES_DEFAULT()
1279 #ifdef HAVE_SYS_SOCKET_H
1280 #include <sys/socket.h>
1281 #endif
1284 # We want to make sure that we _don't_ have a cell_t defined, like IRIX does.
1286 AC_CHECK_SIZEOF(cell_t)
1288 # Now make sure that NULL can be represented as zero bytes.
1289 AC_CACHE_CHECK([whether memset(0) sets pointers to NULL], tor_cv_null_is_zero,
1290 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1291 [[#include <stdlib.h>
1292 #include <string.h>
1293 #include <stdio.h>
1294 #ifdef HAVE_STDDEF_H
1295 #include <stddef.h>
1296 #endif
1297 int main () { char *p1,*p2; p1=NULL; memset(&p2,0,sizeof(p2));
1298 return memcmp(&p1,&p2,sizeof(char*))?1:0; }]])],
1299        [tor_cv_null_is_zero=yes],
1300        [tor_cv_null_is_zero=no],
1301        [tor_cv_null_is_zero=cross])])
1303 if test "$tor_cv_null_is_zero" = "cross"; then
1304   # Cross-compiling; let's hope that the target isn't raving mad.
1305   AC_MSG_NOTICE([Cross-compiling: we'll assume that NULL is represented as a sequence of 0-valued bytes.])
1308 if test "$tor_cv_null_is_zero" != "no"; then
1309   AC_DEFINE([NULL_REP_IS_ZERO_BYTES], 1,
1310             [Define to 1 iff memset(0) sets pointers to NULL])
1313 AC_CACHE_CHECK([whether memset(0) sets doubles to 0.0], tor_cv_dbl0_is_zero,
1314 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1315 [[#include <stdlib.h>
1316 #include <string.h>
1317 #include <stdio.h>
1318 #ifdef HAVE_STDDEF_H
1319 #include <stddef.h>
1320 #endif
1321 int main () { double d1,d2; d1=0; memset(&d2,0,sizeof(d2));
1322 return memcmp(&d1,&d2,sizeof(d1))?1:0; }]])],
1323        [tor_cv_dbl0_is_zero=yes],
1324        [tor_cv_dbl0_is_zero=no],
1325        [tor_cv_dbl0_is_zero=cross])])
1327 if test "$tor_cv_dbl0_is_zero" = "cross"; then
1328   # Cross-compiling; let's hope that the target isn't raving mad.
1329   AC_MSG_NOTICE([Cross-compiling: we'll assume that 0.0 can be represented as a sequence of 0-valued bytes.])
1332 if test "$tor_cv_dbl0_is_zero" != "no"; then
1333   AC_DEFINE([DOUBLE_0_REP_IS_ZERO_BYTES], 1,
1334             [Define to 1 iff memset(0) sets doubles to 0.0])
1337 # And what happens when we malloc zero?
1338 AC_CACHE_CHECK([whether we can malloc(0) safely.], tor_cv_malloc_zero_works,
1339 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1340 [[#include <stdlib.h>
1341 #include <string.h>
1342 #include <stdio.h>
1343 #ifdef HAVE_STDDEF_H
1344 #include <stddef.h>
1345 #endif
1346 int main () { return malloc(0)?0:1; }]])],
1347        [tor_cv_malloc_zero_works=yes],
1348        [tor_cv_malloc_zero_works=no],
1349        [tor_cv_malloc_zero_works=cross])])
1351 if test "$tor_cv_malloc_zero_works" = "cross"; then
1352   # Cross-compiling; let's hope that the target isn't raving mad.
1353   AC_MSG_NOTICE([Cross-compiling: we'll assume that we need to check malloc() arguments for 0.])
1356 if test "$tor_cv_malloc_zero_works" = "yes"; then
1357   AC_DEFINE([MALLOC_ZERO_WORKS], 1,
1358             [Define to 1 iff malloc(0) returns a pointer])
1361 # whether we seem to be in a 2s-complement world.
1362 AC_CACHE_CHECK([whether we are using 2s-complement arithmetic], tor_cv_twos_complement,
1363 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1364 [[int main () { int problem = ((-99) != (~99)+1);
1365 return problem ? 1 : 0; }]])],
1366        [tor_cv_twos_complement=yes],
1367        [tor_cv_twos_complement=no],
1368        [tor_cv_twos_complement=cross])])
1370 if test "$tor_cv_twos_complement" = "cross"; then
1371   # Cross-compiling; let's hope that the target isn't raving mad.
1372   AC_MSG_NOTICE([Cross-compiling: we'll assume that negative integers are represented with two's complement.])
1375 if test "$tor_cv_twos_complement" != "no"; then
1376   AC_DEFINE([USING_TWOS_COMPLEMENT], 1,
1377             [Define to 1 iff we represent negative integers with
1378              two's complement])
1381 # What does shifting a negative value do?
1382 AC_CACHE_CHECK([whether right-shift on negative values does sign-extension], tor_cv_sign_extend,
1383 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1384 [[int main () { int okay = (-60 >> 8) == -1; return okay ? 0 : 1; }]])],
1385        [tor_cv_sign_extend=yes],
1386        [tor_cv_sign_extend=no],
1387        [tor_cv_sign_extend=cross])])
1389 if test "$tor_cv_sign_extend" = "cross"; then
1390   # Cross-compiling; let's hope that the target isn't raving mad.
1391   AC_MSG_NOTICE([Cross-compiling: we'll assume that right-shifting negative integers causes sign-extension])
1394 if test "$tor_cv_sign_extend" != "no"; then
1395   AC_DEFINE([RSHIFT_DOES_SIGN_EXTEND], 1,
1396             [Define to 1 iff right-shifting a negative value performs sign-extension])
1399 # Whether we should use the dmalloc memory allocation debugging library.
1400 AC_MSG_CHECKING(whether to use dmalloc (debug memory allocation library))
1401 AC_ARG_WITH(dmalloc,
1402 AS_HELP_STRING(--with-dmalloc, [use debug memory allocation library]),
1403 [if [[ "$withval" = "yes" ]]; then
1404   dmalloc=1
1405   AC_MSG_RESULT(yes)
1406 else
1407   dmalloc=1
1408   AC_MSG_RESULT(no)
1409 fi], [ dmalloc=0; AC_MSG_RESULT(no) ]
1412 if [[ $dmalloc -eq 1 ]]; then
1413   AC_CHECK_HEADERS(dmalloc.h, , AC_MSG_ERROR(dmalloc header file not found. Do you have the development files for dmalloc installed?))
1414   AC_SEARCH_LIBS(dmalloc_malloc, [dmallocth dmalloc], , AC_MSG_ERROR(Libdmalloc library not found. If you enable it you better have it installed.))
1415   AC_DEFINE(USE_DMALLOC, 1, [Debug memory allocation library])
1416   AC_CHECK_FUNCS(dmalloc_strdup dmalloc_strndup)
1419 AC_ARG_WITH(tcmalloc,
1420 AS_HELP_STRING(--with-tcmalloc, [use tcmalloc memory allocation library]),
1421 [ tcmalloc=yes ], [ tcmalloc=no ])
1423 if test "x$tcmalloc" = "xyes"; then
1424    LDFLAGS="-ltcmalloc $LDFLAGS"
1427 using_custom_malloc=no
1428 if test "x$enable_openbsd_malloc" = "xyes"; then
1429    using_custom_malloc=yes
1431 if test "x$tcmalloc" = "xyes"; then
1432    using_custom_malloc=yes
1434 if test "$using_custom_malloc" = "no"; then
1435    AC_CHECK_FUNCS(mallinfo)
1438 # By default, we're going to assume we don't have mlockall()
1439 # bionic and other platforms have various broken mlockall subsystems.
1440 # Some systems don't have a working mlockall, some aren't linkable,
1441 # and some have it but don't declare it.
1442 AC_CHECK_FUNCS(mlockall)
1443 AC_CHECK_DECLS([mlockall], , , [
1444 #ifdef HAVE_SYS_MMAN_H
1445 #include <sys/mman.h>
1446 #endif])
1448 # Allow user to specify an alternate syslog facility
1449 AC_ARG_WITH(syslog-facility,
1450 AS_HELP_STRING(--with-syslog-facility=LOG, [syslog facility to use (default=LOG_DAEMON)]),
1451 syslog_facility="$withval", syslog_facility="LOG_DAEMON")
1452 AC_DEFINE_UNQUOTED(LOGFACILITY,$syslog_facility,[name of the syslog facility])
1453 AC_SUBST(LOGFACILITY)
1455 # Check if we have getresuid and getresgid
1456 AC_CHECK_FUNCS(getresuid getresgid)
1458 # Check for gethostbyname_r in all its glorious incompatible versions.
1459 #   (This logic is based on that in Python's configure.in)
1460 AH_TEMPLATE(HAVE_GETHOSTBYNAME_R,
1461   [Define this if you have any gethostbyname_r()])
1463 AC_CHECK_FUNC(gethostbyname_r, [
1464   AC_MSG_CHECKING([how many arguments gethostbyname_r() wants])
1465   OLD_CFLAGS=$CFLAGS
1466   CFLAGS="$CFLAGS $MY_CPPFLAGS $MY_THREAD_CPPFLAGS $MY_CFLAGS"
1467   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
1468 #include <netdb.h>
1469   ], [[
1470     char *cp1, *cp2;
1471     struct hostent *h1, *h2;
1472     int i1, i2;
1473     (void)gethostbyname_r(cp1,h1,cp2,i1,&h2,&i2);
1474   ]])],[
1475     AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1476     AC_DEFINE(HAVE_GETHOSTBYNAME_R_6_ARG, 1,
1477      [Define this if gethostbyname_r takes 6 arguments])
1478     AC_MSG_RESULT(6)
1479   ], [
1480     AC_TRY_COMPILE([
1481 #include <netdb.h>
1482     ], [
1483       char *cp1, *cp2;
1484       struct hostent *h1;
1485       int i1, i2;
1486       (void)gethostbyname_r(cp1,h1,cp2,i1,&i2);
1487     ], [
1488       AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1489       AC_DEFINE(HAVE_GETHOSTBYNAME_R_5_ARG, 1,
1490         [Define this if gethostbyname_r takes 5 arguments])
1491       AC_MSG_RESULT(5)
1492    ], [
1493       AC_TRY_COMPILE([
1494 #include <netdb.h>
1495      ], [
1496        char *cp1;
1497        struct hostent *h1;
1498        struct hostent_data hd;
1499        (void) gethostbyname_r(cp1,h1,&hd);
1500      ], [
1501        AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1502        AC_DEFINE(HAVE_GETHOSTBYNAME_R_3_ARG, 1,
1503          [Define this if gethostbyname_r takes 3 arguments])
1504        AC_MSG_RESULT(3)
1505      ], [
1506        AC_MSG_RESULT(0)
1507      ])
1508   ])
1509  ])
1510  CFLAGS=$OLD_CFLAGS
1513 AC_CACHE_CHECK([whether the C compiler supports __func__],
1514   tor_cv_have_func_macro,
1515   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1516 #include <stdio.h>
1517 int main(int c, char **v) { puts(__func__); }])],
1518   tor_cv_have_func_macro=yes,
1519   tor_cv_have_func_macro=no))
1521 AC_CACHE_CHECK([whether the C compiler supports __FUNC__],
1522   tor_cv_have_FUNC_macro,
1523   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1524 #include <stdio.h>
1525 int main(int c, char **v) { puts(__FUNC__); }])],
1526   tor_cv_have_FUNC_macro=yes,
1527   tor_cv_have_FUNC_macro=no))
1529 AC_CACHE_CHECK([whether the C compiler supports __FUNCTION__],
1530   tor_cv_have_FUNCTION_macro,
1531   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1532 #include <stdio.h>
1533 int main(int c, char **v) { puts(__FUNCTION__); }])],
1534   tor_cv_have_FUNCTION_macro=yes,
1535   tor_cv_have_FUNCTION_macro=no))
1537 AC_CACHE_CHECK([whether we have extern char **environ already declared],
1538   tor_cv_have_environ_declared,
1539   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1540 #ifdef HAVE_UNISTD_H
1541 #include <unistd.h>
1542 #endif
1543 #include <stdlib.h>
1544 int main(int c, char **v) { char **t = environ; }])],
1545   tor_cv_have_environ_declared=yes,
1546   tor_cv_have_environ_declared=no))
1548 if test "$tor_cv_have_func_macro" = "yes"; then
1549   AC_DEFINE(HAVE_MACRO__func__, 1, [Defined if the compiler supports __func__])
1552 if test "$tor_cv_have_FUNC_macro" = "yes"; then
1553   AC_DEFINE(HAVE_MACRO__FUNC__, 1, [Defined if the compiler supports __FUNC__])
1556 if test "$tor_cv_have_FUNCTION_macro" = "yes"; then
1557   AC_DEFINE(HAVE_MACRO__FUNCTION__, 1,
1558            [Defined if the compiler supports __FUNCTION__])
1561 if test "$tor_cv_have_environ_declared" = "yes"; then
1562   AC_DEFINE(HAVE_EXTERN_ENVIRON_DECLARED, 1,
1563            [Defined if we have extern char **environ already declared])
1566 # $prefix stores the value of the --prefix command line option, or
1567 # NONE if the option wasn't set.  In the case that it wasn't set, make
1568 # it be the default, so that we can use it to expand directories now.
1569 if test "x$prefix" = "xNONE"; then
1570   prefix=$ac_default_prefix
1573 # and similarly for $exec_prefix
1574 if test "x$exec_prefix" = "xNONE"; then
1575   exec_prefix=$prefix
1578 if test "x$BUILDDIR" = "x"; then
1579   BUILDDIR=`pwd`
1581 AC_SUBST(BUILDDIR)
1582 AH_TEMPLATE([BUILDDIR],[tor's build directory])
1583 AC_DEFINE_UNQUOTED(BUILDDIR,"$BUILDDIR")
1585 if test "x$CONFDIR" = "x"; then
1586   CONFDIR=`eval echo $sysconfdir/tor`
1588 AC_SUBST(CONFDIR)
1589 AH_TEMPLATE([CONFDIR],[tor's configuration directory])
1590 AC_DEFINE_UNQUOTED(CONFDIR,"$CONFDIR")
1592 BINDIR=`eval echo $bindir`
1593 AC_SUBST(BINDIR)
1594 LOCALSTATEDIR=`eval echo $localstatedir`
1595 AC_SUBST(LOCALSTATEDIR)
1597 if test "$bwin32" = "true"; then
1598   # Test if the linker supports the --nxcompat and --dynamicbase options
1599   # for Windows
1600   save_LDFLAGS="$LDFLAGS"
1601   LDFLAGS="-Wl,--nxcompat -Wl,--dynamicbase"
1602   AC_MSG_CHECKING([whether the linker supports DllCharacteristics])
1603   AC_LINK_IFELSE([AC_LANG_PROGRAM([])],
1604     [AC_MSG_RESULT([yes])]
1605     [save_LDFLAGS="$save_LDFLAGS $LDFLAGS"],
1606     [AC_MSG_RESULT([no])]
1607   )
1608   LDFLAGS="$save_LDFLAGS"
1611 # Set CFLAGS _after_ all the above checks, since our warnings are stricter
1612 # than autoconf's macros like.
1613 if test "$GCC" = "yes"; then
1614   # Disable GCC's strict aliasing checks.  They are an hours-to-debug
1615   # accident waiting to happen.
1616   CFLAGS="$CFLAGS -Wall -fno-strict-aliasing"
1617 else
1618   # Override optimization level for non-gcc compilers
1619   CFLAGS="$CFLAGS -O"
1620   enable_gcc_warnings=no
1621   enable_gcc_warnings_advisory=no
1624 # Warnings implies advisory-warnings and -Werror.
1625 if test "$enable_gcc_warnings" = "yes"; then
1626   enable_gcc_warnings_advisory=yes
1627   enable_fatal_warnings=yes
1630 # OS X Lion started deprecating the system openssl. Let's just disable
1631 # all deprecation warnings on OS X. Also, to potentially make the binary
1632 # a little smaller, let's enable dead_strip.
1633 case "$host_os" in
1635  darwin*)
1636     CFLAGS="$CFLAGS -Wno-deprecated-declarations"
1637     LDFLAGS="$LDFLAGS -dead_strip" ;;
1638 esac
1640 # Add some more warnings which we use in development but not in the
1641 # released versions.  (Some relevant gcc versions can't handle these.)
1643 # Note that we have to do this near the end  of the autoconf process, or
1644 # else we may run into problems when these warnings hit on the testing C
1645 # programs that autoconf wants to build.
1646 if test "x$enable_gcc_warnings_advisory" != "xno"; then
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   # GCC4.3 users once report trouble with -Wstrict-overflow=5.  GCC5 users
1658   # have it work better.
1659   # CFLAGS="$CFLAGS -Wstrict-overflow=1"
1661   # This warning was added in gcc 4.3, but it appears to generate
1662   # spurious warnings in gcc 4.4.  I don't know if it works in 4.5.
1663   #CFLAGS="$CFLAGS -Wlogical-op"
1665   m4_foreach_w([warning_flag], [
1666      -Waddress
1667      -Waddress-of-array-temporary
1668      -Waddress-of-temporary
1669      -Wambiguous-macro
1670      -Wanonymous-pack-parens
1671      -Warc
1672      -Warc-abi
1673      -Warc-bridge-casts-disallowed-in-nonarc
1674      -Warc-maybe-repeated-use-of-weak
1675      -Warc-performSelector-leaks
1676      -Warc-repeated-use-of-weak
1677      -Warray-bounds
1678      -Warray-bounds-pointer-arithmetic
1679      -Wasm
1680      -Wasm-operand-widths
1681      -Watomic-properties
1682      -Watomic-property-with-user-defined-accessor
1683      -Wauto-import
1684      -Wauto-storage-class
1685      -Wauto-var-id
1686      -Wavailability
1687      -Wbackslash-newline-escape
1688      -Wbad-array-new-length
1689      -Wbind-to-temporary-copy
1690      -Wbitfield-constant-conversion
1691      -Wbool-conversion
1692      -Wbool-conversions
1693      -Wbuiltin-requires-header
1694      -Wchar-align
1695      -Wcompare-distinct-pointer-types
1696      -Wcomplex-component-init
1697      -Wconditional-type-mismatch
1698      -Wconfig-macros
1699      -Wconstant-conversion
1700      -Wconstant-logical-operand
1701      -Wconstexpr-not-const
1702      -Wcustom-atomic-properties
1703      -Wdangling-field
1704      -Wdangling-initializer-list
1705      -Wdate-time
1706      -Wdelegating-ctor-cycles
1707      -Wdeprecated-implementations
1708      -Wdeprecated-register
1709      -Wdirect-ivar-access
1710      -Wdiscard-qual
1711      -Wdistributed-object-modifiers
1712      -Wdivision-by-zero
1713      -Wdollar-in-identifier-extension
1714      -Wdouble-promotion
1715      -Wduplicate-decl-specifier
1716      -Wduplicate-enum
1717      -Wduplicate-method-arg
1718      -Wduplicate-method-match
1719      -Wduplicated-cond
1720      -Wdynamic-class-memaccess
1721      -Wembedded-directive
1722      -Wempty-translation-unit
1723      -Wenum-conversion
1724      -Wexit-time-destructors
1725      -Wexplicit-ownership-type
1726      -Wextern-initializer
1727      -Wextra
1728      -Wextra-semi
1729      -Wextra-tokens
1730      -Wflexible-array-extensions
1731      -Wfloat-conversion
1732      -Wformat-non-iso
1733      -Wfour-char-constants
1734      -Wgcc-compat
1735      -Wglobal-constructors
1736      -Wgnu-array-member-paren-init
1737      -Wgnu-designator
1738      -Wgnu-static-float-init
1739      -Wheader-guard
1740      -Wheader-hygiene
1741      -Widiomatic-parentheses
1742      -Wignored-attributes
1743      -Wimplicit-atomic-properties
1744      -Wimplicit-conversion-floating-point-to-bool
1745      -Wimplicit-exception-spec-mismatch
1746      -Wimplicit-fallthrough
1747      -Wimplicit-fallthrough-per-function
1748      -Wimplicit-retain-self
1749      -Wimport-preprocessor-directive-pedantic
1750      -Wincompatible-library-redeclaration
1751      -Wincompatible-pointer-types-discards-qualifiers
1752      -Wincomplete-implementation
1753      -Wincomplete-module
1754      -Wincomplete-umbrella
1755      -Winit-self
1756      -Wint-conversions
1757      -Wint-to-void-pointer-cast
1758      -Winteger-overflow
1759      -Winvalid-constexpr
1760      -Winvalid-iboutlet
1761      -Winvalid-noreturn
1762      -Winvalid-pp-token
1763      -Winvalid-source-encoding
1764      -Winvalid-token-paste
1765      -Wknr-promoted-parameter
1766      -Wlanguage-extension-token
1767      -Wlarge-by-value-copy
1768      -Wliteral-conversion
1769      -Wliteral-range
1770      -Wlocal-type-template-args
1771      -Wlogical-op
1772      -Wloop-analysis
1773      -Wmain-return-type
1774      -Wmalformed-warning-check
1775      -Wmethod-signatures
1776      -Wmicrosoft
1777      -Wmicrosoft-exists
1778      -Wmismatched-parameter-types
1779      -Wmismatched-return-types
1780      -Wmissing-field-initializers
1781      -Wmissing-format-attribute
1782      -Wmissing-noreturn
1783      -Wmissing-selector-name
1784      -Wmissing-sysroot
1785      -Wmissing-variable-declarations
1786      -Wmodule-conflict
1787      -Wnested-anon-types
1788      -Wnewline-eof
1789      -Wnon-literal-null-conversion
1790      -Wnon-pod-varargs
1791      -Wnonportable-cfstrings
1792      -Wnormalized=id
1793      -Wnull-arithmetic
1794      -Wnull-character
1795      -Wnull-conversion
1796      -Wnull-dereference
1797      -Wout-of-line-declaration
1798      -Wover-aligned
1799      -Woverlength-strings
1800      -Woverride-init
1801      -Woverriding-method-mismatch
1802      -Wpointer-type-mismatch
1803      -Wpredefined-identifier-outside-function
1804      -Wprotocol-property-synthesis-ambiguity
1805      -Wreadonly-iboutlet-property
1806      -Wreadonly-setter-attrs
1807      -Wreceiver-expr
1808      -Wreceiver-forward-class
1809      -Wreceiver-is-weak
1810      -Wreinterpret-base-class
1811      -Wrequires-super-attribute
1812      -Wreserved-user-defined-literal
1813      -Wreturn-stack-address
1814      -Wsection
1815      -Wselector-type-mismatch
1816      -Wsentinel
1817      -Wserialized-diagnostics
1818      -Wshadow
1819      -Wshift-count-negative
1820      -Wshift-count-overflow
1821      -Wshift-negative-value
1822      -Wshift-overflow=2
1823      -Wshift-sign-overflow
1824      -Wshorten-64-to-32
1825      -Wsizeof-array-argument
1826      -Wsource-uses-openmp
1827      -Wstatic-float-init
1828      -Wstatic-in-inline
1829      -Wstatic-local-in-inline
1830      -Wstrict-overflow=1
1831      -Wstring-compare
1832      -Wstring-conversion
1833      -Wstrlcpy-strlcat-size
1834      -Wstrncat-size
1835      -Wsuggest-attribute=format
1836      -Wsuggest-attribute=noreturn
1837      -Wsuper-class-method-mismatch
1838      -Wswitch-bool
1839      -Wsync-nand
1840      -Wtautological-constant-out-of-range-compare
1841      -Wtentative-definition-incomplete-type
1842      -Wtrampolines
1843      -Wtype-safety
1844      -Wtypedef-redefinition
1845      -Wtypename-missing
1846      -Wundefined-inline
1847      -Wundefined-internal
1848      -Wundefined-reinterpret-cast
1849      -Wunicode
1850      -Wunicode-whitespace
1851      -Wunknown-warning-option
1852      -Wunnamed-type-template-args
1853      -Wunneeded-member-function
1854      -Wunsequenced
1855      -Wunsupported-visibility
1856      -Wunused-but-set-parameter
1857      -Wunused-but-set-variable
1858      -Wunused-command-line-argument
1859      -Wunused-const-variable=2
1860      -Wunused-exception-parameter
1861      -Wunused-local-typedefs
1862      -Wunused-member-function
1863      -Wunused-sanitize-argument
1864      -Wunused-volatile-lvalue
1865      -Wuser-defined-literals
1866      -Wvariadic-macros
1867      -Wvector-conversion
1868      -Wvector-conversions
1869      -Wvexing-parse
1870      -Wvisibility
1871      -Wvla-extension
1872      -Wzero-length-array
1873   ], [ TOR_CHECK_CFLAGS([warning_flag]) ])
1875 dnl    We should re-enable this in some later version.  Clang doesn't
1876 dnl    mind, but it causes trouble with GCC.
1877 dnl     -Wstrict-overflow=2
1879 dnl    These seem to require annotations that we don't currently use,
1880 dnl    and they give false positives in our pthreads wrappers. (Clang 4)
1881 dnl     -Wthread-safety
1882 dnl     -Wthread-safety-analysis
1883 dnl     -Wthread-safety-attributes
1884 dnl     -Wthread-safety-beta
1885 dnl     -Wthread-safety-precise
1887   CFLAGS="$CFLAGS -W -Wfloat-equal -Wundef -Wpointer-arith"
1888   CFLAGS="$CFLAGS -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings"
1889   CFLAGS="$CFLAGS -Wredundant-decls -Wchar-subscripts -Wcomment -Wformat=2"
1890   CFLAGS="$CFLAGS -Wwrite-strings"
1891   CFLAGS="$CFLAGS -Wnested-externs -Wbad-function-cast -Wswitch-enum"
1892   CFLAGS="$CFLAGS -Waggregate-return -Wpacked -Wunused"
1893   CFLAGS="$CFLAGS -Wunused-parameter "
1894   # These interfere with building main() { return 0; }, which autoconf
1895   # likes to use as its default program.
1896   CFLAGS="$CFLAGS -Wold-style-definition -Wmissing-declarations"
1898   if test "$tor_cv_cflags__Wnull_dereference" = "yes"; then
1899     AC_DEFINE([HAVE_CFLAG_WNULL_DEREFERENCE], 1, [True if we have -Wnull-dereference])
1900   fi
1901   if test "$tor_cv_cflags__Woverlength_strings" = "yes"; then
1902     AC_DEFINE([HAVE_CFLAG_WOVERLENGTH_STRINGS], 1, [True if we have -Woverlength-strings])
1903   fi
1905   if test "x$enable_fatal_warnings" = "xyes"; then
1906     # I'd like to use TOR_CHECK_CFLAGS here, but I can't, since the
1907     # default autoconf programs are full of errors.
1908     CFLAGS="$CFLAGS -Werror"
1909   fi
1913 if test "$enable_coverage" = "yes" && test "$have_clang" = "no"; then
1914    case "$host_os" in
1915     darwin*)
1916       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-coverage.])
1917    esac
1920 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent $TOR_CPPFLAGS_openssl $TOR_CPPFLAGS_zlib"
1922 AC_CONFIG_FILES([
1923         Doxyfile
1924         Makefile
1925         contrib/dist/suse/tor.sh
1926         contrib/operator-tools/tor.logrotate
1927         contrib/dist/tor.sh
1928         contrib/dist/torctl
1929         contrib/dist/tor.service
1930         src/config/torrc.sample
1931         src/config/torrc.minimal
1932         scripts/maint/checkOptionDocs.pl
1933         scripts/maint/updateVersions.pl
1936 if test "x$asciidoc" = "xtrue" && test "$ASCIIDOC" = "none"; then
1937   regular_mans="doc/tor doc/tor-gencert doc/tor-resolve doc/torify"
1938   for file in $regular_mans ; do
1939     if ! [[ -f "$srcdir/$file.1.in" ]] || ! [[ -f "$srcdir/$file.html.in" ]] ; then
1940       echo "==================================";
1941       echo;
1942       echo "Building Tor has failed since manpages cannot be built.";
1943       echo;
1944       echo "You need asciidoc installed to be able to build the manpages.";
1945       echo "To build without manpages, use the --disable-asciidoc argument";
1946       echo "when calling configure.";
1947       echo;
1948       echo "==================================";
1949       exit 1;
1950     fi
1951   done
1954 AC_OUTPUT