changes: file for 32240
[tor.git] / configure.ac
blob771769422e2e4370c6ad4da1baaf4abca0e33bb5
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.17-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, [ \
217         python3 \
218         python3.8 python3.7 python3.6 python3.5 python3.4 \
219         python \
220         python2 python2.7])
221 if test "x$PYTHON" = "x"; then
222   AC_MSG_WARN([Python unavailable; some tests will not be run.])
224 AM_CONDITIONAL(USEPYTHON, [test "x$PYTHON" != "x"])
226 ifdef([AC_C_FLEXIBLE_ARRAY_MEMBER], [
227 AC_C_FLEXIBLE_ARRAY_MEMBER
228 ], [
229  dnl Maybe we've got an old autoconf...
230  AC_CACHE_CHECK([for flexible array members],
231      tor_cv_c_flexarray,
232      [AC_COMPILE_IFELSE(
233        AC_LANG_PROGRAM([
234  struct abc { int a; char b[]; };
235 ], [
236  struct abc *def = malloc(sizeof(struct abc)+sizeof(char));
237  def->b[0] = 33;
239   [tor_cv_c_flexarray=yes],
240   [tor_cv_c_flexarray=no])])
241  if test "$tor_cv_flexarray" = "yes"; then
242    AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [], [Define to nothing if C supports flexible array members, and to 1 if it does not.])
243  else
244    AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [1], [Define to nothing if C supports flexible array members, and to 1 if it does not.])
245  fi
248 AC_CACHE_CHECK([for working C99 mid-block declaration syntax],
249       tor_cv_c_c99_decl,
250       [AC_COMPILE_IFELSE(
251          [AC_LANG_PROGRAM([], [int x; x = 3; int y; y = 4 + x;])],
252          [tor_cv_c_c99_decl=yes],
253          [tor_cv_c_c99_decl=no] )])
254 if test "$tor_cv_c_c99_decl" != "yes"; then
255   AC_MSG_ERROR([Your compiler doesn't support c99 mid-block declarations. This is required as of Tor 0.2.6.x])
258 AC_CACHE_CHECK([for working C99 designated initializers],
259       tor_cv_c_c99_designated_init,
260       [AC_COMPILE_IFELSE(
261          [AC_LANG_PROGRAM([struct s { int a; int b; };],
262                [[ struct s ss = { .b = 5, .a = 6 }; ]])],
263          [tor_cv_c_c99_designated_init=yes],
264          [tor_cv_c_c99_designated_init=no] )])
266 if test "$tor_cv_c_c99_designated_init" != "yes"; then
267   AC_MSG_ERROR([Your compiler doesn't support c99 designated initializers. This is required as of Tor 0.2.6.x])
270 TORUSER=_tor
271 AC_ARG_WITH(tor-user,
272         AS_HELP_STRING(--with-tor-user=NAME, [specify username for tor daemon]),
273         [
274            TORUSER=$withval
275         ]
277 AC_SUBST(TORUSER)
279 TORGROUP=_tor
280 AC_ARG_WITH(tor-group,
281         AS_HELP_STRING(--with-tor-group=NAME, [specify group name for tor daemon]),
282         [
283            TORGROUP=$withval
284         ]
286 AC_SUBST(TORGROUP)
289 dnl If _WIN32 is defined and non-zero, we are building for win32
290 AC_MSG_CHECKING([for win32])
291 AC_RUN_IFELSE([AC_LANG_SOURCE([
292 int main(int c, char **v) {
293 #ifdef _WIN32
294 #if _WIN32
295   return 0;
296 #else
297   return 1;
298 #endif
299 #else
300   return 2;
301 #endif
302 }])],
303 bwin32=true; AC_MSG_RESULT([yes]),
304 bwin32=false; AC_MSG_RESULT([no]),
305 bwin32=cross; AC_MSG_RESULT([cross])
308 if test "$bwin32" = "cross"; then
309 AC_MSG_CHECKING([for win32 (cross)])
310 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
311 #ifdef _WIN32
312 int main(int c, char **v) {return 0;}
313 #else
314 #error
315 int main(int c, char **v) {return x(y);}
316 #endif
317 ])],
318 bwin32=true; AC_MSG_RESULT([yes]),
319 bwin32=false; AC_MSG_RESULT([no]))
322 AH_BOTTOM([
323 #ifdef _WIN32
324 /* Defined to access windows functions and definitions for >=WinXP */
325 # ifndef WINVER
326 #  define WINVER 0x0501
327 # endif
329 /* Defined to access _other_ windows functions and definitions for >=WinXP */
330 # ifndef _WIN32_WINNT
331 #  define _WIN32_WINNT 0x0501
332 # endif
334 /* Defined to avoid including some windows headers as part of Windows.h */
335 # ifndef WIN32_LEAN_AND_MEAN
336 #  define WIN32_LEAN_AND_MEAN 1
337 # endif
338 #endif
342 AM_CONDITIONAL(BUILD_NT_SERVICES, test "x$bwin32" = "xtrue")
344 dnl Enable C99 when compiling with MIPSpro
345 AC_MSG_CHECKING([for MIPSpro compiler])
346 AC_COMPILE_IFELSE([AC_LANG_PROGRAM(, [
347 #if (defined(__sgi) && defined(_COMPILER_VERSION))
348 #error
349   return x(y);
350 #endif
351 ])],
352 bmipspro=false; AC_MSG_RESULT(no),
353 bmipspro=true; AC_MSG_RESULT(yes))
355 if test "$bmipspro" = "true"; then
356   CFLAGS="$CFLAGS -c99"
359 AC_C_BIGENDIAN
361 AC_SEARCH_LIBS(socket, [socket network])
362 AC_SEARCH_LIBS(gethostbyname, [nsl])
363 AC_SEARCH_LIBS(dlopen, [dl])
364 AC_SEARCH_LIBS(inet_aton, [resolv])
365 AC_SEARCH_LIBS(backtrace, [execinfo])
366 saved_LIBS="$LIBS"
367 AC_SEARCH_LIBS([clock_gettime], [rt])
368 if test "$LIBS" != "$saved_LIBS"; then
369    # Looks like we need -lrt for clock_gettime().
370    have_rt=yes
373 if test "$bwin32" = "false"; then
374   AC_SEARCH_LIBS(pthread_create, [pthread])
375   AC_SEARCH_LIBS(pthread_detach, [pthread])
378 AM_CONDITIONAL(THREADS_WIN32, test "$bwin32" = "true")
379 AM_CONDITIONAL(THREADS_PTHREADS, test "$bwin32" = "false")
381 AC_CHECK_FUNCS(
382         _NSGetEnviron \
383         RtlSecureZeroMemory \
384         SecureZeroMemory \
385         accept4 \
386         backtrace \
387         backtrace_symbols_fd \
388         eventfd \
389         explicit_bzero \
390         timingsafe_memcmp \
391         flock \
392         ftime \
393         getaddrinfo \
394         getifaddrs \
395         getpass \
396         getrlimit \
397         gettimeofday \
398         gmtime_r \
399         gnu_get_libc_version \
400         htonll \
401         inet_aton \
402         ioctl \
403         issetugid \
404         llround \
405         localtime_r \
406         lround \
407         memmem \
408         memset_s \
409         pipe \
410         pipe2 \
411         prctl \
412         readpassphrase \
413         rint \
414         sigaction \
415         socketpair \
416         statvfs \
417         strlcat \
418         strlcpy \
419         strnlen \
420         strptime \
421         strtok_r \
422         strtoull \
423         sysconf \
424         sysctl \
425         truncate \
426         uname \
427         usleep \
428         vasprintf \
429         _vscprintf
432 # Apple messed up when they added two functions functions in Sierra: they
433 # forgot to decorate them with appropriate AVAILABLE_MAC_OS_VERSION
434 # checks. So we should only probe for those functions if we are sure that we
435 # are not targetting OSX 10.11 or earlier.
436 AC_MSG_CHECKING([for a pre-Sierra OSX build target])
437 AC_TRY_COMPILE([
438 #ifdef __APPLE__
439 #  include <AvailabilityMacros.h>
440 #  ifndef MAC_OS_X_VERSION_10_12
441 #    define MAC_OS_X_VERSION_10_12 101200
442 #  endif
443 #  if defined(MAC_OS_X_VERSION_MIN_REQUIRED)
444 #    if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_12
445 #      error "Running on Mac OSX 10.11 or earlier"
446 #    endif
447 #  endif
448 #endif
449 ], [],
450    [on_macos_pre_10_12=no ; AC_MSG_RESULT([no])],
451    [on_macos_pre_10_12=yes; AC_MSG_RESULT([yes])])
453 if test "$on_macos_pre_10_12" = "no"; then
454   AC_CHECK_FUNCS(
455         clock_gettime \
456         getentropy \
457   )
460 if test "$bwin32" != "true"; then
461   AC_CHECK_HEADERS(pthread.h)
462   AC_CHECK_FUNCS(pthread_create)
463   AC_CHECK_FUNCS(pthread_condattr_setclock)
466 if test "$bwin32" = "true"; then
467   AC_CHECK_DECLS([SecureZeroMemory, _getwch], , , [
468 #include <windows.h>
469 #include <conio.h>
470 #include <wchar.h>
471                  ])
474 AM_CONDITIONAL(BUILD_READPASSPHRASE_C,
475   test "x$ac_cv_func_readpassphrase" = "xno" && test "$bwin32" = "false")
477 dnl ------------------------------------------------------
478 dnl Where do you live, libevent?  And how do we call you?
480 if test "$bwin32" = "true"; then
481   TOR_LIB_WS32=-lws2_32
482   TOR_LIB_IPHLPAPI=-liphlpapi
483   # Some of the cargo-cults recommend -lwsock32 as well, but I don't
484   # think it's actually necessary.
485   TOR_LIB_GDI=-lgdi32
486 else
487   TOR_LIB_WS32=
488   TOR_LIB_GDI=
490 AC_SUBST(TOR_LIB_WS32)
491 AC_SUBST(TOR_LIB_GDI)
492 AC_SUBST(TOR_LIB_IPHLPAPI)
494 tor_libevent_pkg_redhat="libevent"
495 tor_libevent_pkg_debian="libevent-dev"
496 tor_libevent_devpkg_redhat="libevent-devel"
497 tor_libevent_devpkg_debian="libevent-dev"
499 dnl On Gnu/Linux or any place we require it, we'll add librt to the Libevent
500 dnl linking for static builds.
501 STATIC_LIBEVENT_FLAGS=""
502 if test "$enable_static_libevent" = "yes"; then
503     if test "$have_rt" = "yes"; then
504       STATIC_LIBEVENT_FLAGS=" -lrt "
505     fi
508 TOR_SEARCH_LIBRARY(libevent, $trylibeventdir, [-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32], [
509 #ifdef _WIN32
510 #include <winsock2.h>
511 #endif
512 #include <sys/time.h>
513 #include <sys/types.h>
514 #include <event2/event.h>], [
515 #ifdef _WIN32
516 #include <winsock2.h>
517 #endif
518 struct event_base;
519 struct event_base *event_base_new(void);],
520     [
521 #ifdef _WIN32
522 {WSADATA d; WSAStartup(0x101,&d); }
523 #endif
524 event_base_new();
525 ], [--with-libevent-dir], [/opt/libevent])
527 dnl Determine the incantation needed to link libevent.
528 save_LIBS="$LIBS"
529 save_LDFLAGS="$LDFLAGS"
530 save_CPPFLAGS="$CPPFLAGS"
532 LIBS="$STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32 $save_LIBS"
533 LDFLAGS="$TOR_LDFLAGS_libevent $LDFLAGS"
534 CPPFLAGS="$TOR_CPPFLAGS_libevent $CPPFLAGS"
536 AC_CHECK_HEADERS(event2/event.h event2/dns.h event2/bufferevent_ssl.h)
538 if test "$enable_static_libevent" = "yes"; then
539    if test "$tor_cv_library_libevent_dir" = "(system)"; then
540      AC_MSG_ERROR("You must specify an explicit --with-libevent-dir=x option when using --enable-static-libevent")
541    else
542      TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent.a $STATIC_LIBEVENT_FLAGS"
543    fi
544 else
545      if test "x$ac_cv_header_event2_event_h" = "xyes"; then
546        AC_SEARCH_LIBS(event_new, [event event_core], , AC_MSG_ERROR("libevent2 is installed but linking it failed while searching for event_new"))
547        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"))
549        if test "$ac_cv_search_event_new" != "none required"; then
550          TOR_LIBEVENT_LIBS="$ac_cv_search_event_new"
551        fi
552        if test "$ac_cv_search_evdns_base_new" != "none required"; then
553          TOR_LIBEVENT_LIBS="$ac_cv_search_evdns_base_new $TOR_LIBEVENT_LIBS"
554        fi
555      else
556        AC_MSG_ERROR("libevent2 is required but the headers could not be found")
557      fi
560 dnl Now check for particular libevent functions.
561 AC_CHECK_FUNCS([evutil_secure_rng_set_urandom_device_file \
562                 evutil_secure_rng_add_bytes \
565 LIBS="$save_LIBS"
566 LDFLAGS="$save_LDFLAGS"
567 CPPFLAGS="$save_CPPFLAGS"
569 dnl Check that libevent is at least at version 2.0.10, the first stable
570 dnl release of its series
571 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent"
572 AC_MSG_CHECKING([whether Libevent is new enough])
573 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
574 #include <event2/event.h>
575 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 0x02000a00
576 #error
577 int x = y(zz);
578 #else
579 int x = 1;
580 #endif
581 ])], [ AC_MSG_RESULT([yes]) ],
582    [ AC_MSG_RESULT([no])
583      AC_MSG_ERROR([Libevent is not new enough.  We require 2.0.10-stable or later]) ] )
585 LIBS="$save_LIBS"
586 LDFLAGS="$save_LDFLAGS"
587 CPPFLAGS="$save_CPPFLAGS"
589 AC_SUBST(TOR_LIBEVENT_LIBS)
591 dnl ------------------------------------------------------
592 dnl Where do you live, libm?
594 dnl On some platforms (Haiku/BeOS) the math library is
595 dnl part of libroot. In which case don't link against lm
596 TOR_LIB_MATH=""
597 save_LIBS="$LIBS"
598 AC_SEARCH_LIBS(pow, [m], , AC_MSG_ERROR([Could not find pow in libm or libc.]))
599 if test "$ac_cv_search_pow" != "none required"; then
600     TOR_LIB_MATH="$ac_cv_search_pow"
602 LIBS="$save_LIBS"
603 AC_SUBST(TOR_LIB_MATH)
605 dnl ------------------------------------------------------
606 dnl Where do you live, openssl?  And how do we call you?
608 tor_openssl_pkg_redhat="openssl"
609 tor_openssl_pkg_debian="libssl-dev"
610 tor_openssl_devpkg_redhat="openssl-devel"
611 tor_openssl_devpkg_debian="libssl-dev"
613 ALT_openssl_WITHVAL=""
614 AC_ARG_WITH(ssl-dir,
615   AS_HELP_STRING(--with-ssl-dir=PATH, [obsolete alias for --with-openssl-dir]),
616   [
617       if test "x$withval" != "xno" && test "x$withval" != "x"; then
618          ALT_openssl_WITHVAL="$withval"
619       fi
620   ])
622 TOR_SEARCH_LIBRARY(openssl, $tryssldir, [-lssl -lcrypto $TOR_LIB_GDI],
623     [#include <openssl/rand.h>],
624     [void RAND_add(const void *buf, int num, double entropy);],
625     [RAND_add((void*)0,0,0);], [],
626     [/usr/local/openssl /usr/lib/openssl /usr/local/ssl /usr/lib/ssl /usr/local /usr/athena /opt/openssl])
628 dnl XXXX check for OPENSSL_VERSION_NUMBER == SSLeay()
630 if test "$enable_static_openssl" = "yes"; then
631    if test "$tor_cv_library_openssl_dir" = "(system)"; then
632      AC_MSG_ERROR("You must specify an explicit --with-openssl-dir=x option when using --enable-static-openssl")
633    else
634      TOR_OPENSSL_LIBS="$TOR_LIBDIR_openssl/libssl.a $TOR_LIBDIR_openssl/libcrypto.a"
635    fi
636 else
637      TOR_OPENSSL_LIBS="-lssl -lcrypto"
639 AC_SUBST(TOR_OPENSSL_LIBS)
641 dnl Now check for particular openssl functions.
642 save_LIBS="$LIBS"
643 save_LDFLAGS="$LDFLAGS"
644 save_CPPFLAGS="$CPPFLAGS"
645 LIBS="$TOR_OPENSSL_LIBS $LIBS"
646 LDFLAGS="$TOR_LDFLAGS_openssl $LDFLAGS"
647 CPPFLAGS="$TOR_CPPFLAGS_openssl $CPPFLAGS"
649 AC_TRY_COMPILE([
650 #include <openssl/opensslv.h>
651 #if !defined(LIBRESSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER < 0x1000100fL
652 #error "too old"
653 #endif
654    ], [],
655    [ : ],
656    [ 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.]) ])
658 AC_TRY_COMPILE([
659 #include <openssl/opensslv.h>
660 #include <openssl/evp.h>
661 #if defined(OPENSSL_NO_EC) || defined(OPENSSL_NO_ECDH) || defined(OPENSSL_NO_ECDSA)
662 #error "no ECC"
663 #endif
664 #if !defined(NID_X9_62_prime256v1) || !defined(NID_secp224r1)
665 #error "curves unavailable"
666 #endif
667    ], [],
668    [ : ],
669    [ 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.]) ])
671 AC_CHECK_MEMBERS([struct ssl_method_st.get_cipher_by_char], , ,
672 [#include <openssl/ssl.h>
675 AC_CHECK_FUNCS([ \
676                 SSL_SESSION_get_master_key \
677                 SSL_get_server_random \
678                 SSL_get_client_ciphers \
679                 SSL_get_client_random \
680                 SSL_CTX_set1_groups_list \
681                 SSL_CIPHER_find \
682                 SSL_CTX_set_security_level \
683                 TLS_method
684                ])
686 dnl Check if OpenSSL has scrypt implementation.
687 AC_CHECK_FUNCS([ EVP_PBE_scrypt ])
689 dnl Check if OpenSSL structures are opaque
690 AC_CHECK_MEMBERS([SSL.state], , ,
691 [#include <openssl/ssl.h>
694 LIBS="$save_LIBS"
695 LDFLAGS="$save_LDFLAGS"
696 CPPFLAGS="$save_CPPFLAGS"
698 dnl ------------------------------------------------------
699 dnl Where do you live, zlib?  And how do we call you?
701 tor_zlib_pkg_redhat="zlib"
702 tor_zlib_pkg_debian="zlib1g"
703 tor_zlib_devpkg_redhat="zlib-devel"
704 tor_zlib_devpkg_debian="zlib1g-dev"
706 TOR_SEARCH_LIBRARY(zlib, $tryzlibdir, [-lz],
707     [#include <zlib.h>],
708     [const char * zlibVersion(void);],
709     [zlibVersion();], [--with-zlib-dir],
710     [/opt/zlib])
712 if test "$enable_static_zlib" = "yes"; then
713    if test "$tor_cv_library_zlib_dir" = "(system)"; then
714      AC_MSG_ERROR("You must specify an explicit --with-zlib-dir=x option when
715  using --enable-static-zlib")
716    else
717      TOR_ZLIB_LIBS="$TOR_LIBDIR_zlib/libz.a"
718    fi
719 else
720      TOR_ZLIB_LIBS="-lz"
722 AC_SUBST(TOR_ZLIB_LIBS)
724 dnl ----------------------------------------------------------------------
725 dnl Check if libcap is available for capabilities.
727 tor_cap_pkg_debian="libcap2"
728 tor_cap_pkg_redhat="libcap"
729 tor_cap_devpkg_debian="libcap-dev"
730 tor_cap_devpkg_redhat="libcap-devel"
732 AC_CHECK_LIB([cap], [cap_init], [],
733   AC_MSG_NOTICE([Libcap was not found. Capabilities will not be usable.])
735 AC_CHECK_FUNCS(cap_set_proc)
737 dnl ---------------------------------------------------------------------
738 dnl Now that we know about our major libraries, we can check for compiler
739 dnl and linker hardening options.  We need to do this with the libraries known,
740 dnl since sometimes the linker will like an option but not be willing to
741 dnl use it with a build of a library.
743 all_ldflags_for_check="$TOR_LDFLAGS_zlib $TOR_LDFLAGS_openssl $TOR_LDFLAGS_libevent"
744 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"
746 CFLAGS_FTRAPV=
747 CFLAGS_FWRAPV=
748 CFLAGS_ASAN=
749 CFLAGS_UBSAN=
751 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
752 #if !defined(__clang__)
753 #error
754 #endif])], have_clang=yes, have_clang=no)
756 if test "x$enable_gcc_hardening" != "xno"; then
757     CFLAGS="$CFLAGS -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2"
758     if test "x$have_clang" = "xyes"; then
759         TOR_CHECK_CFLAGS(-Qunused-arguments)
760     fi
761     TOR_CHECK_CFLAGS(-fstack-protector-all, also_link)
762     AS_VAR_PUSHDEF([can_compile], [tor_cv_cflags_-fstack-protector-all])
763     AS_VAR_PUSHDEF([can_link], [tor_can_link_-fstack-protector-all])
764 m4_ifdef([AS_VAR_IF],[
765     AS_VAR_IF(can_compile, [yes],
766         AS_VAR_IF(can_link, [yes],
767                   [],
768                   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.)]))
769         )])
770     AS_VAR_POPDEF([can_link])
771     AS_VAR_POPDEF([can_compile])
772     TOR_CHECK_CFLAGS(-Wstack-protector)
773     TOR_CHECK_CFLAGS(--param ssp-buffer-size=1)
774     if test "$bwin32" = "false"; then
775        TOR_CHECK_CFLAGS(-fPIE)
776        TOR_CHECK_LDFLAGS(-pie, "$all_ldflags_for_check", "$all_libs_for_check")
777     fi
778     TOR_TRY_COMPILE_WITH_CFLAGS(-fwrapv, also_link, CFLAGS_FWRAPV="-fwrapv", true)
781 if test "x$enable_expensive_hardening" = "xyes"; then
782     TOR_TRY_COMPILE_WITH_CFLAGS(-ftrapv, also_link, CFLAGS_FTRAPV="-ftrapv", true)
783    if test "$tor_cv_cflags__ftrapv" = "yes" && test "$tor_can_link__ftrapv" != "yes"; then
784       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.])
785    fi
787    if test "$tor_cv_cflags__ftrapv" != "yes"; then
788      AC_MSG_ERROR([You requested expensive hardening, but the compiler does not seem to support -ftrapv.])
789    fi
791    TOR_TRY_COMPILE_WITH_CFLAGS([-fsanitize=address], also_link, CFLAGS_ASAN="-fsanitize=address", true)
792     if test "$tor_cv_cflags__fsanitize_address" = "yes" && test "$tor_can_link__fsanitize_address" != "yes"; then
793       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*])
794     fi
796    TOR_TRY_COMPILE_WITH_CFLAGS([-fsanitize=undefined], also_link, CFLAGS_UBSAN="-fsanitize=undefined", true)
797     if test "$tor_cv_cflags__fsanitize_address" = "yes" && test "$tor_can_link__fsanitize_address" != "yes"; then
798       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*])
799     fi
801 TOR_CHECK_CFLAGS([-fno-omit-frame-pointer])
804 CFLAGS_BUGTRAP="$CFLAGS_FTRAPV $CFLAGS_ASAN $CFLAGS_UBSAN"
805 CFLAGS_CONSTTIME="$CFLAGS_FWRAPV"
807 mulodi_fixes_ftrapv=no
808 if test "$have_clang" = "yes"; then
809   saved_CFLAGS="$CFLAGS"
810   CFLAGS="$CFLAGS $CFLAGS_FTRAPV"
811   AC_MSG_CHECKING([whether clang -ftrapv can link a 64-bit int multiply])
812   AC_LINK_IFELSE([
813       AC_LANG_SOURCE([[
814           #include <stdint.h>
815           #include <stdlib.h>
816           int main(int argc, char **argv)
817           {
818             int64_t x = ((int64_t)atoi(argv[1])) * (int64_t)atoi(argv[2])
819                         * (int64_t)atoi(argv[3]);
820             return x == 9;
821           } ]])],
822           [ftrapv_can_link=yes; AC_MSG_RESULT([yes])],
823           [ftrapv_can_link=no; AC_MSG_RESULT([no])])
824   if test "$ftrapv_can_link" = "no"; then
825     AC_MSG_CHECKING([whether defining __mulodi4 fixes that])
826     AC_LINK_IFELSE([
827       AC_LANG_SOURCE([[
828           #include <stdint.h>
829           #include <stdlib.h>
830           int64_t __mulodi4(int64_t a, int64_t b, int *overflow) {
831              *overflow=0;
832              return a;
833           }
834           int main(int argc, char **argv)
835           {
836             int64_t x = ((int64_t)atoi(argv[1])) * (int64_t)atoi(argv[2])
837                         * (int64_t)atoi(argv[3]);
838             return x == 9;
839           } ]])],
840           [mulodi_fixes_ftrapv=yes; AC_MSG_RESULT([yes])],
841           [mulodi_fixes_ftrapv=no; AC_MSG_RESULT([no])])
842   fi
843   CFLAGS="$saved_CFLAGS"
846 AM_CONDITIONAL(ADD_MULODI4, test "$mulodi_fixes_ftrapv" = "yes")
848 dnl These cflags add bunches of branches, and we haven't been able to
849 dnl persuade ourselves that they're suitable for code that needs to be
850 dnl constant time.
851 AC_SUBST(CFLAGS_BUGTRAP)
852 dnl These cflags are variant ones sutable for code that needs to be
853 dnl constant-time.
854 AC_SUBST(CFLAGS_CONSTTIME)
856 if test "x$enable_linker_hardening" != "xno"; then
857     TOR_CHECK_LDFLAGS(-z relro -z now, "$all_ldflags_for_check", "$all_libs_for_check")
860 # For backtrace support
861 TOR_CHECK_LDFLAGS(-rdynamic)
863 dnl ------------------------------------------------------
864 dnl Now see if we have a -fomit-frame-pointer compiler option.
866 saved_CFLAGS="$CFLAGS"
867 TOR_CHECK_CFLAGS(-fomit-frame-pointer)
868 F_OMIT_FRAME_POINTER=''
869 if test "$saved_CFLAGS" != "$CFLAGS"; then
870   if test "x$enable_expensive_hardening" != "xyes"; then
871     F_OMIT_FRAME_POINTER='-fomit-frame-pointer'
872   fi
874 CFLAGS="$saved_CFLAGS"
875 AC_SUBST(F_OMIT_FRAME_POINTER)
877 dnl ------------------------------------------------------
878 dnl If we are adding -fomit-frame-pointer (or if the compiler's doing it
879 dnl for us, as GCC 4.6 and later do at many optimization levels), then
880 dnl we should try to add -fasynchronous-unwind-tables so that our backtrace
881 dnl code will work.
882 TOR_CHECK_CFLAGS(-fasynchronous-unwind-tables)
884 dnl ============================================================
885 dnl Check for libseccomp
887 if test "x$enable_seccomp" != "xno"; then
888   AC_CHECK_HEADERS([seccomp.h])
889   AC_SEARCH_LIBS(seccomp_init, [seccomp])
892 dnl ============================================================
893 dnl Check for libscrypt
895 if test "x$enable_libscrypt" != "xno"; then
896   AC_CHECK_HEADERS([libscrypt.h])
897   AC_SEARCH_LIBS(libscrypt_scrypt, [scrypt])
898   AC_CHECK_FUNCS([libscrypt_scrypt])
901 dnl ============================================================
902 dnl We need an implementation of curve25519.
904 dnl set these defaults.
905 build_curve25519_donna=no
906 build_curve25519_donna_c64=no
907 use_curve25519_donna=no
908 use_curve25519_nacl=no
909 CURVE25519_LIBS=
911 dnl The best choice is using curve25519-donna-c64, but that requires
912 dnl that we
913 AC_CACHE_CHECK([whether we can use curve25519-donna-c64],
914   tor_cv_can_use_curve25519_donna_c64,
915   [AC_RUN_IFELSE(
916     [AC_LANG_PROGRAM([dnl
917       #include <stdint.h>
918       typedef unsigned uint128_t __attribute__((mode(TI)));
919   int func(uint64_t a, uint64_t b) {
920            uint128_t c = ((uint128_t)a) * b;
921            int ok = ((uint64_t)(c>>96)) == 522859 &&
922              (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
923                  (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
924                  (((uint64_t)(c))&0xffffffffL) == 0;
925            return ok;
926       }
927   ], [dnl
928     int ok = func( ((uint64_t)2000000000) * 1000000000,
929                    ((uint64_t)1234567890) << 24);
930         return !ok;
931       ])],
932   [tor_cv_can_use_curve25519_donna_c64=yes],
933       [tor_cv_can_use_curve25519_donna_c64=no],
934   [AC_LINK_IFELSE(
935         [AC_LANG_PROGRAM([dnl
936       #include <stdint.h>
937       typedef unsigned uint128_t __attribute__((mode(TI)));
938   int func(uint64_t a, uint64_t b) {
939            uint128_t c = ((uint128_t)a) * b;
940            int ok = ((uint64_t)(c>>96)) == 522859 &&
941              (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
942                  (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
943                  (((uint64_t)(c))&0xffffffffL) == 0;
944            return ok;
945       }
946   ], [dnl
947     int ok = func( ((uint64_t)2000000000) * 1000000000,
948                  ((uint64_t)1234567890) << 24);
949         return !ok;
950       ])],
951           [tor_cv_can_use_curve25519_donna_c64=cross],
952       [tor_cv_can_use_curve25519_donna_c64=no])])])
954 AC_CHECK_HEADERS([crypto_scalarmult_curve25519.h \
955                   nacl/crypto_scalarmult_curve25519.h])
957 AC_CACHE_CHECK([for nacl compiled with a fast curve25519 implementation],
958   tor_cv_can_use_curve25519_nacl,
959   [tor_saved_LIBS="$LIBS"
960    LIBS="$LIBS -lnacl"
961    AC_LINK_IFELSE(
962      [AC_LANG_PROGRAM([dnl
963        #ifdef HAVE_CRYPTO_SCALARMULT_CURVE25519_H
964        #include <crypto_scalarmult_curve25519.h>
965    #elif defined(HAVE_NACL_CRYPTO_SCALARMULT_CURVE25519_H)
966    #include <nacl/crypto_scalarmult_curve25519.h>
967    #endif
968        #ifdef crypto_scalarmult_curve25519_ref_BYTES
969    #error Hey, this is the reference implementation! That's not fast.
970    #endif
971      ], [
972    unsigned char *a, *b, *c; crypto_scalarmult_curve25519(a,b,c);
973      ])], [tor_cv_can_use_curve25519_nacl=yes],
974      [tor_cv_can_use_curve25519_nacl=no])
975    LIBS="$tor_saved_LIBS" ])
977  dnl Okay, now we need to figure out which one to actually use. Fall back
978  dnl to curve25519-donna.c
980  if test "x$tor_cv_can_use_curve25519_donna_c64" != "xno"; then
981    build_curve25519_donna_c64=yes
982    use_curve25519_donna=yes
983  elif test "x$tor_cv_can_use_curve25519_nacl" = "xyes"; then
984    use_curve25519_nacl=yes
985    CURVE25519_LIBS=-lnacl
986  else
987    build_curve25519_donna=yes
988    use_curve25519_donna=yes
989  fi
991 if test "x$use_curve25519_donna" = "xyes"; then
992   AC_DEFINE(USE_CURVE25519_DONNA, 1,
993             [Defined if we should use an internal curve25519_donna{,_c64} implementation])
995 if test "x$use_curve25519_nacl" = "xyes"; then
996   AC_DEFINE(USE_CURVE25519_NACL, 1,
997             [Defined if we should use a curve25519 from nacl])
999 AM_CONDITIONAL(BUILD_CURVE25519_DONNA,
1000   test "x$build_curve25519_donna" = "xyes")
1001 AM_CONDITIONAL(BUILD_CURVE25519_DONNA_C64,
1002   test "x$build_curve25519_donna_c64" = "xyes")
1003 AC_SUBST(CURVE25519_LIBS)
1005 dnl Make sure to enable support for large off_t if available.
1006 AC_SYS_LARGEFILE
1008 AC_CHECK_HEADERS([assert.h \
1009                   errno.h \
1010                   fcntl.h \
1011                   signal.h \
1012                   string.h \
1013                   sys/capability.h \
1014                   sys/fcntl.h \
1015                   sys/stat.h \
1016                   sys/time.h \
1017                   sys/types.h \
1018                   time.h \
1019                   unistd.h \
1020                   arpa/inet.h \
1021                   crt_externs.h \
1022                   execinfo.h \
1023                   gnu/libc-version.h \
1024                   grp.h \
1025                   ifaddrs.h \
1026                   inttypes.h \
1027                   limits.h \
1028                   linux/types.h \
1029                   machine/limits.h \
1030                   malloc.h \
1031                   malloc/malloc.h \
1032                   malloc_np.h \
1033                   netdb.h \
1034                   netinet/in.h \
1035                   netinet/in6.h \
1036                   pwd.h \
1037                   readpassphrase.h \
1038                   stdint.h \
1039                   sys/eventfd.h \
1040                   sys/file.h \
1041                   sys/ioctl.h \
1042                   sys/limits.h \
1043                   sys/mman.h \
1044                   sys/param.h \
1045                   sys/prctl.h \
1046                   sys/random.h \
1047                   sys/resource.h \
1048                   sys/select.h \
1049                   sys/socket.h \
1050                   sys/statvfs.h \
1051                   sys/syscall.h \
1052                   sys/sysctl.h \
1053                   sys/syslimits.h \
1054                   sys/time.h \
1055                   sys/types.h \
1056                   sys/un.h \
1057                   sys/utime.h \
1058                   sys/wait.h \
1059                   syslog.h \
1060                   utime.h])
1062 AC_CHECK_HEADERS(sys/param.h)
1064 AC_CHECK_HEADERS(net/if.h, net_if_found=1, net_if_found=0,
1065 [#ifdef HAVE_SYS_TYPES_H
1066 #include <sys/types.h>
1067 #endif
1068 #ifdef HAVE_SYS_SOCKET_H
1069 #include <sys/socket.h>
1070 #endif])
1071 AC_CHECK_HEADERS(net/pfvar.h, net_pfvar_found=1, net_pfvar_found=0,
1072 [#ifdef HAVE_SYS_TYPES_H
1073 #include <sys/types.h>
1074 #endif
1075 #ifdef HAVE_SYS_SOCKET_H
1076 #include <sys/socket.h>
1077 #endif
1078 #ifdef HAVE_NET_IF_H
1079 #include <net/if.h>
1080 #endif
1081 #ifdef HAVE_NETINET_IN_H
1082 #include <netinet/in.h>
1083 #endif])
1085 AC_CHECK_HEADERS(linux/if.h,[],[],
1087 #ifdef HAVE_SYS_SOCKET_H
1088 #include <sys/socket.h>
1089 #endif
1092 AC_CHECK_HEADERS(linux/netfilter_ipv4.h,
1093         linux_netfilter_ipv4=1, linux_netfilter_ipv4=0,
1094 [#ifdef HAVE_SYS_TYPES_H
1095 #include <sys/types.h>
1096 #endif
1097 #ifdef HAVE_SYS_SOCKET_H
1098 #include <sys/socket.h>
1099 #endif
1100 #ifdef HAVE_LIMITS_H
1101 #include <limits.h>
1102 #endif
1103 #ifdef HAVE_LINUX_TYPES_H
1104 #include <linux/types.h>
1105 #endif
1106 #ifdef HAVE_NETINET_IN6_H
1107 #include <netinet/in6.h>
1108 #endif
1109 #ifdef HAVE_NETINET_IN_H
1110 #include <netinet/in.h>
1111 #endif])
1113 AC_CHECK_HEADERS(linux/netfilter_ipv6/ip6_tables.h,
1114         linux_netfilter_ipv6_ip6_tables=1, linux_netfilter_ipv6_ip6_tables=0,
1115 [#ifdef HAVE_SYS_TYPES_H
1116 #include <sys/types.h>
1117 #endif
1118 #ifdef HAVE_SYS_SOCKET_H
1119 #include <sys/socket.h>
1120 #endif
1121 #ifdef HAVE_LIMITS_H
1122 #include <limits.h>
1123 #endif
1124 #ifdef HAVE_LINUX_TYPES_H
1125 #include <linux/types.h>
1126 #endif
1127 #ifdef HAVE_NETINET_IN6_H
1128 #include <netinet/in6.h>
1129 #endif
1130 #ifdef HAVE_NETINET_IN_H
1131 #include <netinet/in.h>
1132 #endif
1133 #ifdef HAVE_LINUX_IF_H
1134 #include <linux/if.h>
1135 #endif])
1137 transparent_ok=0
1138 if test "x$net_if_found" = "x1" && test "x$net_pfvar_found" = "x1"; then
1139   transparent_ok=1
1141 if test "x$linux_netfilter_ipv4" = "x1"; then
1142   transparent_ok=1
1144 if test "x$linux_netfilter_ipv6_ip6_tables" = "x1"; then
1145   transparent_ok=1
1147 if test "x$transparent_ok" = "x1"; then
1148   AC_DEFINE(USE_TRANSPARENT, 1, "Define to enable transparent proxy support")
1149   case "$host" in
1150     *-*-openbsd* | *-*-bitrig*)
1151       AC_DEFINE(OPENBSD, 1, "Define to handle pf on OpenBSD properly") ;;
1152   esac
1153 else
1154   AC_MSG_NOTICE([Transparent proxy support enabled, but missing headers.])
1157 AC_CHECK_MEMBERS([struct timeval.tv_sec], , ,
1158 [#ifdef HAVE_SYS_TYPES_H
1159 #include <sys/types.h>
1160 #endif
1161 #ifdef HAVE_SYS_TIME_H
1162 #include <sys/time.h>
1163 #endif])
1165 dnl In case we aren't given a working stdint.h, we'll need to grow our own.
1166 dnl Watch out.
1168 AC_CHECK_SIZEOF(int8_t)
1169 AC_CHECK_SIZEOF(int16_t)
1170 AC_CHECK_SIZEOF(int32_t)
1171 AC_CHECK_SIZEOF(int64_t)
1172 AC_CHECK_SIZEOF(uint8_t)
1173 AC_CHECK_SIZEOF(uint16_t)
1174 AC_CHECK_SIZEOF(uint32_t)
1175 AC_CHECK_SIZEOF(uint64_t)
1176 AC_CHECK_SIZEOF(intptr_t)
1177 AC_CHECK_SIZEOF(uintptr_t)
1179 dnl AC_CHECK_TYPES([int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t, uint64_t, intptr_t, uintptr_t])
1181 AC_CHECK_SIZEOF(char)
1182 AC_CHECK_SIZEOF(short)
1183 AC_CHECK_SIZEOF(int)
1184 AC_CHECK_SIZEOF(long)
1185 AC_CHECK_SIZEOF(long long)
1186 AC_CHECK_SIZEOF(__int64)
1187 AC_CHECK_SIZEOF(void *)
1188 AC_CHECK_SIZEOF(time_t)
1189 AC_CHECK_SIZEOF(size_t)
1190 AC_CHECK_SIZEOF(pid_t)
1192 AC_CHECK_TYPES([uint, u_char, ssize_t])
1194 AC_PC_FROM_UCONTEXT([:])
1196 dnl used to include sockaddr_storage, but everybody has that.
1197 AC_CHECK_TYPES([struct in6_addr, struct sockaddr_in6, sa_family_t], , ,
1198 [#ifdef HAVE_SYS_TYPES_H
1199 #include <sys/types.h>
1200 #endif
1201 #ifdef HAVE_NETINET_IN_H
1202 #include <netinet/in.h>
1203 #endif
1204 #ifdef HAVE_NETINET_IN6_H
1205 #include <netinet/in6.h>
1206 #endif
1207 #ifdef HAVE_SYS_SOCKET_H
1208 #include <sys/socket.h>
1209 #endif
1210 #ifdef _WIN32
1211 #define _WIN32_WINNT 0x0501
1212 #define WIN32_LEAN_AND_MEAN
1213 #include <winsock2.h>
1214 #include <ws2tcpip.h>
1215 #endif
1217 AC_CHECK_MEMBERS([struct in6_addr.s6_addr32, struct in6_addr.s6_addr16, struct sockaddr_in.sin_len, struct sockaddr_in6.sin6_len], , ,
1218 [#ifdef HAVE_SYS_TYPES_H
1219 #include <sys/types.h>
1220 #endif
1221 #ifdef HAVE_NETINET_IN_H
1222 #include <netinet/in.h>
1223 #endif
1224 #ifdef HAVE_NETINET_IN6_H
1225 #include <netinet/in6.h>
1226 #endif
1227 #ifdef HAVE_SYS_SOCKET_H
1228 #include <sys/socket.h>
1229 #endif
1230 #ifdef _WIN32
1231 #define _WIN32_WINNT 0x0501
1232 #define WIN32_LEAN_AND_MEAN
1233 #include <winsock2.h>
1234 #include <ws2tcpip.h>
1235 #endif
1238 AC_CHECK_TYPES([rlim_t], , ,
1239 [#ifdef HAVE_SYS_TYPES_H
1240 #include <sys/types.h>
1241 #endif
1242 #ifdef HAVE_SYS_TIME_H
1243 #include <sys/time.h>
1244 #endif
1245 #ifdef HAVE_SYS_RESOURCE_H
1246 #include <sys/resource.h>
1247 #endif
1250 AX_CHECK_SIGN([time_t],
1251        [ : ],
1252        [ : ], [
1253 #ifdef HAVE_SYS_TYPES_H
1254 #include <sys/types.h>
1255 #endif
1256 #ifdef HAVE_SYS_TIME_H
1257 #include <sys/time.h>
1258 #endif
1259 #ifdef HAVE_TIME_H
1260 #include <time.h>
1261 #endif
1264 if test "$ax_cv_decl_time_t_signed" = "no"; then
1265   AC_MSG_ERROR([You have an unsigned time_t; Tor does not support that. Please tell the Tor developers about your interesting platform.])
1268 AX_CHECK_SIGN([size_t],
1269        [ tor_cv_size_t_signed=yes ],
1270        [ tor_cv_size_t_signed=no ], [
1271 #ifdef HAVE_SYS_TYPES_H
1272 #include <sys/types.h>
1273 #endif
1276 if test "$ax_cv_decl_size_t_signed" = "yes"; then
1277   AC_MSG_ERROR([You have a signed size_t; that's grossly nonconformant.])
1280 AX_CHECK_SIGN([enum always],
1281        [ AC_DEFINE(ENUM_VALS_ARE_SIGNED, 1, [Define if enum is always signed]) ],
1282        [ : ], [
1283  enum always { AAA, BBB, CCC };
1286 AC_CHECK_SIZEOF(socklen_t, , [AC_INCLUDES_DEFAULT()
1287 #ifdef HAVE_SYS_SOCKET_H
1288 #include <sys/socket.h>
1289 #endif
1292 # We want to make sure that we _don't_ have a cell_t defined, like IRIX does.
1294 AC_CHECK_SIZEOF(cell_t)
1296 # Now make sure that NULL can be represented as zero bytes.
1297 AC_CACHE_CHECK([whether memset(0) sets pointers to NULL], tor_cv_null_is_zero,
1298 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1299 [[#include <stdlib.h>
1300 #include <string.h>
1301 #include <stdio.h>
1302 #ifdef HAVE_STDDEF_H
1303 #include <stddef.h>
1304 #endif
1305 int main () { char *p1,*p2; p1=NULL; memset(&p2,0,sizeof(p2));
1306 return memcmp(&p1,&p2,sizeof(char*))?1:0; }]])],
1307        [tor_cv_null_is_zero=yes],
1308        [tor_cv_null_is_zero=no],
1309        [tor_cv_null_is_zero=cross])])
1311 if test "$tor_cv_null_is_zero" = "cross"; then
1312   # Cross-compiling; let's hope that the target isn't raving mad.
1313   AC_MSG_NOTICE([Cross-compiling: we'll assume that NULL is represented as a sequence of 0-valued bytes.])
1316 if test "$tor_cv_null_is_zero" != "no"; then
1317   AC_DEFINE([NULL_REP_IS_ZERO_BYTES], 1,
1318             [Define to 1 iff memset(0) sets pointers to NULL])
1321 AC_CACHE_CHECK([whether memset(0) sets doubles to 0.0], tor_cv_dbl0_is_zero,
1322 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1323 [[#include <stdlib.h>
1324 #include <string.h>
1325 #include <stdio.h>
1326 #ifdef HAVE_STDDEF_H
1327 #include <stddef.h>
1328 #endif
1329 int main () { double d1,d2; d1=0; memset(&d2,0,sizeof(d2));
1330 return memcmp(&d1,&d2,sizeof(d1))?1:0; }]])],
1331        [tor_cv_dbl0_is_zero=yes],
1332        [tor_cv_dbl0_is_zero=no],
1333        [tor_cv_dbl0_is_zero=cross])])
1335 if test "$tor_cv_dbl0_is_zero" = "cross"; then
1336   # Cross-compiling; let's hope that the target isn't raving mad.
1337   AC_MSG_NOTICE([Cross-compiling: we'll assume that 0.0 can be represented as a sequence of 0-valued bytes.])
1340 if test "$tor_cv_dbl0_is_zero" != "no"; then
1341   AC_DEFINE([DOUBLE_0_REP_IS_ZERO_BYTES], 1,
1342             [Define to 1 iff memset(0) sets doubles to 0.0])
1345 # And what happens when we malloc zero?
1346 AC_CACHE_CHECK([whether we can malloc(0) safely.], tor_cv_malloc_zero_works,
1347 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1348 [[#include <stdlib.h>
1349 #include <string.h>
1350 #include <stdio.h>
1351 #ifdef HAVE_STDDEF_H
1352 #include <stddef.h>
1353 #endif
1354 int main () { return malloc(0)?0:1; }]])],
1355        [tor_cv_malloc_zero_works=yes],
1356        [tor_cv_malloc_zero_works=no],
1357        [tor_cv_malloc_zero_works=cross])])
1359 if test "$tor_cv_malloc_zero_works" = "cross"; then
1360   # Cross-compiling; let's hope that the target isn't raving mad.
1361   AC_MSG_NOTICE([Cross-compiling: we'll assume that we need to check malloc() arguments for 0.])
1364 if test "$tor_cv_malloc_zero_works" = "yes"; then
1365   AC_DEFINE([MALLOC_ZERO_WORKS], 1,
1366             [Define to 1 iff malloc(0) returns a pointer])
1369 # whether we seem to be in a 2s-complement world.
1370 AC_CACHE_CHECK([whether we are using 2s-complement arithmetic], tor_cv_twos_complement,
1371 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1372 [[int main () { int problem = ((-99) != (~99)+1);
1373 return problem ? 1 : 0; }]])],
1374        [tor_cv_twos_complement=yes],
1375        [tor_cv_twos_complement=no],
1376        [tor_cv_twos_complement=cross])])
1378 if test "$tor_cv_twos_complement" = "cross"; then
1379   # Cross-compiling; let's hope that the target isn't raving mad.
1380   AC_MSG_NOTICE([Cross-compiling: we'll assume that negative integers are represented with two's complement.])
1383 if test "$tor_cv_twos_complement" != "no"; then
1384   AC_DEFINE([USING_TWOS_COMPLEMENT], 1,
1385             [Define to 1 iff we represent negative integers with
1386              two's complement])
1389 # What does shifting a negative value do?
1390 AC_CACHE_CHECK([whether right-shift on negative values does sign-extension], tor_cv_sign_extend,
1391 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1392 [[int main () { int okay = (-60 >> 8) == -1; return okay ? 0 : 1; }]])],
1393        [tor_cv_sign_extend=yes],
1394        [tor_cv_sign_extend=no],
1395        [tor_cv_sign_extend=cross])])
1397 if test "$tor_cv_sign_extend" = "cross"; then
1398   # Cross-compiling; let's hope that the target isn't raving mad.
1399   AC_MSG_NOTICE([Cross-compiling: we'll assume that right-shifting negative integers causes sign-extension])
1402 if test "$tor_cv_sign_extend" != "no"; then
1403   AC_DEFINE([RSHIFT_DOES_SIGN_EXTEND], 1,
1404             [Define to 1 iff right-shifting a negative value performs sign-extension])
1407 # Whether we should use the dmalloc memory allocation debugging library.
1408 AC_MSG_CHECKING(whether to use dmalloc (debug memory allocation library))
1409 AC_ARG_WITH(dmalloc,
1410 AS_HELP_STRING(--with-dmalloc, [use debug memory allocation library]),
1411 [if [[ "$withval" = "yes" ]]; then
1412   dmalloc=1
1413   AC_MSG_RESULT(yes)
1414 else
1415   dmalloc=1
1416   AC_MSG_RESULT(no)
1417 fi], [ dmalloc=0; AC_MSG_RESULT(no) ]
1420 if [[ $dmalloc -eq 1 ]]; then
1421   AC_CHECK_HEADERS(dmalloc.h, , AC_MSG_ERROR(dmalloc header file not found. Do you have the development files for dmalloc installed?))
1422   AC_SEARCH_LIBS(dmalloc_malloc, [dmallocth dmalloc], , AC_MSG_ERROR(Libdmalloc library not found. If you enable it you better have it installed.))
1423   AC_DEFINE(USE_DMALLOC, 1, [Debug memory allocation library])
1424   AC_CHECK_FUNCS(dmalloc_strdup dmalloc_strndup)
1427 AC_ARG_WITH(tcmalloc,
1428 AS_HELP_STRING(--with-tcmalloc, [use tcmalloc memory allocation library]),
1429 [ tcmalloc=yes ], [ tcmalloc=no ])
1431 if test "x$tcmalloc" = "xyes"; then
1432    LDFLAGS="-ltcmalloc $LDFLAGS"
1435 using_custom_malloc=no
1436 if test "x$enable_openbsd_malloc" = "xyes"; then
1437    using_custom_malloc=yes
1439 if test "x$tcmalloc" = "xyes"; then
1440    using_custom_malloc=yes
1442 if test "$using_custom_malloc" = "no"; then
1443    AC_CHECK_FUNCS(mallinfo)
1445 if test "$using_custom_malloc" = "yes"; then
1446   # Tell the C compiler not to use the system allocator functions.
1447   TOR_CHECK_CFLAGS([-fno-builtin-malloc -fno-builtin-realloc -fno-builtin-calloc -fno-builtin-free])
1450 # By default, we're going to assume we don't have mlockall()
1451 # bionic and other platforms have various broken mlockall subsystems.
1452 # Some systems don't have a working mlockall, some aren't linkable,
1453 # and some have it but don't declare it.
1454 AC_CHECK_FUNCS(mlockall)
1455 AC_CHECK_DECLS([mlockall], , , [
1456 #ifdef HAVE_SYS_MMAN_H
1457 #include <sys/mman.h>
1458 #endif])
1460 # Allow user to specify an alternate syslog facility
1461 AC_ARG_WITH(syslog-facility,
1462 AS_HELP_STRING(--with-syslog-facility=LOG, [syslog facility to use (default=LOG_DAEMON)]),
1463 syslog_facility="$withval", syslog_facility="LOG_DAEMON")
1464 AC_DEFINE_UNQUOTED(LOGFACILITY,$syslog_facility,[name of the syslog facility])
1465 AC_SUBST(LOGFACILITY)
1467 # Check if we have getresuid and getresgid
1468 AC_CHECK_FUNCS(getresuid getresgid)
1470 # Check for gethostbyname_r in all its glorious incompatible versions.
1471 #   (This logic is based on that in Python's configure.in)
1472 AH_TEMPLATE(HAVE_GETHOSTBYNAME_R,
1473   [Define this if you have any gethostbyname_r()])
1475 AC_CHECK_FUNC(gethostbyname_r, [
1476   AC_MSG_CHECKING([how many arguments gethostbyname_r() wants])
1477   OLD_CFLAGS=$CFLAGS
1478   CFLAGS="$CFLAGS $MY_CPPFLAGS $MY_THREAD_CPPFLAGS $MY_CFLAGS"
1479   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
1480 #include <netdb.h>
1481   ], [[
1482     char *cp1, *cp2;
1483     struct hostent *h1, *h2;
1484     int i1, i2;
1485     (void)gethostbyname_r(cp1,h1,cp2,i1,&h2,&i2);
1486   ]])],[
1487     AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1488     AC_DEFINE(HAVE_GETHOSTBYNAME_R_6_ARG, 1,
1489      [Define this if gethostbyname_r takes 6 arguments])
1490     AC_MSG_RESULT(6)
1491   ], [
1492     AC_TRY_COMPILE([
1493 #include <netdb.h>
1494     ], [
1495       char *cp1, *cp2;
1496       struct hostent *h1;
1497       int i1, i2;
1498       (void)gethostbyname_r(cp1,h1,cp2,i1,&i2);
1499     ], [
1500       AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1501       AC_DEFINE(HAVE_GETHOSTBYNAME_R_5_ARG, 1,
1502         [Define this if gethostbyname_r takes 5 arguments])
1503       AC_MSG_RESULT(5)
1504    ], [
1505       AC_TRY_COMPILE([
1506 #include <netdb.h>
1507      ], [
1508        char *cp1;
1509        struct hostent *h1;
1510        struct hostent_data hd;
1511        (void) gethostbyname_r(cp1,h1,&hd);
1512      ], [
1513        AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1514        AC_DEFINE(HAVE_GETHOSTBYNAME_R_3_ARG, 1,
1515          [Define this if gethostbyname_r takes 3 arguments])
1516        AC_MSG_RESULT(3)
1517      ], [
1518        AC_MSG_RESULT(0)
1519      ])
1520   ])
1521  ])
1522  CFLAGS=$OLD_CFLAGS
1525 AC_CACHE_CHECK([whether the C compiler supports __func__],
1526   tor_cv_have_func_macro,
1527   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1528 #include <stdio.h>
1529 int main(int c, char **v) { puts(__func__); }])],
1530   tor_cv_have_func_macro=yes,
1531   tor_cv_have_func_macro=no))
1533 AC_CACHE_CHECK([whether the C compiler supports __FUNC__],
1534   tor_cv_have_FUNC_macro,
1535   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1536 #include <stdio.h>
1537 int main(int c, char **v) { puts(__FUNC__); }])],
1538   tor_cv_have_FUNC_macro=yes,
1539   tor_cv_have_FUNC_macro=no))
1541 AC_CACHE_CHECK([whether the C compiler supports __FUNCTION__],
1542   tor_cv_have_FUNCTION_macro,
1543   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1544 #include <stdio.h>
1545 int main(int c, char **v) { puts(__FUNCTION__); }])],
1546   tor_cv_have_FUNCTION_macro=yes,
1547   tor_cv_have_FUNCTION_macro=no))
1549 AC_CACHE_CHECK([whether we have extern char **environ already declared],
1550   tor_cv_have_environ_declared,
1551   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1552 #ifdef HAVE_UNISTD_H
1553 #include <unistd.h>
1554 #endif
1555 #include <stdlib.h>
1556 int main(int c, char **v) { char **t = environ; }])],
1557   tor_cv_have_environ_declared=yes,
1558   tor_cv_have_environ_declared=no))
1560 if test "$tor_cv_have_func_macro" = "yes"; then
1561   AC_DEFINE(HAVE_MACRO__func__, 1, [Defined if the compiler supports __func__])
1564 if test "$tor_cv_have_FUNC_macro" = "yes"; then
1565   AC_DEFINE(HAVE_MACRO__FUNC__, 1, [Defined if the compiler supports __FUNC__])
1568 if test "$tor_cv_have_FUNCTION_macro" = "yes"; then
1569   AC_DEFINE(HAVE_MACRO__FUNCTION__, 1,
1570            [Defined if the compiler supports __FUNCTION__])
1573 if test "$tor_cv_have_environ_declared" = "yes"; then
1574   AC_DEFINE(HAVE_EXTERN_ENVIRON_DECLARED, 1,
1575            [Defined if we have extern char **environ already declared])
1578 # $prefix stores the value of the --prefix command line option, or
1579 # NONE if the option wasn't set.  In the case that it wasn't set, make
1580 # it be the default, so that we can use it to expand directories now.
1581 if test "x$prefix" = "xNONE"; then
1582   prefix=$ac_default_prefix
1585 # and similarly for $exec_prefix
1586 if test "x$exec_prefix" = "xNONE"; then
1587   exec_prefix=$prefix
1590 if test "x$BUILDDIR" = "x"; then
1591   BUILDDIR=`pwd`
1593 AC_SUBST(BUILDDIR)
1594 AH_TEMPLATE([BUILDDIR],[tor's build directory])
1595 AC_DEFINE_UNQUOTED(BUILDDIR,"$BUILDDIR")
1597 if test "x$CONFDIR" = "x"; then
1598   CONFDIR=`eval echo $sysconfdir/tor`
1600 AC_SUBST(CONFDIR)
1601 AH_TEMPLATE([CONFDIR],[tor's configuration directory])
1602 AC_DEFINE_UNQUOTED(CONFDIR,"$CONFDIR")
1604 BINDIR=`eval echo $bindir`
1605 AC_SUBST(BINDIR)
1606 LOCALSTATEDIR=`eval echo $localstatedir`
1607 AC_SUBST(LOCALSTATEDIR)
1609 if test "$bwin32" = "true"; then
1610   # Test if the linker supports the --nxcompat and --dynamicbase options
1611   # for Windows
1612   save_LDFLAGS="$LDFLAGS"
1613   LDFLAGS="-Wl,--nxcompat -Wl,--dynamicbase"
1614   AC_MSG_CHECKING([whether the linker supports DllCharacteristics])
1615   AC_LINK_IFELSE([AC_LANG_PROGRAM([])],
1616     [AC_MSG_RESULT([yes])]
1617     [save_LDFLAGS="$save_LDFLAGS $LDFLAGS"],
1618     [AC_MSG_RESULT([no])]
1619   )
1620   LDFLAGS="$save_LDFLAGS"
1623 # Set CFLAGS _after_ all the above checks, since our warnings are stricter
1624 # than autoconf's macros like.
1625 if test "$GCC" = "yes"; then
1626   # Disable GCC's strict aliasing checks.  They are an hours-to-debug
1627   # accident waiting to happen.
1628   CFLAGS="$CFLAGS -Wall -fno-strict-aliasing"
1629 else
1630   # Override optimization level for non-gcc compilers
1631   CFLAGS="$CFLAGS -O"
1632   enable_gcc_warnings=no
1633   enable_gcc_warnings_advisory=no
1636 # Warnings implies advisory-warnings and -Werror.
1637 if test "$enable_gcc_warnings" = "yes"; then
1638   enable_gcc_warnings_advisory=yes
1639   enable_fatal_warnings=yes
1642 # OS X Lion started deprecating the system openssl. Let's just disable
1643 # all deprecation warnings on OS X. Also, to potentially make the binary
1644 # a little smaller, let's enable dead_strip.
1645 case "$host_os" in
1647  darwin*)
1648     CFLAGS="$CFLAGS -Wno-deprecated-declarations"
1649     LDFLAGS="$LDFLAGS -dead_strip" ;;
1650 esac
1652 # Add some more warnings which we use in development but not in the
1653 # released versions.  (Some relevant gcc versions can't handle these.)
1655 # Note that we have to do this near the end  of the autoconf process, or
1656 # else we may run into problems when these warnings hit on the testing C
1657 # programs that autoconf wants to build.
1658 if test "x$enable_gcc_warnings_advisory" != "xno"; then
1660   case "$host" in
1661     *-*-openbsd* | *-*-bitrig*)
1662       # Some OpenBSD versions (like 4.8) have -Wsystem-headers by default.
1663       # That's fine, except that the headers don't pass -Wredundant-decls.
1664       # Therefore, let's disable -Wsystem-headers when we're building
1665       # with maximal warnings on OpenBSD.
1666       CFLAGS="$CFLAGS -Wno-system-headers" ;;
1667   esac
1669   # GCC4.3 users once report trouble with -Wstrict-overflow=5.  GCC5 users
1670   # have it work better.
1671   # CFLAGS="$CFLAGS -Wstrict-overflow=1"
1673   # This warning was added in gcc 4.3, but it appears to generate
1674   # spurious warnings in gcc 4.4.  I don't know if it works in 4.5.
1675   #CFLAGS="$CFLAGS -Wlogical-op"
1677   m4_foreach_w([warning_flag], [
1678      -Waddress
1679      -Waddress-of-array-temporary
1680      -Waddress-of-temporary
1681      -Wambiguous-macro
1682      -Wanonymous-pack-parens
1683      -Warc
1684      -Warc-abi
1685      -Warc-bridge-casts-disallowed-in-nonarc
1686      -Warc-maybe-repeated-use-of-weak
1687      -Warc-performSelector-leaks
1688      -Warc-repeated-use-of-weak
1689      -Warray-bounds
1690      -Warray-bounds-pointer-arithmetic
1691      -Wasm
1692      -Wasm-operand-widths
1693      -Watomic-properties
1694      -Watomic-property-with-user-defined-accessor
1695      -Wauto-import
1696      -Wauto-storage-class
1697      -Wauto-var-id
1698      -Wavailability
1699      -Wbackslash-newline-escape
1700      -Wbad-array-new-length
1701      -Wbind-to-temporary-copy
1702      -Wbitfield-constant-conversion
1703      -Wbool-conversion
1704      -Wbool-conversions
1705      -Wbuiltin-requires-header
1706      -Wchar-align
1707      -Wcompare-distinct-pointer-types
1708      -Wcomplex-component-init
1709      -Wconditional-type-mismatch
1710      -Wconfig-macros
1711      -Wconstant-conversion
1712      -Wconstant-logical-operand
1713      -Wconstexpr-not-const
1714      -Wcustom-atomic-properties
1715      -Wdangling-field
1716      -Wdangling-initializer-list
1717      -Wdate-time
1718      -Wdelegating-ctor-cycles
1719      -Wdeprecated-implementations
1720      -Wdeprecated-register
1721      -Wdirect-ivar-access
1722      -Wdiscard-qual
1723      -Wdistributed-object-modifiers
1724      -Wdivision-by-zero
1725      -Wdollar-in-identifier-extension
1726      -Wdouble-promotion
1727      -Wduplicate-decl-specifier
1728      -Wduplicate-enum
1729      -Wduplicate-method-arg
1730      -Wduplicate-method-match
1731      -Wduplicated-cond
1732      -Wdynamic-class-memaccess
1733      -Wembedded-directive
1734      -Wempty-translation-unit
1735      -Wenum-conversion
1736      -Wexit-time-destructors
1737      -Wexplicit-ownership-type
1738      -Wextern-initializer
1739      -Wextra
1740      -Wextra-semi
1741      -Wextra-tokens
1742      -Wflexible-array-extensions
1743      -Wfloat-conversion
1744      -Wformat-non-iso
1745      -Wfour-char-constants
1746      -Wgcc-compat
1747      -Wglobal-constructors
1748      -Wgnu-array-member-paren-init
1749      -Wgnu-designator
1750      -Wgnu-static-float-init
1751      -Wheader-guard
1752      -Wheader-hygiene
1753      -Widiomatic-parentheses
1754      -Wignored-attributes
1755      -Wimplicit-atomic-properties
1756      -Wimplicit-conversion-floating-point-to-bool
1757      -Wimplicit-exception-spec-mismatch
1758      -Wimplicit-fallthrough
1759      -Wimplicit-fallthrough-per-function
1760      -Wimplicit-retain-self
1761      -Wimport-preprocessor-directive-pedantic
1762      -Wincompatible-library-redeclaration
1763      -Wincompatible-pointer-types-discards-qualifiers
1764      -Wincomplete-implementation
1765      -Wincomplete-module
1766      -Wincomplete-umbrella
1767      -Winit-self
1768      -Wint-conversions
1769      -Wint-to-void-pointer-cast
1770      -Winteger-overflow
1771      -Winvalid-constexpr
1772      -Winvalid-iboutlet
1773      -Winvalid-noreturn
1774      -Winvalid-pp-token
1775      -Winvalid-source-encoding
1776      -Winvalid-token-paste
1777      -Wknr-promoted-parameter
1778      -Wlanguage-extension-token
1779      -Wlarge-by-value-copy
1780      -Wliteral-conversion
1781      -Wliteral-range
1782      -Wlocal-type-template-args
1783      -Wlogical-op
1784      -Wloop-analysis
1785      -Wmain-return-type
1786      -Wmalformed-warning-check
1787      -Wmethod-signatures
1788      -Wmicrosoft
1789      -Wmicrosoft-exists
1790      -Wmismatched-parameter-types
1791      -Wmismatched-return-types
1792      -Wmissing-field-initializers
1793      -Wmissing-format-attribute
1794      -Wmissing-noreturn
1795      -Wmissing-selector-name
1796      -Wmissing-sysroot
1797      -Wmissing-variable-declarations
1798      -Wmodule-conflict
1799      -Wnested-anon-types
1800      -Wnewline-eof
1801      -Wnon-literal-null-conversion
1802      -Wnon-pod-varargs
1803      -Wnonportable-cfstrings
1804      -Wnormalized=id
1805      -Wnull-arithmetic
1806      -Wnull-character
1807      -Wnull-conversion
1808      -Wnull-dereference
1809      -Wout-of-line-declaration
1810      -Wover-aligned
1811      -Woverlength-strings
1812      -Woverride-init
1813      -Woverriding-method-mismatch
1814      -Wpointer-type-mismatch
1815      -Wpredefined-identifier-outside-function
1816      -Wprotocol-property-synthesis-ambiguity
1817      -Wreadonly-iboutlet-property
1818      -Wreadonly-setter-attrs
1819      -Wreceiver-expr
1820      -Wreceiver-forward-class
1821      -Wreceiver-is-weak
1822      -Wreinterpret-base-class
1823      -Wrequires-super-attribute
1824      -Wreserved-user-defined-literal
1825      -Wreturn-stack-address
1826      -Wsection
1827      -Wselector-type-mismatch
1828      -Wsentinel
1829      -Wserialized-diagnostics
1830      -Wshadow
1831      -Wshift-count-negative
1832      -Wshift-count-overflow
1833      -Wshift-negative-value
1834      -Wshift-overflow=2
1835      -Wshift-sign-overflow
1836      -Wshorten-64-to-32
1837      -Wsizeof-array-argument
1838      -Wsource-uses-openmp
1839      -Wstatic-float-init
1840      -Wstatic-in-inline
1841      -Wstatic-local-in-inline
1842      -Wstrict-overflow=1
1843      -Wstring-compare
1844      -Wstring-conversion
1845      -Wstrlcpy-strlcat-size
1846      -Wstrncat-size
1847      -Wsuggest-attribute=format
1848      -Wsuggest-attribute=noreturn
1849      -Wsuper-class-method-mismatch
1850      -Wswitch-bool
1851      -Wsync-nand
1852      -Wtautological-constant-out-of-range-compare
1853      -Wtentative-definition-incomplete-type
1854      -Wtrampolines
1855      -Wtype-safety
1856      -Wtypedef-redefinition
1857      -Wtypename-missing
1858      -Wundefined-inline
1859      -Wundefined-internal
1860      -Wundefined-reinterpret-cast
1861      -Wunicode
1862      -Wunicode-whitespace
1863      -Wunknown-warning-option
1864      -Wunnamed-type-template-args
1865      -Wunneeded-member-function
1866      -Wunsequenced
1867      -Wunsupported-visibility
1868      -Wunused-but-set-parameter
1869      -Wunused-but-set-variable
1870      -Wunused-command-line-argument
1871      -Wunused-const-variable=2
1872      -Wunused-exception-parameter
1873      -Wunused-local-typedefs
1874      -Wunused-member-function
1875      -Wunused-sanitize-argument
1876      -Wunused-volatile-lvalue
1877      -Wuser-defined-literals
1878      -Wvariadic-macros
1879      -Wvector-conversion
1880      -Wvector-conversions
1881      -Wvexing-parse
1882      -Wvisibility
1883      -Wvla-extension
1884      -Wzero-length-array
1885   ], [ TOR_CHECK_CFLAGS([warning_flag]) ])
1887 dnl    We should re-enable this in some later version.  Clang doesn't
1888 dnl    mind, but it causes trouble with GCC.
1889 dnl     -Wstrict-overflow=2
1891 dnl    These seem to require annotations that we don't currently use,
1892 dnl    and they give false positives in our pthreads wrappers. (Clang 4)
1893 dnl     -Wthread-safety
1894 dnl     -Wthread-safety-analysis
1895 dnl     -Wthread-safety-attributes
1896 dnl     -Wthread-safety-beta
1897 dnl     -Wthread-safety-precise
1899   CFLAGS="$CFLAGS -W -Wfloat-equal -Wundef -Wpointer-arith"
1900   CFLAGS="$CFLAGS -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings"
1901   CFLAGS="$CFLAGS -Wredundant-decls -Wchar-subscripts -Wcomment -Wformat=2"
1902   CFLAGS="$CFLAGS -Wwrite-strings"
1903   CFLAGS="$CFLAGS -Wnested-externs -Wbad-function-cast -Wswitch-enum"
1904   CFLAGS="$CFLAGS -Waggregate-return -Wpacked -Wunused"
1905   CFLAGS="$CFLAGS -Wunused-parameter "
1906   # These interfere with building main() { return 0; }, which autoconf
1907   # likes to use as its default program.
1908   CFLAGS="$CFLAGS -Wold-style-definition -Wmissing-declarations"
1910   if test "$tor_cv_cflags__Wnull_dereference" = "yes"; then
1911     AC_DEFINE([HAVE_CFLAG_WNULL_DEREFERENCE], 1, [True if we have -Wnull-dereference])
1912   fi
1913   if test "$tor_cv_cflags__Woverlength_strings" = "yes"; then
1914     AC_DEFINE([HAVE_CFLAG_WOVERLENGTH_STRINGS], 1, [True if we have -Woverlength-strings])
1915   fi
1917   if test "x$enable_fatal_warnings" = "xyes"; then
1918     # I'd like to use TOR_CHECK_CFLAGS here, but I can't, since the
1919     # default autoconf programs are full of errors.
1920     CFLAGS="$CFLAGS -Werror"
1921   fi
1925 if test "$enable_coverage" = "yes" && test "$have_clang" = "no"; then
1926    case "$host_os" in
1927     darwin*)
1928       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.])
1929    esac
1932 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent $TOR_CPPFLAGS_openssl $TOR_CPPFLAGS_zlib"
1934 AC_CONFIG_FILES([
1935         Doxyfile
1936         Makefile
1937         contrib/dist/suse/tor.sh
1938         contrib/operator-tools/tor.logrotate
1939         contrib/dist/tor.sh
1940         contrib/dist/torctl
1941         contrib/dist/tor.service
1942         src/config/torrc.sample
1943         src/config/torrc.minimal
1944         scripts/maint/checkOptionDocs.pl
1945         scripts/maint/updateVersions.pl
1948 if test "x$asciidoc" = "xtrue" && test "$ASCIIDOC" = "none"; then
1949   regular_mans="doc/tor doc/tor-gencert doc/tor-resolve doc/torify"
1950   for file in $regular_mans ; do
1951     if ! [[ -f "$srcdir/$file.1.in" ]] || ! [[ -f "$srcdir/$file.html.in" ]] ; then
1952       echo "==================================";
1953       echo;
1954       echo "Building Tor has failed since manpages cannot be built.";
1955       echo;
1956       echo "You need asciidoc installed to be able to build the manpages.";
1957       echo "To build without manpages, use the --disable-asciidoc argument";
1958       echo "when calling configure.";
1959       echo;
1960       echo "==================================";
1961       exit 1;
1962     fi
1963   done
1966 AC_OUTPUT