Merge branch 'maint-0.2.8' into maint-0.2.9
[tor/appveyor.git] / configure.ac
blob76140cbd19dafd6e39fafb80d8fc6bb180904221
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.12-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         htonll \
394         inet_aton \
395         ioctl \
396         issetugid \
397         llround \
398         localtime_r \
399         lround \
400         memmem \
401         memset_s \
402         pipe \
403         pipe2 \
404         prctl \
405         readpassphrase \
406         rint \
407         sigaction \
408         socketpair \
409         statvfs \
410         strlcat \
411         strlcpy \
412         strnlen \
413         strptime \
414         strtok_r \
415         strtoull \
416         sysconf \
417         sysctl \
418         truncate \
419         uname \
420         usleep \
421         vasprintf \
422         _vscprintf
425 # Apple messed up when they added two functions functions in Sierra: they
426 # forgot to decorate them with appropriate AVAILABLE_MAC_OS_VERSION
427 # checks. So we should only probe for those functions if we are sure that we
428 # are not targetting OSX 10.11 or earlier.
429 AC_MSG_CHECKING([for a pre-Sierra OSX build target])
430 AC_TRY_COMPILE([
431 #ifdef __APPLE__
432 #  include <AvailabilityMacros.h>
433 #  ifndef MAC_OS_X_VERSION_10_12
434 #    define MAC_OS_X_VERSION_10_12 101200
435 #  endif
436 #  if defined(MAC_OS_X_VERSION_MIN_REQUIRED)
437 #    if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_12
438 #      error "Running on Mac OSX 10.11 or earlier"
439 #    endif
440 #  endif
441 #endif
442 ], [],
443    [on_macos_pre_10_12=no ; AC_MSG_RESULT([no])],
444    [on_macos_pre_10_12=yes; AC_MSG_RESULT([yes])])
446 if test "$on_macos_pre_10_12" = "no"; then
447   AC_CHECK_FUNCS(
448         clock_gettime \
449         getentropy \
450   )
453 if test "$bwin32" != "true"; then
454   AC_CHECK_HEADERS(pthread.h)
455   AC_CHECK_FUNCS(pthread_create)
456   AC_CHECK_FUNCS(pthread_condattr_setclock)
459 if test "$bwin32" = "true"; then
460   AC_CHECK_DECLS([SecureZeroMemory, _getwch], , , [
461 #include <windows.h>
462 #include <conio.h>
463 #include <wchar.h>
464                  ])
467 AM_CONDITIONAL(BUILD_READPASSPHRASE_C,
468   test "x$ac_cv_func_readpassphrase" = "xno" && test "$bwin32" = "false")
470 dnl ------------------------------------------------------
471 dnl Where do you live, libevent?  And how do we call you?
473 if test "$bwin32" = "true"; then
474   TOR_LIB_WS32=-lws2_32
475   TOR_LIB_IPHLPAPI=-liphlpapi
476   # Some of the cargo-cults recommend -lwsock32 as well, but I don't
477   # think it's actually necessary.
478   TOR_LIB_GDI=-lgdi32
479 else
480   TOR_LIB_WS32=
481   TOR_LIB_GDI=
483 AC_SUBST(TOR_LIB_WS32)
484 AC_SUBST(TOR_LIB_GDI)
485 AC_SUBST(TOR_LIB_IPHLPAPI)
487 tor_libevent_pkg_redhat="libevent"
488 tor_libevent_pkg_debian="libevent-dev"
489 tor_libevent_devpkg_redhat="libevent-devel"
490 tor_libevent_devpkg_debian="libevent-dev"
492 dnl On Gnu/Linux or any place we require it, we'll add librt to the Libevent
493 dnl linking for static builds.
494 STATIC_LIBEVENT_FLAGS=""
495 if test "$enable_static_libevent" = "yes"; then
496     if test "$have_rt" = "yes"; then
497       STATIC_LIBEVENT_FLAGS=" -lrt "
498     fi
501 TOR_SEARCH_LIBRARY(libevent, $trylibeventdir, [-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32], [
502 #ifdef _WIN32
503 #include <winsock2.h>
504 #endif
505 #include <sys/time.h>
506 #include <sys/types.h>
507 #include <event2/event.h>], [
508 #ifdef _WIN32
509 #include <winsock2.h>
510 #endif
511 struct event_base;
512 struct event_base *event_base_new(void);],
513     [
514 #ifdef _WIN32
515 {WSADATA d; WSAStartup(0x101,&d); }
516 #endif
517 event_base_new();
518 ], [--with-libevent-dir], [/opt/libevent])
520 dnl Determine the incantation needed to link libevent.
521 save_LIBS="$LIBS"
522 save_LDFLAGS="$LDFLAGS"
523 save_CPPFLAGS="$CPPFLAGS"
525 LIBS="$STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32 $save_LIBS"
526 LDFLAGS="$TOR_LDFLAGS_libevent $LDFLAGS"
527 CPPFLAGS="$TOR_CPPFLAGS_libevent $CPPFLAGS"
529 AC_CHECK_HEADERS(event2/event.h event2/dns.h event2/bufferevent_ssl.h)
531 if test "$enable_static_libevent" = "yes"; then
532    if test "$tor_cv_library_libevent_dir" = "(system)"; then
533      AC_MSG_ERROR("You must specify an explicit --with-libevent-dir=x option when using --enable-static-libevent")
534    else
535      TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent.a $STATIC_LIBEVENT_FLAGS"
536    fi
537 else
538      if test "x$ac_cv_header_event2_event_h" = "xyes"; then
539        AC_SEARCH_LIBS(event_new, [event event_core], , AC_MSG_ERROR("libevent2 is installed but linking it failed while searching for event_new"))
540        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"))
542        if test "$ac_cv_search_event_new" != "none required"; then
543          TOR_LIBEVENT_LIBS="$ac_cv_search_event_new"
544        fi
545        if test "$ac_cv_search_evdns_base_new" != "none required"; then
546          TOR_LIBEVENT_LIBS="$ac_cv_search_evdns_base_new $TOR_LIBEVENT_LIBS"
547        fi
548      else
549        AC_MSG_ERROR("libevent2 is required but the headers could not be found")
550      fi
553 dnl Now check for particular libevent functions.
554 AC_CHECK_FUNCS([evutil_secure_rng_set_urandom_device_file \
555                 evutil_secure_rng_add_bytes \
558 LIBS="$save_LIBS"
559 LDFLAGS="$save_LDFLAGS"
560 CPPFLAGS="$save_CPPFLAGS"
562 dnl Check that libevent is at least at version 2.0.10, the first stable
563 dnl release of its series
564 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent"
565 AC_MSG_CHECKING([whether Libevent is new enough])
566 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
567 #include <event2/event.h>
568 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 0x02000a00
569 #error
570 int x = y(zz);
571 #else
572 int x = 1;
573 #endif
574 ])], [ AC_MSG_RESULT([yes]) ],
575    [ AC_MSG_RESULT([no])
576      AC_MSG_ERROR([Libevent is not new enough.  We require 2.0.10-stable or later]) ] )
578 LIBS="$save_LIBS"
579 LDFLAGS="$save_LDFLAGS"
580 CPPFLAGS="$save_CPPFLAGS"
582 AC_SUBST(TOR_LIBEVENT_LIBS)
584 dnl ------------------------------------------------------
585 dnl Where do you live, libm?
587 dnl On some platforms (Haiku/BeOS) the math library is
588 dnl part of libroot. In which case don't link against lm
589 TOR_LIB_MATH=""
590 save_LIBS="$LIBS"
591 AC_SEARCH_LIBS(pow, [m], , AC_MSG_ERROR([Could not find pow in libm or libc.]))
592 if test "$ac_cv_search_pow" != "none required"; then
593     TOR_LIB_MATH="$ac_cv_search_pow"
595 LIBS="$save_LIBS"
596 AC_SUBST(TOR_LIB_MATH)
598 dnl ------------------------------------------------------
599 dnl Where do you live, openssl?  And how do we call you?
601 tor_openssl_pkg_redhat="openssl"
602 tor_openssl_pkg_debian="libssl-dev"
603 tor_openssl_devpkg_redhat="openssl-devel"
604 tor_openssl_devpkg_debian="libssl-dev"
606 ALT_openssl_WITHVAL=""
607 AC_ARG_WITH(ssl-dir,
608   AS_HELP_STRING(--with-ssl-dir=PATH, [obsolete alias for --with-openssl-dir]),
609   [
610       if test "x$withval" != "xno" && test "x$withval" != "x"; then
611          ALT_openssl_WITHVAL="$withval"
612       fi
613   ])
615 TOR_SEARCH_LIBRARY(openssl, $tryssldir, [-lssl -lcrypto $TOR_LIB_GDI],
616     [#include <openssl/rand.h>],
617     [void RAND_add(const void *buf, int num, double entropy);],
618     [RAND_add((void*)0,0,0);], [],
619     [/usr/local/openssl /usr/lib/openssl /usr/local/ssl /usr/lib/ssl /usr/local /usr/athena /opt/openssl])
621 dnl XXXX check for OPENSSL_VERSION_NUMBER == SSLeay()
623 if test "$enable_static_openssl" = "yes"; then
624    if test "$tor_cv_library_openssl_dir" = "(system)"; then
625      AC_MSG_ERROR("You must specify an explicit --with-openssl-dir=x option when using --enable-static-openssl")
626    else
627      TOR_OPENSSL_LIBS="$TOR_LIBDIR_openssl/libssl.a $TOR_LIBDIR_openssl/libcrypto.a"
628    fi
629 else
630      TOR_OPENSSL_LIBS="-lssl -lcrypto"
632 AC_SUBST(TOR_OPENSSL_LIBS)
634 dnl Now check for particular openssl functions.
635 save_LIBS="$LIBS"
636 save_LDFLAGS="$LDFLAGS"
637 save_CPPFLAGS="$CPPFLAGS"
638 LIBS="$TOR_OPENSSL_LIBS $LIBS"
639 LDFLAGS="$TOR_LDFLAGS_openssl $LDFLAGS"
640 CPPFLAGS="$TOR_CPPFLAGS_openssl $CPPFLAGS"
642 AC_TRY_COMPILE([
643 #include <openssl/opensslv.h>
644 #if !defined(LIBRESSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER < 0x1000100fL
645 #error "too old"
646 #endif
647    ], [],
648    [ : ],
649    [ 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.]) ])
651 AC_TRY_COMPILE([
652 #include <openssl/opensslv.h>
653 #include <openssl/evp.h>
654 #if defined(OPENSSL_NO_EC) || defined(OPENSSL_NO_ECDH) || defined(OPENSSL_NO_ECDSA)
655 #error "no ECC"
656 #endif
657 #if !defined(NID_X9_62_prime256v1) || !defined(NID_secp224r1)
658 #error "curves unavailable"
659 #endif
660    ], [],
661    [ : ],
662    [ 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.]) ])
664 AC_CHECK_MEMBERS([struct ssl_method_st.get_cipher_by_char], , ,
665 [#include <openssl/ssl.h>
668 AC_CHECK_FUNCS([ \
669                 SSL_SESSION_get_master_key \
670                 SSL_get_server_random \
671                 SSL_get_client_ciphers \
672                 SSL_get_client_random \
673                 SSL_CIPHER_find \
674                 TLS_method
675                ])
677 dnl Check if OpenSSL has scrypt implementation.
678 AC_CHECK_FUNCS([ EVP_PBE_scrypt ])
680 dnl Check if OpenSSL structures are opaque
681 AC_CHECK_MEMBERS([SSL.state], , ,
682 [#include <openssl/ssl.h>
685 LIBS="$save_LIBS"
686 LDFLAGS="$save_LDFLAGS"
687 CPPFLAGS="$save_CPPFLAGS"
689 dnl ------------------------------------------------------
690 dnl Where do you live, zlib?  And how do we call you?
692 tor_zlib_pkg_redhat="zlib"
693 tor_zlib_pkg_debian="zlib1g"
694 tor_zlib_devpkg_redhat="zlib-devel"
695 tor_zlib_devpkg_debian="zlib1g-dev"
697 TOR_SEARCH_LIBRARY(zlib, $tryzlibdir, [-lz],
698     [#include <zlib.h>],
699     [const char * zlibVersion(void);],
700     [zlibVersion();], [--with-zlib-dir],
701     [/opt/zlib])
703 if test "$enable_static_zlib" = "yes"; then
704    if test "$tor_cv_library_zlib_dir" = "(system)"; then
705      AC_MSG_ERROR("You must specify an explicit --with-zlib-dir=x option when
706  using --enable-static-zlib")
707    else
708      TOR_ZLIB_LIBS="$TOR_LIBDIR_zlib/libz.a"
709    fi
710 else
711      TOR_ZLIB_LIBS="-lz"
713 AC_SUBST(TOR_ZLIB_LIBS)
715 dnl ----------------------------------------------------------------------
716 dnl Check if libcap is available for capabilities.
718 tor_cap_pkg_debian="libcap2"
719 tor_cap_pkg_redhat="libcap"
720 tor_cap_devpkg_debian="libcap-dev"
721 tor_cap_devpkg_redhat="libcap-devel"
723 AC_CHECK_LIB([cap], [cap_init], [],
724   AC_MSG_NOTICE([Libcap was not found. Capabilities will not be usable.])
726 AC_CHECK_FUNCS(cap_set_proc)
728 dnl ---------------------------------------------------------------------
729 dnl Now that we know about our major libraries, we can check for compiler
730 dnl and linker hardening options.  We need to do this with the libraries known,
731 dnl since sometimes the linker will like an option but not be willing to
732 dnl use it with a build of a library.
734 all_ldflags_for_check="$TOR_LDFLAGS_zlib $TOR_LDFLAGS_openssl $TOR_LDFLAGS_libevent"
735 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"
737 CFLAGS_FTRAPV=
738 CFLAGS_FWRAPV=
739 CFLAGS_ASAN=
740 CFLAGS_UBSAN=
742 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
743 #if !defined(__clang__)
744 #error
745 #endif])], have_clang=yes, have_clang=no)
747 if test "x$enable_gcc_hardening" != "xno"; then
748     CFLAGS="$CFLAGS -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2"
749     if test "x$have_clang" = "xyes"; then
750         TOR_CHECK_CFLAGS(-Qunused-arguments)
751     fi
752     TOR_CHECK_CFLAGS(-fstack-protector-all, also_link)
753     AS_VAR_PUSHDEF([can_compile], [tor_cv_cflags_-fstack-protector-all])
754     AS_VAR_PUSHDEF([can_link], [tor_can_link_-fstack-protector-all])
755 m4_ifdef([AS_VAR_IF],[
756     AS_VAR_IF(can_compile, [yes],
757         AS_VAR_IF(can_link, [yes],
758                   [],
759                   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.)]))
760         )])
761     AS_VAR_POPDEF([can_link])
762     AS_VAR_POPDEF([can_compile])
763     TOR_CHECK_CFLAGS(-Wstack-protector)
764     TOR_CHECK_CFLAGS(--param ssp-buffer-size=1)
765     if test "$bwin32" = "false"; then
766        TOR_CHECK_CFLAGS(-fPIE)
767        TOR_CHECK_LDFLAGS(-pie, "$all_ldflags_for_check", "$all_libs_for_check")
768     fi
769     TOR_TRY_COMPILE_WITH_CFLAGS(-fwrapv, also_link, CFLAGS_FWRAPV="-fwrapv", true)
772 if test "x$enable_expensive_hardening" = "xyes"; then
773     TOR_TRY_COMPILE_WITH_CFLAGS(-ftrapv, also_link, CFLAGS_FTRAPV="-ftrapv", true)
774    if test "$tor_cv_cflags__ftrapv" = "yes" && test "$tor_can_link__ftrapv" != "yes"; then
775       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.])
776    fi
778    if test "$tor_cv_cflags__ftrapv" != "yes"; then
779      AC_MSG_ERROR([You requested expensive hardening, but the compiler does not seem to support -ftrapv.])
780    fi
782    TOR_TRY_COMPILE_WITH_CFLAGS([-fsanitize=address], also_link, CFLAGS_ASAN="-fsanitize=address", true)
783     if test "$tor_cv_cflags__fsanitize_address" = "yes" && test "$tor_can_link__fsanitize_address" != "yes"; then
784       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*])
785     fi
787    TOR_TRY_COMPILE_WITH_CFLAGS([-fsanitize=undefined], also_link, CFLAGS_UBSAN="-fsanitize=undefined", true)
788     if test "$tor_cv_cflags__fsanitize_address" = "yes" && test "$tor_can_link__fsanitize_address" != "yes"; then
789       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*])
790     fi
792 TOR_CHECK_CFLAGS([-fno-omit-frame-pointer])
795 CFLAGS_BUGTRAP="$CFLAGS_FTRAPV $CFLAGS_ASAN $CFLAGS_UBSAN"
796 CFLAGS_CONSTTIME="$CFLAGS_FWRAPV"
798 mulodi_fixes_ftrapv=no
799 if test "$have_clang" = "yes"; then
800   saved_CFLAGS="$CFLAGS"
801   CFLAGS="$CFLAGS $CFLAGS_FTRAPV"
802   AC_MSG_CHECKING([whether clang -ftrapv can link a 64-bit int multiply])
803   AC_LINK_IFELSE([
804       AC_LANG_SOURCE([[
805           #include <stdint.h>
806           #include <stdlib.h>
807           int main(int argc, char **argv)
808           {
809             int64_t x = ((int64_t)atoi(argv[1])) * (int64_t)atoi(argv[2])
810                         * (int64_t)atoi(argv[3]);
811             return x == 9;
812           } ]])],
813           [ftrapv_can_link=yes; AC_MSG_RESULT([yes])],
814           [ftrapv_can_link=no; AC_MSG_RESULT([no])])
815   if test "$ftrapv_can_link" = "no"; then
816     AC_MSG_CHECKING([whether defining __mulodi4 fixes that])
817     AC_LINK_IFELSE([
818       AC_LANG_SOURCE([[
819           #include <stdint.h>
820           #include <stdlib.h>
821           int64_t __mulodi4(int64_t a, int64_t b, int *overflow) {
822              *overflow=0;
823              return a;
824           }
825           int main(int argc, char **argv)
826           {
827             int64_t x = ((int64_t)atoi(argv[1])) * (int64_t)atoi(argv[2])
828                         * (int64_t)atoi(argv[3]);
829             return x == 9;
830           } ]])],
831           [mulodi_fixes_ftrapv=yes; AC_MSG_RESULT([yes])],
832           [mulodi_fixes_ftrapv=no; AC_MSG_RESULT([no])])
833   fi
834   CFLAGS="$saved_CFLAGS"
837 AM_CONDITIONAL(ADD_MULODI4, test "$mulodi_fixes_ftrapv" = "yes")
839 dnl These cflags add bunches of branches, and we haven't been able to
840 dnl persuade ourselves that they're suitable for code that needs to be
841 dnl constant time.
842 AC_SUBST(CFLAGS_BUGTRAP)
843 dnl These cflags are variant ones sutable for code that needs to be
844 dnl constant-time.
845 AC_SUBST(CFLAGS_CONSTTIME)
847 if test "x$enable_linker_hardening" != "xno"; then
848     TOR_CHECK_LDFLAGS(-z relro -z now, "$all_ldflags_for_check", "$all_libs_for_check")
851 # For backtrace support
852 TOR_CHECK_LDFLAGS(-rdynamic)
854 dnl ------------------------------------------------------
855 dnl Now see if we have a -fomit-frame-pointer compiler option.
857 saved_CFLAGS="$CFLAGS"
858 TOR_CHECK_CFLAGS(-fomit-frame-pointer)
859 F_OMIT_FRAME_POINTER=''
860 if test "$saved_CFLAGS" != "$CFLAGS"; then
861   if test "x$enable_expensive_hardening" != "xyes"; then
862     F_OMIT_FRAME_POINTER='-fomit-frame-pointer'
863   fi
865 CFLAGS="$saved_CFLAGS"
866 AC_SUBST(F_OMIT_FRAME_POINTER)
868 dnl ------------------------------------------------------
869 dnl If we are adding -fomit-frame-pointer (or if the compiler's doing it
870 dnl for us, as GCC 4.6 and later do at many optimization levels), then
871 dnl we should try to add -fasynchronous-unwind-tables so that our backtrace
872 dnl code will work.
873 TOR_CHECK_CFLAGS(-fasynchronous-unwind-tables)
875 dnl ============================================================
876 dnl Check for libseccomp
878 if test "x$enable_seccomp" != "xno"; then
879   AC_CHECK_HEADERS([seccomp.h])
880   AC_SEARCH_LIBS(seccomp_init, [seccomp])
883 dnl ============================================================
884 dnl Check for libscrypt
886 if test "x$enable_libscrypt" != "xno"; then
887   AC_CHECK_HEADERS([libscrypt.h])
888   AC_SEARCH_LIBS(libscrypt_scrypt, [scrypt])
889   AC_CHECK_FUNCS([libscrypt_scrypt])
892 dnl ============================================================
893 dnl We need an implementation of curve25519.
895 dnl set these defaults.
896 build_curve25519_donna=no
897 build_curve25519_donna_c64=no
898 use_curve25519_donna=no
899 use_curve25519_nacl=no
900 CURVE25519_LIBS=
902 dnl The best choice is using curve25519-donna-c64, but that requires
903 dnl that we
904 AC_CACHE_CHECK([whether we can use curve25519-donna-c64],
905   tor_cv_can_use_curve25519_donna_c64,
906   [AC_RUN_IFELSE(
907     [AC_LANG_PROGRAM([dnl
908       #include <stdint.h>
909       typedef unsigned uint128_t __attribute__((mode(TI)));
910   int func(uint64_t a, uint64_t b) {
911            uint128_t c = ((uint128_t)a) * b;
912            int ok = ((uint64_t)(c>>96)) == 522859 &&
913              (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
914                  (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
915                  (((uint64_t)(c))&0xffffffffL) == 0;
916            return ok;
917       }
918   ], [dnl
919     int ok = func( ((uint64_t)2000000000) * 1000000000,
920                    ((uint64_t)1234567890) << 24);
921         return !ok;
922       ])],
923   [tor_cv_can_use_curve25519_donna_c64=yes],
924       [tor_cv_can_use_curve25519_donna_c64=no],
925   [AC_LINK_IFELSE(
926         [AC_LANG_PROGRAM([dnl
927       #include <stdint.h>
928       typedef unsigned uint128_t __attribute__((mode(TI)));
929   int func(uint64_t a, uint64_t b) {
930            uint128_t c = ((uint128_t)a) * b;
931            int ok = ((uint64_t)(c>>96)) == 522859 &&
932              (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
933                  (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
934                  (((uint64_t)(c))&0xffffffffL) == 0;
935            return ok;
936       }
937   ], [dnl
938     int ok = func( ((uint64_t)2000000000) * 1000000000,
939                  ((uint64_t)1234567890) << 24);
940         return !ok;
941       ])],
942           [tor_cv_can_use_curve25519_donna_c64=cross],
943       [tor_cv_can_use_curve25519_donna_c64=no])])])
945 AC_CHECK_HEADERS([crypto_scalarmult_curve25519.h \
946                   nacl/crypto_scalarmult_curve25519.h])
948 AC_CACHE_CHECK([for nacl compiled with a fast curve25519 implementation],
949   tor_cv_can_use_curve25519_nacl,
950   [tor_saved_LIBS="$LIBS"
951    LIBS="$LIBS -lnacl"
952    AC_LINK_IFELSE(
953      [AC_LANG_PROGRAM([dnl
954        #ifdef HAVE_CRYPTO_SCALARMULT_CURVE25519_H
955        #include <crypto_scalarmult_curve25519.h>
956    #elif defined(HAVE_NACL_CRYPTO_SCALARMULT_CURVE25519_H)
957    #include <nacl/crypto_scalarmult_curve25519.h>
958    #endif
959        #ifdef crypto_scalarmult_curve25519_ref_BYTES
960    #error Hey, this is the reference implementation! That's not fast.
961    #endif
962      ], [
963    unsigned char *a, *b, *c; crypto_scalarmult_curve25519(a,b,c);
964      ])], [tor_cv_can_use_curve25519_nacl=yes],
965      [tor_cv_can_use_curve25519_nacl=no])
966    LIBS="$tor_saved_LIBS" ])
968  dnl Okay, now we need to figure out which one to actually use. Fall back
969  dnl to curve25519-donna.c
971  if test "x$tor_cv_can_use_curve25519_donna_c64" != "xno"; then
972    build_curve25519_donna_c64=yes
973    use_curve25519_donna=yes
974  elif test "x$tor_cv_can_use_curve25519_nacl" = "xyes"; then
975    use_curve25519_nacl=yes
976    CURVE25519_LIBS=-lnacl
977  else
978    build_curve25519_donna=yes
979    use_curve25519_donna=yes
980  fi
982 if test "x$use_curve25519_donna" = "xyes"; then
983   AC_DEFINE(USE_CURVE25519_DONNA, 1,
984             [Defined if we should use an internal curve25519_donna{,_c64} implementation])
986 if test "x$use_curve25519_nacl" = "xyes"; then
987   AC_DEFINE(USE_CURVE25519_NACL, 1,
988             [Defined if we should use a curve25519 from nacl])
990 AM_CONDITIONAL(BUILD_CURVE25519_DONNA,
991   test "x$build_curve25519_donna" = "xyes")
992 AM_CONDITIONAL(BUILD_CURVE25519_DONNA_C64,
993   test "x$build_curve25519_donna_c64" = "xyes")
994 AC_SUBST(CURVE25519_LIBS)
996 dnl Make sure to enable support for large off_t if available.
997 AC_SYS_LARGEFILE
999 AC_CHECK_HEADERS([assert.h \
1000                   errno.h \
1001                   fcntl.h \
1002                   signal.h \
1003                   string.h \
1004                   sys/capability.h \
1005                   sys/fcntl.h \
1006                   sys/stat.h \
1007                   sys/time.h \
1008                   sys/types.h \
1009                   time.h \
1010                   unistd.h \
1011                   arpa/inet.h \
1012                   crt_externs.h \
1013                   execinfo.h \
1014                   grp.h \
1015                   ifaddrs.h \
1016                   inttypes.h \
1017                   limits.h \
1018                   linux/types.h \
1019                   machine/limits.h \
1020                   malloc.h \
1021                   malloc/malloc.h \
1022                   malloc_np.h \
1023                   netdb.h \
1024                   netinet/in.h \
1025                   netinet/in6.h \
1026                   pwd.h \
1027                   readpassphrase.h \
1028                   stdint.h \
1029                   sys/eventfd.h \
1030                   sys/file.h \
1031                   sys/ioctl.h \
1032                   sys/limits.h \
1033                   sys/mman.h \
1034                   sys/param.h \
1035                   sys/prctl.h \
1036                   sys/random.h \
1037                   sys/resource.h \
1038                   sys/select.h \
1039                   sys/socket.h \
1040                   sys/statvfs.h \
1041                   sys/syscall.h \
1042                   sys/sysctl.h \
1043                   sys/syslimits.h \
1044                   sys/time.h \
1045                   sys/types.h \
1046                   sys/un.h \
1047                   sys/utime.h \
1048                   sys/wait.h \
1049                   syslog.h \
1050                   utime.h])
1052 AC_CHECK_HEADERS(sys/param.h)
1054 AC_CHECK_HEADERS(net/if.h, net_if_found=1, net_if_found=0,
1055 [#ifdef HAVE_SYS_TYPES_H
1056 #include <sys/types.h>
1057 #endif
1058 #ifdef HAVE_SYS_SOCKET_H
1059 #include <sys/socket.h>
1060 #endif])
1061 AC_CHECK_HEADERS(net/pfvar.h, net_pfvar_found=1, net_pfvar_found=0,
1062 [#ifdef HAVE_SYS_TYPES_H
1063 #include <sys/types.h>
1064 #endif
1065 #ifdef HAVE_SYS_SOCKET_H
1066 #include <sys/socket.h>
1067 #endif
1068 #ifdef HAVE_NET_IF_H
1069 #include <net/if.h>
1070 #endif
1071 #ifdef HAVE_NETINET_IN_H
1072 #include <netinet/in.h>
1073 #endif])
1075 AC_CHECK_HEADERS(linux/if.h,[],[],
1077 #ifdef HAVE_SYS_SOCKET_H
1078 #include <sys/socket.h>
1079 #endif
1082 AC_CHECK_HEADERS(linux/netfilter_ipv4.h,
1083         linux_netfilter_ipv4=1, linux_netfilter_ipv4=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])
1103 AC_CHECK_HEADERS(linux/netfilter_ipv6/ip6_tables.h,
1104         linux_netfilter_ipv6_ip6_tables=1, linux_netfilter_ipv6_ip6_tables=0,
1105 [#ifdef HAVE_SYS_TYPES_H
1106 #include <sys/types.h>
1107 #endif
1108 #ifdef HAVE_SYS_SOCKET_H
1109 #include <sys/socket.h>
1110 #endif
1111 #ifdef HAVE_LIMITS_H
1112 #include <limits.h>
1113 #endif
1114 #ifdef HAVE_LINUX_TYPES_H
1115 #include <linux/types.h>
1116 #endif
1117 #ifdef HAVE_NETINET_IN6_H
1118 #include <netinet/in6.h>
1119 #endif
1120 #ifdef HAVE_NETINET_IN_H
1121 #include <netinet/in.h>
1122 #endif
1123 #ifdef HAVE_LINUX_IF_H
1124 #include <linux/if.h>
1125 #endif])
1127 transparent_ok=0
1128 if test "x$net_if_found" = "x1" && test "x$net_pfvar_found" = "x1"; then
1129   transparent_ok=1
1131 if test "x$linux_netfilter_ipv4" = "x1"; then
1132   transparent_ok=1
1134 if test "x$linux_netfilter_ipv6_ip6_tables" = "x1"; then
1135   transparent_ok=1
1137 if test "x$transparent_ok" = "x1"; then
1138   AC_DEFINE(USE_TRANSPARENT, 1, "Define to enable transparent proxy support")
1139   case "$host" in
1140     *-*-openbsd* | *-*-bitrig*)
1141       AC_DEFINE(OPENBSD, 1, "Define to handle pf on OpenBSD properly") ;;
1142   esac
1143 else
1144   AC_MSG_NOTICE([Transparent proxy support enabled, but missing headers.])
1147 AC_CHECK_MEMBERS([struct timeval.tv_sec], , ,
1148 [#ifdef HAVE_SYS_TYPES_H
1149 #include <sys/types.h>
1150 #endif
1151 #ifdef HAVE_SYS_TIME_H
1152 #include <sys/time.h>
1153 #endif])
1155 dnl In case we aren't given a working stdint.h, we'll need to grow our own.
1156 dnl Watch out.
1158 AC_CHECK_SIZEOF(int8_t)
1159 AC_CHECK_SIZEOF(int16_t)
1160 AC_CHECK_SIZEOF(int32_t)
1161 AC_CHECK_SIZEOF(int64_t)
1162 AC_CHECK_SIZEOF(uint8_t)
1163 AC_CHECK_SIZEOF(uint16_t)
1164 AC_CHECK_SIZEOF(uint32_t)
1165 AC_CHECK_SIZEOF(uint64_t)
1166 AC_CHECK_SIZEOF(intptr_t)
1167 AC_CHECK_SIZEOF(uintptr_t)
1169 dnl AC_CHECK_TYPES([int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t, uint64_t, intptr_t, uintptr_t])
1171 AC_CHECK_SIZEOF(char)
1172 AC_CHECK_SIZEOF(short)
1173 AC_CHECK_SIZEOF(int)
1174 AC_CHECK_SIZEOF(long)
1175 AC_CHECK_SIZEOF(long long)
1176 AC_CHECK_SIZEOF(__int64)
1177 AC_CHECK_SIZEOF(void *)
1178 AC_CHECK_SIZEOF(time_t)
1179 AC_CHECK_SIZEOF(size_t)
1180 AC_CHECK_SIZEOF(pid_t)
1182 AC_CHECK_TYPES([uint, u_char, ssize_t])
1184 AC_PC_FROM_UCONTEXT([:])
1186 dnl used to include sockaddr_storage, but everybody has that.
1187 AC_CHECK_TYPES([struct in6_addr, struct sockaddr_in6, sa_family_t], , ,
1188 [#ifdef HAVE_SYS_TYPES_H
1189 #include <sys/types.h>
1190 #endif
1191 #ifdef HAVE_NETINET_IN_H
1192 #include <netinet/in.h>
1193 #endif
1194 #ifdef HAVE_NETINET_IN6_H
1195 #include <netinet/in6.h>
1196 #endif
1197 #ifdef HAVE_SYS_SOCKET_H
1198 #include <sys/socket.h>
1199 #endif
1200 #ifdef _WIN32
1201 #define _WIN32_WINNT 0x0501
1202 #define WIN32_LEAN_AND_MEAN
1203 #include <winsock2.h>
1204 #include <ws2tcpip.h>
1205 #endif
1207 AC_CHECK_MEMBERS([struct in6_addr.s6_addr32, struct in6_addr.s6_addr16, struct sockaddr_in.sin_len, struct sockaddr_in6.sin6_len], , ,
1208 [#ifdef HAVE_SYS_TYPES_H
1209 #include <sys/types.h>
1210 #endif
1211 #ifdef HAVE_NETINET_IN_H
1212 #include <netinet/in.h>
1213 #endif
1214 #ifdef HAVE_NETINET_IN6_H
1215 #include <netinet/in6.h>
1216 #endif
1217 #ifdef HAVE_SYS_SOCKET_H
1218 #include <sys/socket.h>
1219 #endif
1220 #ifdef _WIN32
1221 #define _WIN32_WINNT 0x0501
1222 #define WIN32_LEAN_AND_MEAN
1223 #include <winsock2.h>
1224 #include <ws2tcpip.h>
1225 #endif
1228 AC_CHECK_TYPES([rlim_t], , ,
1229 [#ifdef HAVE_SYS_TYPES_H
1230 #include <sys/types.h>
1231 #endif
1232 #ifdef HAVE_SYS_TIME_H
1233 #include <sys/time.h>
1234 #endif
1235 #ifdef HAVE_SYS_RESOURCE_H
1236 #include <sys/resource.h>
1237 #endif
1240 AX_CHECK_SIGN([time_t],
1241        [ : ],
1242        [ : ], [
1243 #ifdef HAVE_SYS_TYPES_H
1244 #include <sys/types.h>
1245 #endif
1246 #ifdef HAVE_SYS_TIME_H
1247 #include <sys/time.h>
1248 #endif
1249 #ifdef HAVE_TIME_H
1250 #include <time.h>
1251 #endif
1254 if test "$ax_cv_decl_time_t_signed" = "no"; then
1255   AC_MSG_ERROR([You have an unsigned time_t; Tor does not support that. Please tell the Tor developers about your interesting platform.])
1258 AX_CHECK_SIGN([size_t],
1259        [ tor_cv_size_t_signed=yes ],
1260        [ tor_cv_size_t_signed=no ], [
1261 #ifdef HAVE_SYS_TYPES_H
1262 #include <sys/types.h>
1263 #endif
1266 if test "$ax_cv_decl_size_t_signed" = "yes"; then
1267   AC_MSG_ERROR([You have a signed size_t; that's grossly nonconformant.])
1270 AX_CHECK_SIGN([enum always],
1271        [ AC_DEFINE(ENUM_VALS_ARE_SIGNED, 1, [Define if enum is always signed]) ],
1272        [ : ], [
1273  enum always { AAA, BBB, CCC };
1276 AC_CHECK_SIZEOF(socklen_t, , [AC_INCLUDES_DEFAULT()
1277 #ifdef HAVE_SYS_SOCKET_H
1278 #include <sys/socket.h>
1279 #endif
1282 # We want to make sure that we _don't_ have a cell_t defined, like IRIX does.
1284 AC_CHECK_SIZEOF(cell_t)
1286 # Now make sure that NULL can be represented as zero bytes.
1287 AC_CACHE_CHECK([whether memset(0) sets pointers to NULL], tor_cv_null_is_zero,
1288 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1289 [[#include <stdlib.h>
1290 #include <string.h>
1291 #include <stdio.h>
1292 #ifdef HAVE_STDDEF_H
1293 #include <stddef.h>
1294 #endif
1295 int main () { char *p1,*p2; p1=NULL; memset(&p2,0,sizeof(p2));
1296 return memcmp(&p1,&p2,sizeof(char*))?1:0; }]])],
1297        [tor_cv_null_is_zero=yes],
1298        [tor_cv_null_is_zero=no],
1299        [tor_cv_null_is_zero=cross])])
1301 if test "$tor_cv_null_is_zero" = "cross"; then
1302   # Cross-compiling; let's hope that the target isn't raving mad.
1303   AC_MSG_NOTICE([Cross-compiling: we'll assume that NULL is represented as a sequence of 0-valued bytes.])
1306 if test "$tor_cv_null_is_zero" != "no"; then
1307   AC_DEFINE([NULL_REP_IS_ZERO_BYTES], 1,
1308             [Define to 1 iff memset(0) sets pointers to NULL])
1311 AC_CACHE_CHECK([whether memset(0) sets doubles to 0.0], tor_cv_dbl0_is_zero,
1312 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1313 [[#include <stdlib.h>
1314 #include <string.h>
1315 #include <stdio.h>
1316 #ifdef HAVE_STDDEF_H
1317 #include <stddef.h>
1318 #endif
1319 int main () { double d1,d2; d1=0; memset(&d2,0,sizeof(d2));
1320 return memcmp(&d1,&d2,sizeof(d1))?1:0; }]])],
1321        [tor_cv_dbl0_is_zero=yes],
1322        [tor_cv_dbl0_is_zero=no],
1323        [tor_cv_dbl0_is_zero=cross])])
1325 if test "$tor_cv_dbl0_is_zero" = "cross"; then
1326   # Cross-compiling; let's hope that the target isn't raving mad.
1327   AC_MSG_NOTICE([Cross-compiling: we'll assume that 0.0 can be represented as a sequence of 0-valued bytes.])
1330 if test "$tor_cv_dbl0_is_zero" != "no"; then
1331   AC_DEFINE([DOUBLE_0_REP_IS_ZERO_BYTES], 1,
1332             [Define to 1 iff memset(0) sets doubles to 0.0])
1335 # And what happens when we malloc zero?
1336 AC_CACHE_CHECK([whether we can malloc(0) safely.], tor_cv_malloc_zero_works,
1337 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1338 [[#include <stdlib.h>
1339 #include <string.h>
1340 #include <stdio.h>
1341 #ifdef HAVE_STDDEF_H
1342 #include <stddef.h>
1343 #endif
1344 int main () { return malloc(0)?0:1; }]])],
1345        [tor_cv_malloc_zero_works=yes],
1346        [tor_cv_malloc_zero_works=no],
1347        [tor_cv_malloc_zero_works=cross])])
1349 if test "$tor_cv_malloc_zero_works" = "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 we need to check malloc() arguments for 0.])
1354 if test "$tor_cv_malloc_zero_works" = "yes"; then
1355   AC_DEFINE([MALLOC_ZERO_WORKS], 1,
1356             [Define to 1 iff malloc(0) returns a pointer])
1359 # whether we seem to be in a 2s-complement world.
1360 AC_CACHE_CHECK([whether we are using 2s-complement arithmetic], tor_cv_twos_complement,
1361 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1362 [[int main () { int problem = ((-99) != (~99)+1);
1363 return problem ? 1 : 0; }]])],
1364        [tor_cv_twos_complement=yes],
1365        [tor_cv_twos_complement=no],
1366        [tor_cv_twos_complement=cross])])
1368 if test "$tor_cv_twos_complement" = "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 negative integers are represented with two's complement.])
1373 if test "$tor_cv_twos_complement" != "no"; then
1374   AC_DEFINE([USING_TWOS_COMPLEMENT], 1,
1375             [Define to 1 iff we represent negative integers with
1376              two's complement])
1379 # What does shifting a negative value do?
1380 AC_CACHE_CHECK([whether right-shift on negative values does sign-extension], tor_cv_sign_extend,
1381 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1382 [[int main () { int okay = (-60 >> 8) == -1; return okay ? 0 : 1; }]])],
1383        [tor_cv_sign_extend=yes],
1384        [tor_cv_sign_extend=no],
1385        [tor_cv_sign_extend=cross])])
1387 if test "$tor_cv_sign_extend" = "cross"; then
1388   # Cross-compiling; let's hope that the target isn't raving mad.
1389   AC_MSG_NOTICE([Cross-compiling: we'll assume that right-shifting negative integers causes sign-extension])
1392 if test "$tor_cv_sign_extend" != "no"; then
1393   AC_DEFINE([RSHIFT_DOES_SIGN_EXTEND], 1,
1394             [Define to 1 iff right-shifting a negative value performs sign-extension])
1397 # Whether we should use the dmalloc memory allocation debugging library.
1398 AC_MSG_CHECKING(whether to use dmalloc (debug memory allocation library))
1399 AC_ARG_WITH(dmalloc,
1400 AS_HELP_STRING(--with-dmalloc, [use debug memory allocation library]),
1401 [if [[ "$withval" = "yes" ]]; then
1402   dmalloc=1
1403   AC_MSG_RESULT(yes)
1404 else
1405   dmalloc=1
1406   AC_MSG_RESULT(no)
1407 fi], [ dmalloc=0; AC_MSG_RESULT(no) ]
1410 if [[ $dmalloc -eq 1 ]]; then
1411   AC_CHECK_HEADERS(dmalloc.h, , AC_MSG_ERROR(dmalloc header file not found. Do you have the development files for dmalloc installed?))
1412   AC_SEARCH_LIBS(dmalloc_malloc, [dmallocth dmalloc], , AC_MSG_ERROR(Libdmalloc library not found. If you enable it you better have it installed.))
1413   AC_DEFINE(USE_DMALLOC, 1, [Debug memory allocation library])
1414   AC_CHECK_FUNCS(dmalloc_strdup dmalloc_strndup)
1417 AC_ARG_WITH(tcmalloc,
1418 AS_HELP_STRING(--with-tcmalloc, [use tcmalloc memory allocation library]),
1419 [ tcmalloc=yes ], [ tcmalloc=no ])
1421 if test "x$tcmalloc" = "xyes"; then
1422    LDFLAGS="-ltcmalloc $LDFLAGS"
1425 using_custom_malloc=no
1426 if test "x$enable_openbsd_malloc" = "xyes"; then
1427    using_custom_malloc=yes
1429 if test "x$tcmalloc" = "xyes"; then
1430    using_custom_malloc=yes
1432 if test "$using_custom_malloc" = "no"; then
1433    AC_CHECK_FUNCS(mallinfo)
1436 # By default, we're going to assume we don't have mlockall()
1437 # bionic and other platforms have various broken mlockall subsystems.
1438 # Some systems don't have a working mlockall, some aren't linkable,
1439 # and some have it but don't declare it.
1440 AC_CHECK_FUNCS(mlockall)
1441 AC_CHECK_DECLS([mlockall], , , [
1442 #ifdef HAVE_SYS_MMAN_H
1443 #include <sys/mman.h>
1444 #endif])
1446 # Allow user to specify an alternate syslog facility
1447 AC_ARG_WITH(syslog-facility,
1448 AS_HELP_STRING(--with-syslog-facility=LOG, [syslog facility to use (default=LOG_DAEMON)]),
1449 syslog_facility="$withval", syslog_facility="LOG_DAEMON")
1450 AC_DEFINE_UNQUOTED(LOGFACILITY,$syslog_facility,[name of the syslog facility])
1451 AC_SUBST(LOGFACILITY)
1453 # Check if we have getresuid and getresgid
1454 AC_CHECK_FUNCS(getresuid getresgid)
1456 # Check for gethostbyname_r in all its glorious incompatible versions.
1457 #   (This logic is based on that in Python's configure.in)
1458 AH_TEMPLATE(HAVE_GETHOSTBYNAME_R,
1459   [Define this if you have any gethostbyname_r()])
1461 AC_CHECK_FUNC(gethostbyname_r, [
1462   AC_MSG_CHECKING([how many arguments gethostbyname_r() wants])
1463   OLD_CFLAGS=$CFLAGS
1464   CFLAGS="$CFLAGS $MY_CPPFLAGS $MY_THREAD_CPPFLAGS $MY_CFLAGS"
1465   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
1466 #include <netdb.h>
1467   ], [[
1468     char *cp1, *cp2;
1469     struct hostent *h1, *h2;
1470     int i1, i2;
1471     (void)gethostbyname_r(cp1,h1,cp2,i1,&h2,&i2);
1472   ]])],[
1473     AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1474     AC_DEFINE(HAVE_GETHOSTBYNAME_R_6_ARG, 1,
1475      [Define this if gethostbyname_r takes 6 arguments])
1476     AC_MSG_RESULT(6)
1477   ], [
1478     AC_TRY_COMPILE([
1479 #include <netdb.h>
1480     ], [
1481       char *cp1, *cp2;
1482       struct hostent *h1;
1483       int i1, i2;
1484       (void)gethostbyname_r(cp1,h1,cp2,i1,&i2);
1485     ], [
1486       AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1487       AC_DEFINE(HAVE_GETHOSTBYNAME_R_5_ARG, 1,
1488         [Define this if gethostbyname_r takes 5 arguments])
1489       AC_MSG_RESULT(5)
1490    ], [
1491       AC_TRY_COMPILE([
1492 #include <netdb.h>
1493      ], [
1494        char *cp1;
1495        struct hostent *h1;
1496        struct hostent_data hd;
1497        (void) gethostbyname_r(cp1,h1,&hd);
1498      ], [
1499        AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1500        AC_DEFINE(HAVE_GETHOSTBYNAME_R_3_ARG, 1,
1501          [Define this if gethostbyname_r takes 3 arguments])
1502        AC_MSG_RESULT(3)
1503      ], [
1504        AC_MSG_RESULT(0)
1505      ])
1506   ])
1507  ])
1508  CFLAGS=$OLD_CFLAGS
1511 AC_CACHE_CHECK([whether the C compiler supports __func__],
1512   tor_cv_have_func_macro,
1513   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1514 #include <stdio.h>
1515 int main(int c, char **v) { puts(__func__); }])],
1516   tor_cv_have_func_macro=yes,
1517   tor_cv_have_func_macro=no))
1519 AC_CACHE_CHECK([whether the C compiler supports __FUNC__],
1520   tor_cv_have_FUNC_macro,
1521   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1522 #include <stdio.h>
1523 int main(int c, char **v) { puts(__FUNC__); }])],
1524   tor_cv_have_FUNC_macro=yes,
1525   tor_cv_have_FUNC_macro=no))
1527 AC_CACHE_CHECK([whether the C compiler supports __FUNCTION__],
1528   tor_cv_have_FUNCTION_macro,
1529   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1530 #include <stdio.h>
1531 int main(int c, char **v) { puts(__FUNCTION__); }])],
1532   tor_cv_have_FUNCTION_macro=yes,
1533   tor_cv_have_FUNCTION_macro=no))
1535 AC_CACHE_CHECK([whether we have extern char **environ already declared],
1536   tor_cv_have_environ_declared,
1537   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1538 #ifdef HAVE_UNISTD_H
1539 #include <unistd.h>
1540 #endif
1541 #include <stdlib.h>
1542 int main(int c, char **v) { char **t = environ; }])],
1543   tor_cv_have_environ_declared=yes,
1544   tor_cv_have_environ_declared=no))
1546 if test "$tor_cv_have_func_macro" = "yes"; then
1547   AC_DEFINE(HAVE_MACRO__func__, 1, [Defined if the compiler supports __func__])
1550 if test "$tor_cv_have_FUNC_macro" = "yes"; then
1551   AC_DEFINE(HAVE_MACRO__FUNC__, 1, [Defined if the compiler supports __FUNC__])
1554 if test "$tor_cv_have_FUNCTION_macro" = "yes"; then
1555   AC_DEFINE(HAVE_MACRO__FUNCTION__, 1,
1556            [Defined if the compiler supports __FUNCTION__])
1559 if test "$tor_cv_have_environ_declared" = "yes"; then
1560   AC_DEFINE(HAVE_EXTERN_ENVIRON_DECLARED, 1,
1561            [Defined if we have extern char **environ already declared])
1564 # $prefix stores the value of the --prefix command line option, or
1565 # NONE if the option wasn't set.  In the case that it wasn't set, make
1566 # it be the default, so that we can use it to expand directories now.
1567 if test "x$prefix" = "xNONE"; then
1568   prefix=$ac_default_prefix
1571 # and similarly for $exec_prefix
1572 if test "x$exec_prefix" = "xNONE"; then
1573   exec_prefix=$prefix
1576 if test "x$BUILDDIR" = "x"; then
1577   BUILDDIR=`pwd`
1579 AC_SUBST(BUILDDIR)
1580 AH_TEMPLATE([BUILDDIR],[tor's build directory])
1581 AC_DEFINE_UNQUOTED(BUILDDIR,"$BUILDDIR")
1583 if test "x$CONFDIR" = "x"; then
1584   CONFDIR=`eval echo $sysconfdir/tor`
1586 AC_SUBST(CONFDIR)
1587 AH_TEMPLATE([CONFDIR],[tor's configuration directory])
1588 AC_DEFINE_UNQUOTED(CONFDIR,"$CONFDIR")
1590 BINDIR=`eval echo $bindir`
1591 AC_SUBST(BINDIR)
1592 LOCALSTATEDIR=`eval echo $localstatedir`
1593 AC_SUBST(LOCALSTATEDIR)
1595 if test "$bwin32" = "true"; then
1596   # Test if the linker supports the --nxcompat and --dynamicbase options
1597   # for Windows
1598   save_LDFLAGS="$LDFLAGS"
1599   LDFLAGS="-Wl,--nxcompat -Wl,--dynamicbase"
1600   AC_MSG_CHECKING([whether the linker supports DllCharacteristics])
1601   AC_LINK_IFELSE([AC_LANG_PROGRAM([])],
1602     [AC_MSG_RESULT([yes])]
1603     [save_LDFLAGS="$save_LDFLAGS $LDFLAGS"],
1604     [AC_MSG_RESULT([no])]
1605   )
1606   LDFLAGS="$save_LDFLAGS"
1609 # Set CFLAGS _after_ all the above checks, since our warnings are stricter
1610 # than autoconf's macros like.
1611 if test "$GCC" = "yes"; then
1612   # Disable GCC's strict aliasing checks.  They are an hours-to-debug
1613   # accident waiting to happen.
1614   CFLAGS="$CFLAGS -Wall -fno-strict-aliasing"
1615 else
1616   # Override optimization level for non-gcc compilers
1617   CFLAGS="$CFLAGS -O"
1618   enable_gcc_warnings=no
1619   enable_gcc_warnings_advisory=no
1622 # Warnings implies advisory-warnings and -Werror.
1623 if test "$enable_gcc_warnings" = "yes"; then
1624   enable_gcc_warnings_advisory=yes
1625   enable_fatal_warnings=yes
1628 # OS X Lion started deprecating the system openssl. Let's just disable
1629 # all deprecation warnings on OS X. Also, to potentially make the binary
1630 # a little smaller, let's enable dead_strip.
1631 case "$host_os" in
1633  darwin*)
1634     CFLAGS="$CFLAGS -Wno-deprecated-declarations"
1635     LDFLAGS="$LDFLAGS -dead_strip" ;;
1636 esac
1638 # Add some more warnings which we use in development but not in the
1639 # released versions.  (Some relevant gcc versions can't handle these.)
1641 # Note that we have to do this near the end  of the autoconf process, or
1642 # else we may run into problems when these warnings hit on the testing C
1643 # programs that autoconf wants to build.
1644 if test "x$enable_gcc_warnings_advisory" != "xno"; then
1646   case "$host" in
1647     *-*-openbsd* | *-*-bitrig*)
1648       # Some OpenBSD versions (like 4.8) have -Wsystem-headers by default.
1649       # That's fine, except that the headers don't pass -Wredundant-decls.
1650       # Therefore, let's disable -Wsystem-headers when we're building
1651       # with maximal warnings on OpenBSD.
1652       CFLAGS="$CFLAGS -Wno-system-headers" ;;
1653   esac
1655   # GCC4.3 users once report trouble with -Wstrict-overflow=5.  GCC5 users
1656   # have it work better.
1657   # CFLAGS="$CFLAGS -Wstrict-overflow=1"
1659   # This warning was added in gcc 4.3, but it appears to generate
1660   # spurious warnings in gcc 4.4.  I don't know if it works in 4.5.
1661   #CFLAGS="$CFLAGS -Wlogical-op"
1663   m4_foreach_w([warning_flag], [
1664      -Waddress
1665      -Waddress-of-array-temporary
1666      -Waddress-of-temporary
1667      -Wambiguous-macro
1668      -Wanonymous-pack-parens
1669      -Warc
1670      -Warc-abi
1671      -Warc-bridge-casts-disallowed-in-nonarc
1672      -Warc-maybe-repeated-use-of-weak
1673      -Warc-performSelector-leaks
1674      -Warc-repeated-use-of-weak
1675      -Warray-bounds
1676      -Warray-bounds-pointer-arithmetic
1677      -Wasm
1678      -Wasm-operand-widths
1679      -Watomic-properties
1680      -Watomic-property-with-user-defined-accessor
1681      -Wauto-import
1682      -Wauto-storage-class
1683      -Wauto-var-id
1684      -Wavailability
1685      -Wbackslash-newline-escape
1686      -Wbad-array-new-length
1687      -Wbind-to-temporary-copy
1688      -Wbitfield-constant-conversion
1689      -Wbool-conversion
1690      -Wbool-conversions
1691      -Wbuiltin-requires-header
1692      -Wchar-align
1693      -Wcompare-distinct-pointer-types
1694      -Wcomplex-component-init
1695      -Wconditional-type-mismatch
1696      -Wconfig-macros
1697      -Wconstant-conversion
1698      -Wconstant-logical-operand
1699      -Wconstexpr-not-const
1700      -Wcustom-atomic-properties
1701      -Wdangling-field
1702      -Wdangling-initializer-list
1703      -Wdate-time
1704      -Wdelegating-ctor-cycles
1705      -Wdeprecated-implementations
1706      -Wdeprecated-register
1707      -Wdirect-ivar-access
1708      -Wdiscard-qual
1709      -Wdistributed-object-modifiers
1710      -Wdivision-by-zero
1711      -Wdollar-in-identifier-extension
1712      -Wdouble-promotion
1713      -Wduplicate-decl-specifier
1714      -Wduplicate-enum
1715      -Wduplicate-method-arg
1716      -Wduplicate-method-match
1717      -Wduplicated-cond
1718      -Wdynamic-class-memaccess
1719      -Wembedded-directive
1720      -Wempty-translation-unit
1721      -Wenum-conversion
1722      -Wexit-time-destructors
1723      -Wexplicit-ownership-type
1724      -Wextern-initializer
1725      -Wextra
1726      -Wextra-semi
1727      -Wextra-tokens
1728      -Wflexible-array-extensions
1729      -Wfloat-conversion
1730      -Wformat-non-iso
1731      -Wfour-char-constants
1732      -Wgcc-compat
1733      -Wglobal-constructors
1734      -Wgnu-array-member-paren-init
1735      -Wgnu-designator
1736      -Wgnu-static-float-init
1737      -Wheader-guard
1738      -Wheader-hygiene
1739      -Widiomatic-parentheses
1740      -Wignored-attributes
1741      -Wimplicit-atomic-properties
1742      -Wimplicit-conversion-floating-point-to-bool
1743      -Wimplicit-exception-spec-mismatch
1744      -Wimplicit-fallthrough
1745      -Wimplicit-fallthrough-per-function
1746      -Wimplicit-retain-self
1747      -Wimport-preprocessor-directive-pedantic
1748      -Wincompatible-library-redeclaration
1749      -Wincompatible-pointer-types-discards-qualifiers
1750      -Wincomplete-implementation
1751      -Wincomplete-module
1752      -Wincomplete-umbrella
1753      -Winit-self
1754      -Wint-conversions
1755      -Wint-to-void-pointer-cast
1756      -Winteger-overflow
1757      -Winvalid-constexpr
1758      -Winvalid-iboutlet
1759      -Winvalid-noreturn
1760      -Winvalid-pp-token
1761      -Winvalid-source-encoding
1762      -Winvalid-token-paste
1763      -Wknr-promoted-parameter
1764      -Wlanguage-extension-token
1765      -Wlarge-by-value-copy
1766      -Wliteral-conversion
1767      -Wliteral-range
1768      -Wlocal-type-template-args
1769      -Wlogical-op
1770      -Wloop-analysis
1771      -Wmain-return-type
1772      -Wmalformed-warning-check
1773      -Wmethod-signatures
1774      -Wmicrosoft
1775      -Wmicrosoft-exists
1776      -Wmismatched-parameter-types
1777      -Wmismatched-return-types
1778      -Wmissing-field-initializers
1779      -Wmissing-format-attribute
1780      -Wmissing-noreturn
1781      -Wmissing-selector-name
1782      -Wmissing-sysroot
1783      -Wmissing-variable-declarations
1784      -Wmodule-conflict
1785      -Wnested-anon-types
1786      -Wnewline-eof
1787      -Wnon-literal-null-conversion
1788      -Wnon-pod-varargs
1789      -Wnonportable-cfstrings
1790      -Wnormalized=id
1791      -Wnull-arithmetic
1792      -Wnull-character
1793      -Wnull-conversion
1794      -Wnull-dereference
1795      -Wout-of-line-declaration
1796      -Wover-aligned
1797      -Woverlength-strings
1798      -Woverride-init
1799      -Woverriding-method-mismatch
1800      -Wpointer-type-mismatch
1801      -Wpredefined-identifier-outside-function
1802      -Wprotocol-property-synthesis-ambiguity
1803      -Wreadonly-iboutlet-property
1804      -Wreadonly-setter-attrs
1805      -Wreceiver-expr
1806      -Wreceiver-forward-class
1807      -Wreceiver-is-weak
1808      -Wreinterpret-base-class
1809      -Wrequires-super-attribute
1810      -Wreserved-user-defined-literal
1811      -Wreturn-stack-address
1812      -Wsection
1813      -Wselector-type-mismatch
1814      -Wsentinel
1815      -Wserialized-diagnostics
1816      -Wshadow
1817      -Wshift-count-negative
1818      -Wshift-count-overflow
1819      -Wshift-negative-value
1820      -Wshift-overflow=2
1821      -Wshift-sign-overflow
1822      -Wshorten-64-to-32
1823      -Wsizeof-array-argument
1824      -Wsource-uses-openmp
1825      -Wstatic-float-init
1826      -Wstatic-in-inline
1827      -Wstatic-local-in-inline
1828      -Wstrict-overflow=1
1829      -Wstring-compare
1830      -Wstring-conversion
1831      -Wstrlcpy-strlcat-size
1832      -Wstrncat-size
1833      -Wsuggest-attribute=format
1834      -Wsuggest-attribute=noreturn
1835      -Wsuper-class-method-mismatch
1836      -Wswitch-bool
1837      -Wsync-nand
1838      -Wtautological-constant-out-of-range-compare
1839      -Wtentative-definition-incomplete-type
1840      -Wtrampolines
1841      -Wtype-safety
1842      -Wtypedef-redefinition
1843      -Wtypename-missing
1844      -Wundefined-inline
1845      -Wundefined-internal
1846      -Wundefined-reinterpret-cast
1847      -Wunicode
1848      -Wunicode-whitespace
1849      -Wunknown-warning-option
1850      -Wunnamed-type-template-args
1851      -Wunneeded-member-function
1852      -Wunsequenced
1853      -Wunsupported-visibility
1854      -Wunused-but-set-parameter
1855      -Wunused-but-set-variable
1856      -Wunused-command-line-argument
1857      -Wunused-const-variable=2
1858      -Wunused-exception-parameter
1859      -Wunused-local-typedefs
1860      -Wunused-member-function
1861      -Wunused-sanitize-argument
1862      -Wunused-volatile-lvalue
1863      -Wuser-defined-literals
1864      -Wvariadic-macros
1865      -Wvector-conversion
1866      -Wvector-conversions
1867      -Wvexing-parse
1868      -Wvisibility
1869      -Wvla-extension
1870      -Wzero-length-array
1871   ], [ TOR_CHECK_CFLAGS([warning_flag]) ])
1873 dnl    We should re-enable this in some later version.  Clang doesn't
1874 dnl    mind, but it causes trouble with GCC.
1875 dnl     -Wstrict-overflow=2
1877 dnl    These seem to require annotations that we don't currently use,
1878 dnl    and they give false positives in our pthreads wrappers. (Clang 4)
1879 dnl     -Wthread-safety
1880 dnl     -Wthread-safety-analysis
1881 dnl     -Wthread-safety-attributes
1882 dnl     -Wthread-safety-beta
1883 dnl     -Wthread-safety-precise
1885   CFLAGS="$CFLAGS -W -Wfloat-equal -Wundef -Wpointer-arith"
1886   CFLAGS="$CFLAGS -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings"
1887   CFLAGS="$CFLAGS -Wredundant-decls -Wchar-subscripts -Wcomment -Wformat=2"
1888   CFLAGS="$CFLAGS -Wwrite-strings"
1889   CFLAGS="$CFLAGS -Wnested-externs -Wbad-function-cast -Wswitch-enum"
1890   CFLAGS="$CFLAGS -Waggregate-return -Wpacked -Wunused"
1891   CFLAGS="$CFLAGS -Wunused-parameter "
1892   # These interfere with building main() { return 0; }, which autoconf
1893   # likes to use as its default program.
1894   CFLAGS="$CFLAGS -Wold-style-definition -Wmissing-declarations"
1896   if test "$tor_cv_cflags__Wnull_dereference" = "yes"; then
1897     AC_DEFINE([HAVE_CFLAG_WNULL_DEREFERENCE], 1, [True if we have -Wnull-dereference])
1898   fi
1899   if test "$tor_cv_cflags__Woverlength_strings" = "yes"; then
1900     AC_DEFINE([HAVE_CFLAG_WOVERLENGTH_STRINGS], 1, [True if we have -Woverlength-strings])
1901   fi
1903   if test "x$enable_fatal_warnings" = "xyes"; then
1904     # I'd like to use TOR_CHECK_CFLAGS here, but I can't, since the
1905     # default autoconf programs are full of errors.
1906     CFLAGS="$CFLAGS -Werror"
1907   fi
1911 if test "$enable_coverage" = "yes" && test "$have_clang" = "no"; then
1912    case "$host_os" in
1913     darwin*)
1914       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.])
1915    esac
1918 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent $TOR_CPPFLAGS_openssl $TOR_CPPFLAGS_zlib"
1920 AC_CONFIG_FILES([
1921         Doxyfile
1922         Makefile
1923         contrib/dist/suse/tor.sh
1924         contrib/operator-tools/tor.logrotate
1925         contrib/dist/tor.sh
1926         contrib/dist/torctl
1927         contrib/dist/tor.service
1928         src/config/torrc.sample
1929         src/config/torrc.minimal
1930         scripts/maint/checkOptionDocs.pl
1931         scripts/maint/updateVersions.pl
1934 if test "x$asciidoc" = "xtrue" && test "$ASCIIDOC" = "none"; then
1935   regular_mans="doc/tor doc/tor-gencert doc/tor-resolve doc/torify"
1936   for file in $regular_mans ; do
1937     if ! [[ -f "$srcdir/$file.1.in" ]] || ! [[ -f "$srcdir/$file.html.in" ]] ; then
1938       echo "==================================";
1939       echo;
1940       echo "Building Tor has failed since manpages cannot be built.";
1941       echo;
1942       echo "You need asciidoc installed to be able to build the manpages.";
1943       echo "To build without manpages, use the --disable-asciidoc argument";
1944       echo "when calling configure.";
1945       echo;
1946       echo "==================================";
1947       exit 1;
1948     fi
1949   done
1952 AC_OUTPUT