Merge remote-tracking branch 'tor-github/pr/392' into maint-0.2.9
[tor.git] / configure.ac
blob772ae432a6b9db4726bb386b2a469d8acc22bc80
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_CIPHER_find \
681                 SSL_CTX_set_security_level \
682                 TLS_method
683                ])
685 dnl Check if OpenSSL has scrypt implementation.
686 AC_CHECK_FUNCS([ EVP_PBE_scrypt ])
688 dnl Check if OpenSSL structures are opaque
689 AC_CHECK_MEMBERS([SSL.state], , ,
690 [#include <openssl/ssl.h>
693 LIBS="$save_LIBS"
694 LDFLAGS="$save_LDFLAGS"
695 CPPFLAGS="$save_CPPFLAGS"
697 dnl ------------------------------------------------------
698 dnl Where do you live, zlib?  And how do we call you?
700 tor_zlib_pkg_redhat="zlib"
701 tor_zlib_pkg_debian="zlib1g"
702 tor_zlib_devpkg_redhat="zlib-devel"
703 tor_zlib_devpkg_debian="zlib1g-dev"
705 TOR_SEARCH_LIBRARY(zlib, $tryzlibdir, [-lz],
706     [#include <zlib.h>],
707     [const char * zlibVersion(void);],
708     [zlibVersion();], [--with-zlib-dir],
709     [/opt/zlib])
711 if test "$enable_static_zlib" = "yes"; then
712    if test "$tor_cv_library_zlib_dir" = "(system)"; then
713      AC_MSG_ERROR("You must specify an explicit --with-zlib-dir=x option when
714  using --enable-static-zlib")
715    else
716      TOR_ZLIB_LIBS="$TOR_LIBDIR_zlib/libz.a"
717    fi
718 else
719      TOR_ZLIB_LIBS="-lz"
721 AC_SUBST(TOR_ZLIB_LIBS)
723 dnl ----------------------------------------------------------------------
724 dnl Check if libcap is available for capabilities.
726 tor_cap_pkg_debian="libcap2"
727 tor_cap_pkg_redhat="libcap"
728 tor_cap_devpkg_debian="libcap-dev"
729 tor_cap_devpkg_redhat="libcap-devel"
731 AC_CHECK_LIB([cap], [cap_init], [],
732   AC_MSG_NOTICE([Libcap was not found. Capabilities will not be usable.])
734 AC_CHECK_FUNCS(cap_set_proc)
736 dnl ---------------------------------------------------------------------
737 dnl Now that we know about our major libraries, we can check for compiler
738 dnl and linker hardening options.  We need to do this with the libraries known,
739 dnl since sometimes the linker will like an option but not be willing to
740 dnl use it with a build of a library.
742 all_ldflags_for_check="$TOR_LDFLAGS_zlib $TOR_LDFLAGS_openssl $TOR_LDFLAGS_libevent"
743 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"
745 CFLAGS_FTRAPV=
746 CFLAGS_FWRAPV=
747 CFLAGS_ASAN=
748 CFLAGS_UBSAN=
750 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
751 #if !defined(__clang__)
752 #error
753 #endif])], have_clang=yes, have_clang=no)
755 if test "x$enable_gcc_hardening" != "xno"; then
756     CFLAGS="$CFLAGS -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2"
757     if test "x$have_clang" = "xyes"; then
758         TOR_CHECK_CFLAGS(-Qunused-arguments)
759     fi
760     TOR_CHECK_CFLAGS(-fstack-protector-all, also_link)
761     AS_VAR_PUSHDEF([can_compile], [tor_cv_cflags_-fstack-protector-all])
762     AS_VAR_PUSHDEF([can_link], [tor_can_link_-fstack-protector-all])
763 m4_ifdef([AS_VAR_IF],[
764     AS_VAR_IF(can_compile, [yes],
765         AS_VAR_IF(can_link, [yes],
766                   [],
767                   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.)]))
768         )])
769     AS_VAR_POPDEF([can_link])
770     AS_VAR_POPDEF([can_compile])
771     TOR_CHECK_CFLAGS(-Wstack-protector)
772     TOR_CHECK_CFLAGS(--param ssp-buffer-size=1)
773     if test "$bwin32" = "false"; then
774        TOR_CHECK_CFLAGS(-fPIE)
775        TOR_CHECK_LDFLAGS(-pie, "$all_ldflags_for_check", "$all_libs_for_check")
776     fi
777     TOR_TRY_COMPILE_WITH_CFLAGS(-fwrapv, also_link, CFLAGS_FWRAPV="-fwrapv", true)
780 if test "x$enable_expensive_hardening" = "xyes"; then
781     TOR_TRY_COMPILE_WITH_CFLAGS(-ftrapv, also_link, CFLAGS_FTRAPV="-ftrapv", true)
782    if test "$tor_cv_cflags__ftrapv" = "yes" && test "$tor_can_link__ftrapv" != "yes"; then
783       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.])
784    fi
786    if test "$tor_cv_cflags__ftrapv" != "yes"; then
787      AC_MSG_ERROR([You requested expensive hardening, but the compiler does not seem to support -ftrapv.])
788    fi
790    TOR_TRY_COMPILE_WITH_CFLAGS([-fsanitize=address], also_link, CFLAGS_ASAN="-fsanitize=address", true)
791     if test "$tor_cv_cflags__fsanitize_address" = "yes" && test "$tor_can_link__fsanitize_address" != "yes"; then
792       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*])
793     fi
795    TOR_TRY_COMPILE_WITH_CFLAGS([-fsanitize=undefined], also_link, CFLAGS_UBSAN="-fsanitize=undefined", true)
796     if test "$tor_cv_cflags__fsanitize_address" = "yes" && test "$tor_can_link__fsanitize_address" != "yes"; then
797       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*])
798     fi
800 TOR_CHECK_CFLAGS([-fno-omit-frame-pointer])
803 CFLAGS_BUGTRAP="$CFLAGS_FTRAPV $CFLAGS_ASAN $CFLAGS_UBSAN"
804 CFLAGS_CONSTTIME="$CFLAGS_FWRAPV"
806 mulodi_fixes_ftrapv=no
807 if test "$have_clang" = "yes"; then
808   saved_CFLAGS="$CFLAGS"
809   CFLAGS="$CFLAGS $CFLAGS_FTRAPV"
810   AC_MSG_CHECKING([whether clang -ftrapv can link a 64-bit int multiply])
811   AC_LINK_IFELSE([
812       AC_LANG_SOURCE([[
813           #include <stdint.h>
814           #include <stdlib.h>
815           int main(int argc, char **argv)
816           {
817             int64_t x = ((int64_t)atoi(argv[1])) * (int64_t)atoi(argv[2])
818                         * (int64_t)atoi(argv[3]);
819             return x == 9;
820           } ]])],
821           [ftrapv_can_link=yes; AC_MSG_RESULT([yes])],
822           [ftrapv_can_link=no; AC_MSG_RESULT([no])])
823   if test "$ftrapv_can_link" = "no"; then
824     AC_MSG_CHECKING([whether defining __mulodi4 fixes that])
825     AC_LINK_IFELSE([
826       AC_LANG_SOURCE([[
827           #include <stdint.h>
828           #include <stdlib.h>
829           int64_t __mulodi4(int64_t a, int64_t b, int *overflow) {
830              *overflow=0;
831              return a;
832           }
833           int main(int argc, char **argv)
834           {
835             int64_t x = ((int64_t)atoi(argv[1])) * (int64_t)atoi(argv[2])
836                         * (int64_t)atoi(argv[3]);
837             return x == 9;
838           } ]])],
839           [mulodi_fixes_ftrapv=yes; AC_MSG_RESULT([yes])],
840           [mulodi_fixes_ftrapv=no; AC_MSG_RESULT([no])])
841   fi
842   CFLAGS="$saved_CFLAGS"
845 AM_CONDITIONAL(ADD_MULODI4, test "$mulodi_fixes_ftrapv" = "yes")
847 dnl These cflags add bunches of branches, and we haven't been able to
848 dnl persuade ourselves that they're suitable for code that needs to be
849 dnl constant time.
850 AC_SUBST(CFLAGS_BUGTRAP)
851 dnl These cflags are variant ones sutable for code that needs to be
852 dnl constant-time.
853 AC_SUBST(CFLAGS_CONSTTIME)
855 if test "x$enable_linker_hardening" != "xno"; then
856     TOR_CHECK_LDFLAGS(-z relro -z now, "$all_ldflags_for_check", "$all_libs_for_check")
859 # For backtrace support
860 TOR_CHECK_LDFLAGS(-rdynamic)
862 dnl ------------------------------------------------------
863 dnl Now see if we have a -fomit-frame-pointer compiler option.
865 saved_CFLAGS="$CFLAGS"
866 TOR_CHECK_CFLAGS(-fomit-frame-pointer)
867 F_OMIT_FRAME_POINTER=''
868 if test "$saved_CFLAGS" != "$CFLAGS"; then
869   if test "x$enable_expensive_hardening" != "xyes"; then
870     F_OMIT_FRAME_POINTER='-fomit-frame-pointer'
871   fi
873 CFLAGS="$saved_CFLAGS"
874 AC_SUBST(F_OMIT_FRAME_POINTER)
876 dnl ------------------------------------------------------
877 dnl If we are adding -fomit-frame-pointer (or if the compiler's doing it
878 dnl for us, as GCC 4.6 and later do at many optimization levels), then
879 dnl we should try to add -fasynchronous-unwind-tables so that our backtrace
880 dnl code will work.
881 TOR_CHECK_CFLAGS(-fasynchronous-unwind-tables)
883 dnl ============================================================
884 dnl Check for libseccomp
886 if test "x$enable_seccomp" != "xno"; then
887   AC_CHECK_HEADERS([seccomp.h])
888   AC_SEARCH_LIBS(seccomp_init, [seccomp])
891 dnl ============================================================
892 dnl Check for libscrypt
894 if test "x$enable_libscrypt" != "xno"; then
895   AC_CHECK_HEADERS([libscrypt.h])
896   AC_SEARCH_LIBS(libscrypt_scrypt, [scrypt])
897   AC_CHECK_FUNCS([libscrypt_scrypt])
900 dnl ============================================================
901 dnl We need an implementation of curve25519.
903 dnl set these defaults.
904 build_curve25519_donna=no
905 build_curve25519_donna_c64=no
906 use_curve25519_donna=no
907 use_curve25519_nacl=no
908 CURVE25519_LIBS=
910 dnl The best choice is using curve25519-donna-c64, but that requires
911 dnl that we
912 AC_CACHE_CHECK([whether we can use curve25519-donna-c64],
913   tor_cv_can_use_curve25519_donna_c64,
914   [AC_RUN_IFELSE(
915     [AC_LANG_PROGRAM([dnl
916       #include <stdint.h>
917       typedef unsigned uint128_t __attribute__((mode(TI)));
918   int func(uint64_t a, uint64_t b) {
919            uint128_t c = ((uint128_t)a) * b;
920            int ok = ((uint64_t)(c>>96)) == 522859 &&
921              (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
922                  (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
923                  (((uint64_t)(c))&0xffffffffL) == 0;
924            return ok;
925       }
926   ], [dnl
927     int ok = func( ((uint64_t)2000000000) * 1000000000,
928                    ((uint64_t)1234567890) << 24);
929         return !ok;
930       ])],
931   [tor_cv_can_use_curve25519_donna_c64=yes],
932       [tor_cv_can_use_curve25519_donna_c64=no],
933   [AC_LINK_IFELSE(
934         [AC_LANG_PROGRAM([dnl
935       #include <stdint.h>
936       typedef unsigned uint128_t __attribute__((mode(TI)));
937   int func(uint64_t a, uint64_t b) {
938            uint128_t c = ((uint128_t)a) * b;
939            int ok = ((uint64_t)(c>>96)) == 522859 &&
940              (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
941                  (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
942                  (((uint64_t)(c))&0xffffffffL) == 0;
943            return ok;
944       }
945   ], [dnl
946     int ok = func( ((uint64_t)2000000000) * 1000000000,
947                  ((uint64_t)1234567890) << 24);
948         return !ok;
949       ])],
950           [tor_cv_can_use_curve25519_donna_c64=cross],
951       [tor_cv_can_use_curve25519_donna_c64=no])])])
953 AC_CHECK_HEADERS([crypto_scalarmult_curve25519.h \
954                   nacl/crypto_scalarmult_curve25519.h])
956 AC_CACHE_CHECK([for nacl compiled with a fast curve25519 implementation],
957   tor_cv_can_use_curve25519_nacl,
958   [tor_saved_LIBS="$LIBS"
959    LIBS="$LIBS -lnacl"
960    AC_LINK_IFELSE(
961      [AC_LANG_PROGRAM([dnl
962        #ifdef HAVE_CRYPTO_SCALARMULT_CURVE25519_H
963        #include <crypto_scalarmult_curve25519.h>
964    #elif defined(HAVE_NACL_CRYPTO_SCALARMULT_CURVE25519_H)
965    #include <nacl/crypto_scalarmult_curve25519.h>
966    #endif
967        #ifdef crypto_scalarmult_curve25519_ref_BYTES
968    #error Hey, this is the reference implementation! That's not fast.
969    #endif
970      ], [
971    unsigned char *a, *b, *c; crypto_scalarmult_curve25519(a,b,c);
972      ])], [tor_cv_can_use_curve25519_nacl=yes],
973      [tor_cv_can_use_curve25519_nacl=no])
974    LIBS="$tor_saved_LIBS" ])
976  dnl Okay, now we need to figure out which one to actually use. Fall back
977  dnl to curve25519-donna.c
979  if test "x$tor_cv_can_use_curve25519_donna_c64" != "xno"; then
980    build_curve25519_donna_c64=yes
981    use_curve25519_donna=yes
982  elif test "x$tor_cv_can_use_curve25519_nacl" = "xyes"; then
983    use_curve25519_nacl=yes
984    CURVE25519_LIBS=-lnacl
985  else
986    build_curve25519_donna=yes
987    use_curve25519_donna=yes
988  fi
990 if test "x$use_curve25519_donna" = "xyes"; then
991   AC_DEFINE(USE_CURVE25519_DONNA, 1,
992             [Defined if we should use an internal curve25519_donna{,_c64} implementation])
994 if test "x$use_curve25519_nacl" = "xyes"; then
995   AC_DEFINE(USE_CURVE25519_NACL, 1,
996             [Defined if we should use a curve25519 from nacl])
998 AM_CONDITIONAL(BUILD_CURVE25519_DONNA,
999   test "x$build_curve25519_donna" = "xyes")
1000 AM_CONDITIONAL(BUILD_CURVE25519_DONNA_C64,
1001   test "x$build_curve25519_donna_c64" = "xyes")
1002 AC_SUBST(CURVE25519_LIBS)
1004 dnl Make sure to enable support for large off_t if available.
1005 AC_SYS_LARGEFILE
1007 AC_CHECK_HEADERS([assert.h \
1008                   errno.h \
1009                   fcntl.h \
1010                   signal.h \
1011                   string.h \
1012                   sys/capability.h \
1013                   sys/fcntl.h \
1014                   sys/stat.h \
1015                   sys/time.h \
1016                   sys/types.h \
1017                   time.h \
1018                   unistd.h \
1019                   arpa/inet.h \
1020                   crt_externs.h \
1021                   execinfo.h \
1022                   gnu/libc-version.h \
1023                   grp.h \
1024                   ifaddrs.h \
1025                   inttypes.h \
1026                   limits.h \
1027                   linux/types.h \
1028                   machine/limits.h \
1029                   malloc.h \
1030                   malloc/malloc.h \
1031                   malloc_np.h \
1032                   netdb.h \
1033                   netinet/in.h \
1034                   netinet/in6.h \
1035                   pwd.h \
1036                   readpassphrase.h \
1037                   stdint.h \
1038                   sys/eventfd.h \
1039                   sys/file.h \
1040                   sys/ioctl.h \
1041                   sys/limits.h \
1042                   sys/mman.h \
1043                   sys/param.h \
1044                   sys/prctl.h \
1045                   sys/random.h \
1046                   sys/resource.h \
1047                   sys/select.h \
1048                   sys/socket.h \
1049                   sys/statvfs.h \
1050                   sys/syscall.h \
1051                   sys/sysctl.h \
1052                   sys/syslimits.h \
1053                   sys/time.h \
1054                   sys/types.h \
1055                   sys/un.h \
1056                   sys/utime.h \
1057                   sys/wait.h \
1058                   syslog.h \
1059                   utime.h])
1061 AC_CHECK_HEADERS(sys/param.h)
1063 AC_CHECK_HEADERS(net/if.h, net_if_found=1, net_if_found=0,
1064 [#ifdef HAVE_SYS_TYPES_H
1065 #include <sys/types.h>
1066 #endif
1067 #ifdef HAVE_SYS_SOCKET_H
1068 #include <sys/socket.h>
1069 #endif])
1070 AC_CHECK_HEADERS(net/pfvar.h, net_pfvar_found=1, net_pfvar_found=0,
1071 [#ifdef HAVE_SYS_TYPES_H
1072 #include <sys/types.h>
1073 #endif
1074 #ifdef HAVE_SYS_SOCKET_H
1075 #include <sys/socket.h>
1076 #endif
1077 #ifdef HAVE_NET_IF_H
1078 #include <net/if.h>
1079 #endif
1080 #ifdef HAVE_NETINET_IN_H
1081 #include <netinet/in.h>
1082 #endif])
1084 AC_CHECK_HEADERS(linux/if.h,[],[],
1086 #ifdef HAVE_SYS_SOCKET_H
1087 #include <sys/socket.h>
1088 #endif
1091 AC_CHECK_HEADERS(linux/netfilter_ipv4.h,
1092         linux_netfilter_ipv4=1, linux_netfilter_ipv4=0,
1093 [#ifdef HAVE_SYS_TYPES_H
1094 #include <sys/types.h>
1095 #endif
1096 #ifdef HAVE_SYS_SOCKET_H
1097 #include <sys/socket.h>
1098 #endif
1099 #ifdef HAVE_LIMITS_H
1100 #include <limits.h>
1101 #endif
1102 #ifdef HAVE_LINUX_TYPES_H
1103 #include <linux/types.h>
1104 #endif
1105 #ifdef HAVE_NETINET_IN6_H
1106 #include <netinet/in6.h>
1107 #endif
1108 #ifdef HAVE_NETINET_IN_H
1109 #include <netinet/in.h>
1110 #endif])
1112 AC_CHECK_HEADERS(linux/netfilter_ipv6/ip6_tables.h,
1113         linux_netfilter_ipv6_ip6_tables=1, linux_netfilter_ipv6_ip6_tables=0,
1114 [#ifdef HAVE_SYS_TYPES_H
1115 #include <sys/types.h>
1116 #endif
1117 #ifdef HAVE_SYS_SOCKET_H
1118 #include <sys/socket.h>
1119 #endif
1120 #ifdef HAVE_LIMITS_H
1121 #include <limits.h>
1122 #endif
1123 #ifdef HAVE_LINUX_TYPES_H
1124 #include <linux/types.h>
1125 #endif
1126 #ifdef HAVE_NETINET_IN6_H
1127 #include <netinet/in6.h>
1128 #endif
1129 #ifdef HAVE_NETINET_IN_H
1130 #include <netinet/in.h>
1131 #endif
1132 #ifdef HAVE_LINUX_IF_H
1133 #include <linux/if.h>
1134 #endif])
1136 transparent_ok=0
1137 if test "x$net_if_found" = "x1" && test "x$net_pfvar_found" = "x1"; then
1138   transparent_ok=1
1140 if test "x$linux_netfilter_ipv4" = "x1"; then
1141   transparent_ok=1
1143 if test "x$linux_netfilter_ipv6_ip6_tables" = "x1"; then
1144   transparent_ok=1
1146 if test "x$transparent_ok" = "x1"; then
1147   AC_DEFINE(USE_TRANSPARENT, 1, "Define to enable transparent proxy support")
1148   case "$host" in
1149     *-*-openbsd* | *-*-bitrig*)
1150       AC_DEFINE(OPENBSD, 1, "Define to handle pf on OpenBSD properly") ;;
1151   esac
1152 else
1153   AC_MSG_NOTICE([Transparent proxy support enabled, but missing headers.])
1156 AC_CHECK_MEMBERS([struct timeval.tv_sec], , ,
1157 [#ifdef HAVE_SYS_TYPES_H
1158 #include <sys/types.h>
1159 #endif
1160 #ifdef HAVE_SYS_TIME_H
1161 #include <sys/time.h>
1162 #endif])
1164 dnl In case we aren't given a working stdint.h, we'll need to grow our own.
1165 dnl Watch out.
1167 AC_CHECK_SIZEOF(int8_t)
1168 AC_CHECK_SIZEOF(int16_t)
1169 AC_CHECK_SIZEOF(int32_t)
1170 AC_CHECK_SIZEOF(int64_t)
1171 AC_CHECK_SIZEOF(uint8_t)
1172 AC_CHECK_SIZEOF(uint16_t)
1173 AC_CHECK_SIZEOF(uint32_t)
1174 AC_CHECK_SIZEOF(uint64_t)
1175 AC_CHECK_SIZEOF(intptr_t)
1176 AC_CHECK_SIZEOF(uintptr_t)
1178 dnl AC_CHECK_TYPES([int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t, uint64_t, intptr_t, uintptr_t])
1180 AC_CHECK_SIZEOF(char)
1181 AC_CHECK_SIZEOF(short)
1182 AC_CHECK_SIZEOF(int)
1183 AC_CHECK_SIZEOF(long)
1184 AC_CHECK_SIZEOF(long long)
1185 AC_CHECK_SIZEOF(__int64)
1186 AC_CHECK_SIZEOF(void *)
1187 AC_CHECK_SIZEOF(time_t)
1188 AC_CHECK_SIZEOF(size_t)
1189 AC_CHECK_SIZEOF(pid_t)
1191 AC_CHECK_TYPES([uint, u_char, ssize_t])
1193 AC_PC_FROM_UCONTEXT([:])
1195 dnl used to include sockaddr_storage, but everybody has that.
1196 AC_CHECK_TYPES([struct in6_addr, struct sockaddr_in6, sa_family_t], , ,
1197 [#ifdef HAVE_SYS_TYPES_H
1198 #include <sys/types.h>
1199 #endif
1200 #ifdef HAVE_NETINET_IN_H
1201 #include <netinet/in.h>
1202 #endif
1203 #ifdef HAVE_NETINET_IN6_H
1204 #include <netinet/in6.h>
1205 #endif
1206 #ifdef HAVE_SYS_SOCKET_H
1207 #include <sys/socket.h>
1208 #endif
1209 #ifdef _WIN32
1210 #define _WIN32_WINNT 0x0501
1211 #define WIN32_LEAN_AND_MEAN
1212 #include <winsock2.h>
1213 #include <ws2tcpip.h>
1214 #endif
1216 AC_CHECK_MEMBERS([struct in6_addr.s6_addr32, struct in6_addr.s6_addr16, struct sockaddr_in.sin_len, struct sockaddr_in6.sin6_len], , ,
1217 [#ifdef HAVE_SYS_TYPES_H
1218 #include <sys/types.h>
1219 #endif
1220 #ifdef HAVE_NETINET_IN_H
1221 #include <netinet/in.h>
1222 #endif
1223 #ifdef HAVE_NETINET_IN6_H
1224 #include <netinet/in6.h>
1225 #endif
1226 #ifdef HAVE_SYS_SOCKET_H
1227 #include <sys/socket.h>
1228 #endif
1229 #ifdef _WIN32
1230 #define _WIN32_WINNT 0x0501
1231 #define WIN32_LEAN_AND_MEAN
1232 #include <winsock2.h>
1233 #include <ws2tcpip.h>
1234 #endif
1237 AC_CHECK_TYPES([rlim_t], , ,
1238 [#ifdef HAVE_SYS_TYPES_H
1239 #include <sys/types.h>
1240 #endif
1241 #ifdef HAVE_SYS_TIME_H
1242 #include <sys/time.h>
1243 #endif
1244 #ifdef HAVE_SYS_RESOURCE_H
1245 #include <sys/resource.h>
1246 #endif
1249 AX_CHECK_SIGN([time_t],
1250        [ : ],
1251        [ : ], [
1252 #ifdef HAVE_SYS_TYPES_H
1253 #include <sys/types.h>
1254 #endif
1255 #ifdef HAVE_SYS_TIME_H
1256 #include <sys/time.h>
1257 #endif
1258 #ifdef HAVE_TIME_H
1259 #include <time.h>
1260 #endif
1263 if test "$ax_cv_decl_time_t_signed" = "no"; then
1264   AC_MSG_ERROR([You have an unsigned time_t; Tor does not support that. Please tell the Tor developers about your interesting platform.])
1267 AX_CHECK_SIGN([size_t],
1268        [ tor_cv_size_t_signed=yes ],
1269        [ tor_cv_size_t_signed=no ], [
1270 #ifdef HAVE_SYS_TYPES_H
1271 #include <sys/types.h>
1272 #endif
1275 if test "$ax_cv_decl_size_t_signed" = "yes"; then
1276   AC_MSG_ERROR([You have a signed size_t; that's grossly nonconformant.])
1279 AX_CHECK_SIGN([enum always],
1280        [ AC_DEFINE(ENUM_VALS_ARE_SIGNED, 1, [Define if enum is always signed]) ],
1281        [ : ], [
1282  enum always { AAA, BBB, CCC };
1285 AC_CHECK_SIZEOF(socklen_t, , [AC_INCLUDES_DEFAULT()
1286 #ifdef HAVE_SYS_SOCKET_H
1287 #include <sys/socket.h>
1288 #endif
1291 # We want to make sure that we _don't_ have a cell_t defined, like IRIX does.
1293 AC_CHECK_SIZEOF(cell_t)
1295 # Now make sure that NULL can be represented as zero bytes.
1296 AC_CACHE_CHECK([whether memset(0) sets pointers to NULL], tor_cv_null_is_zero,
1297 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1298 [[#include <stdlib.h>
1299 #include <string.h>
1300 #include <stdio.h>
1301 #ifdef HAVE_STDDEF_H
1302 #include <stddef.h>
1303 #endif
1304 int main () { char *p1,*p2; p1=NULL; memset(&p2,0,sizeof(p2));
1305 return memcmp(&p1,&p2,sizeof(char*))?1:0; }]])],
1306        [tor_cv_null_is_zero=yes],
1307        [tor_cv_null_is_zero=no],
1308        [tor_cv_null_is_zero=cross])])
1310 if test "$tor_cv_null_is_zero" = "cross"; then
1311   # Cross-compiling; let's hope that the target isn't raving mad.
1312   AC_MSG_NOTICE([Cross-compiling: we'll assume that NULL is represented as a sequence of 0-valued bytes.])
1315 if test "$tor_cv_null_is_zero" != "no"; then
1316   AC_DEFINE([NULL_REP_IS_ZERO_BYTES], 1,
1317             [Define to 1 iff memset(0) sets pointers to NULL])
1320 AC_CACHE_CHECK([whether memset(0) sets doubles to 0.0], tor_cv_dbl0_is_zero,
1321 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1322 [[#include <stdlib.h>
1323 #include <string.h>
1324 #include <stdio.h>
1325 #ifdef HAVE_STDDEF_H
1326 #include <stddef.h>
1327 #endif
1328 int main () { double d1,d2; d1=0; memset(&d2,0,sizeof(d2));
1329 return memcmp(&d1,&d2,sizeof(d1))?1:0; }]])],
1330        [tor_cv_dbl0_is_zero=yes],
1331        [tor_cv_dbl0_is_zero=no],
1332        [tor_cv_dbl0_is_zero=cross])])
1334 if test "$tor_cv_dbl0_is_zero" = "cross"; then
1335   # Cross-compiling; let's hope that the target isn't raving mad.
1336   AC_MSG_NOTICE([Cross-compiling: we'll assume that 0.0 can be represented as a sequence of 0-valued bytes.])
1339 if test "$tor_cv_dbl0_is_zero" != "no"; then
1340   AC_DEFINE([DOUBLE_0_REP_IS_ZERO_BYTES], 1,
1341             [Define to 1 iff memset(0) sets doubles to 0.0])
1344 # And what happens when we malloc zero?
1345 AC_CACHE_CHECK([whether we can malloc(0) safely.], tor_cv_malloc_zero_works,
1346 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1347 [[#include <stdlib.h>
1348 #include <string.h>
1349 #include <stdio.h>
1350 #ifdef HAVE_STDDEF_H
1351 #include <stddef.h>
1352 #endif
1353 int main () { return malloc(0)?0:1; }]])],
1354        [tor_cv_malloc_zero_works=yes],
1355        [tor_cv_malloc_zero_works=no],
1356        [tor_cv_malloc_zero_works=cross])])
1358 if test "$tor_cv_malloc_zero_works" = "cross"; then
1359   # Cross-compiling; let's hope that the target isn't raving mad.
1360   AC_MSG_NOTICE([Cross-compiling: we'll assume that we need to check malloc() arguments for 0.])
1363 if test "$tor_cv_malloc_zero_works" = "yes"; then
1364   AC_DEFINE([MALLOC_ZERO_WORKS], 1,
1365             [Define to 1 iff malloc(0) returns a pointer])
1368 # whether we seem to be in a 2s-complement world.
1369 AC_CACHE_CHECK([whether we are using 2s-complement arithmetic], tor_cv_twos_complement,
1370 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1371 [[int main () { int problem = ((-99) != (~99)+1);
1372 return problem ? 1 : 0; }]])],
1373        [tor_cv_twos_complement=yes],
1374        [tor_cv_twos_complement=no],
1375        [tor_cv_twos_complement=cross])])
1377 if test "$tor_cv_twos_complement" = "cross"; then
1378   # Cross-compiling; let's hope that the target isn't raving mad.
1379   AC_MSG_NOTICE([Cross-compiling: we'll assume that negative integers are represented with two's complement.])
1382 if test "$tor_cv_twos_complement" != "no"; then
1383   AC_DEFINE([USING_TWOS_COMPLEMENT], 1,
1384             [Define to 1 iff we represent negative integers with
1385              two's complement])
1388 # What does shifting a negative value do?
1389 AC_CACHE_CHECK([whether right-shift on negative values does sign-extension], tor_cv_sign_extend,
1390 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1391 [[int main () { int okay = (-60 >> 8) == -1; return okay ? 0 : 1; }]])],
1392        [tor_cv_sign_extend=yes],
1393        [tor_cv_sign_extend=no],
1394        [tor_cv_sign_extend=cross])])
1396 if test "$tor_cv_sign_extend" = "cross"; then
1397   # Cross-compiling; let's hope that the target isn't raving mad.
1398   AC_MSG_NOTICE([Cross-compiling: we'll assume that right-shifting negative integers causes sign-extension])
1401 if test "$tor_cv_sign_extend" != "no"; then
1402   AC_DEFINE([RSHIFT_DOES_SIGN_EXTEND], 1,
1403             [Define to 1 iff right-shifting a negative value performs sign-extension])
1406 # Whether we should use the dmalloc memory allocation debugging library.
1407 AC_MSG_CHECKING(whether to use dmalloc (debug memory allocation library))
1408 AC_ARG_WITH(dmalloc,
1409 AS_HELP_STRING(--with-dmalloc, [use debug memory allocation library]),
1410 [if [[ "$withval" = "yes" ]]; then
1411   dmalloc=1
1412   AC_MSG_RESULT(yes)
1413 else
1414   dmalloc=1
1415   AC_MSG_RESULT(no)
1416 fi], [ dmalloc=0; AC_MSG_RESULT(no) ]
1419 if [[ $dmalloc -eq 1 ]]; then
1420   AC_CHECK_HEADERS(dmalloc.h, , AC_MSG_ERROR(dmalloc header file not found. Do you have the development files for dmalloc installed?))
1421   AC_SEARCH_LIBS(dmalloc_malloc, [dmallocth dmalloc], , AC_MSG_ERROR(Libdmalloc library not found. If you enable it you better have it installed.))
1422   AC_DEFINE(USE_DMALLOC, 1, [Debug memory allocation library])
1423   AC_CHECK_FUNCS(dmalloc_strdup dmalloc_strndup)
1426 AC_ARG_WITH(tcmalloc,
1427 AS_HELP_STRING(--with-tcmalloc, [use tcmalloc memory allocation library]),
1428 [ tcmalloc=yes ], [ tcmalloc=no ])
1430 if test "x$tcmalloc" = "xyes"; then
1431    LDFLAGS="-ltcmalloc $LDFLAGS"
1434 using_custom_malloc=no
1435 if test "x$enable_openbsd_malloc" = "xyes"; then
1436    using_custom_malloc=yes
1438 if test "x$tcmalloc" = "xyes"; then
1439    using_custom_malloc=yes
1441 if test "$using_custom_malloc" = "no"; then
1442    AC_CHECK_FUNCS(mallinfo)
1444 if test "$using_custom_malloc" = "yes"; then
1445   # Tell the C compiler not to use the system allocator functions.
1446   TOR_CHECK_CFLAGS([-fno-builtin-malloc -fno-builtin-realloc -fno-builtin-calloc -fno-builtin-free])
1449 # By default, we're going to assume we don't have mlockall()
1450 # bionic and other platforms have various broken mlockall subsystems.
1451 # Some systems don't have a working mlockall, some aren't linkable,
1452 # and some have it but don't declare it.
1453 AC_CHECK_FUNCS(mlockall)
1454 AC_CHECK_DECLS([mlockall], , , [
1455 #ifdef HAVE_SYS_MMAN_H
1456 #include <sys/mman.h>
1457 #endif])
1459 # Allow user to specify an alternate syslog facility
1460 AC_ARG_WITH(syslog-facility,
1461 AS_HELP_STRING(--with-syslog-facility=LOG, [syslog facility to use (default=LOG_DAEMON)]),
1462 syslog_facility="$withval", syslog_facility="LOG_DAEMON")
1463 AC_DEFINE_UNQUOTED(LOGFACILITY,$syslog_facility,[name of the syslog facility])
1464 AC_SUBST(LOGFACILITY)
1466 # Check if we have getresuid and getresgid
1467 AC_CHECK_FUNCS(getresuid getresgid)
1469 # Check for gethostbyname_r in all its glorious incompatible versions.
1470 #   (This logic is based on that in Python's configure.in)
1471 AH_TEMPLATE(HAVE_GETHOSTBYNAME_R,
1472   [Define this if you have any gethostbyname_r()])
1474 AC_CHECK_FUNC(gethostbyname_r, [
1475   AC_MSG_CHECKING([how many arguments gethostbyname_r() wants])
1476   OLD_CFLAGS=$CFLAGS
1477   CFLAGS="$CFLAGS $MY_CPPFLAGS $MY_THREAD_CPPFLAGS $MY_CFLAGS"
1478   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
1479 #include <netdb.h>
1480   ], [[
1481     char *cp1, *cp2;
1482     struct hostent *h1, *h2;
1483     int i1, i2;
1484     (void)gethostbyname_r(cp1,h1,cp2,i1,&h2,&i2);
1485   ]])],[
1486     AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1487     AC_DEFINE(HAVE_GETHOSTBYNAME_R_6_ARG, 1,
1488      [Define this if gethostbyname_r takes 6 arguments])
1489     AC_MSG_RESULT(6)
1490   ], [
1491     AC_TRY_COMPILE([
1492 #include <netdb.h>
1493     ], [
1494       char *cp1, *cp2;
1495       struct hostent *h1;
1496       int i1, i2;
1497       (void)gethostbyname_r(cp1,h1,cp2,i1,&i2);
1498     ], [
1499       AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1500       AC_DEFINE(HAVE_GETHOSTBYNAME_R_5_ARG, 1,
1501         [Define this if gethostbyname_r takes 5 arguments])
1502       AC_MSG_RESULT(5)
1503    ], [
1504       AC_TRY_COMPILE([
1505 #include <netdb.h>
1506      ], [
1507        char *cp1;
1508        struct hostent *h1;
1509        struct hostent_data hd;
1510        (void) gethostbyname_r(cp1,h1,&hd);
1511      ], [
1512        AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1513        AC_DEFINE(HAVE_GETHOSTBYNAME_R_3_ARG, 1,
1514          [Define this if gethostbyname_r takes 3 arguments])
1515        AC_MSG_RESULT(3)
1516      ], [
1517        AC_MSG_RESULT(0)
1518      ])
1519   ])
1520  ])
1521  CFLAGS=$OLD_CFLAGS
1524 AC_CACHE_CHECK([whether the C compiler supports __func__],
1525   tor_cv_have_func_macro,
1526   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1527 #include <stdio.h>
1528 int main(int c, char **v) { puts(__func__); }])],
1529   tor_cv_have_func_macro=yes,
1530   tor_cv_have_func_macro=no))
1532 AC_CACHE_CHECK([whether the C compiler supports __FUNC__],
1533   tor_cv_have_FUNC_macro,
1534   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1535 #include <stdio.h>
1536 int main(int c, char **v) { puts(__FUNC__); }])],
1537   tor_cv_have_FUNC_macro=yes,
1538   tor_cv_have_FUNC_macro=no))
1540 AC_CACHE_CHECK([whether the C compiler supports __FUNCTION__],
1541   tor_cv_have_FUNCTION_macro,
1542   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1543 #include <stdio.h>
1544 int main(int c, char **v) { puts(__FUNCTION__); }])],
1545   tor_cv_have_FUNCTION_macro=yes,
1546   tor_cv_have_FUNCTION_macro=no))
1548 AC_CACHE_CHECK([whether we have extern char **environ already declared],
1549   tor_cv_have_environ_declared,
1550   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1551 #ifdef HAVE_UNISTD_H
1552 #include <unistd.h>
1553 #endif
1554 #include <stdlib.h>
1555 int main(int c, char **v) { char **t = environ; }])],
1556   tor_cv_have_environ_declared=yes,
1557   tor_cv_have_environ_declared=no))
1559 if test "$tor_cv_have_func_macro" = "yes"; then
1560   AC_DEFINE(HAVE_MACRO__func__, 1, [Defined if the compiler supports __func__])
1563 if test "$tor_cv_have_FUNC_macro" = "yes"; then
1564   AC_DEFINE(HAVE_MACRO__FUNC__, 1, [Defined if the compiler supports __FUNC__])
1567 if test "$tor_cv_have_FUNCTION_macro" = "yes"; then
1568   AC_DEFINE(HAVE_MACRO__FUNCTION__, 1,
1569            [Defined if the compiler supports __FUNCTION__])
1572 if test "$tor_cv_have_environ_declared" = "yes"; then
1573   AC_DEFINE(HAVE_EXTERN_ENVIRON_DECLARED, 1,
1574            [Defined if we have extern char **environ already declared])
1577 # $prefix stores the value of the --prefix command line option, or
1578 # NONE if the option wasn't set.  In the case that it wasn't set, make
1579 # it be the default, so that we can use it to expand directories now.
1580 if test "x$prefix" = "xNONE"; then
1581   prefix=$ac_default_prefix
1584 # and similarly for $exec_prefix
1585 if test "x$exec_prefix" = "xNONE"; then
1586   exec_prefix=$prefix
1589 if test "x$BUILDDIR" = "x"; then
1590   BUILDDIR=`pwd`
1592 AC_SUBST(BUILDDIR)
1593 AH_TEMPLATE([BUILDDIR],[tor's build directory])
1594 AC_DEFINE_UNQUOTED(BUILDDIR,"$BUILDDIR")
1596 if test "x$CONFDIR" = "x"; then
1597   CONFDIR=`eval echo $sysconfdir/tor`
1599 AC_SUBST(CONFDIR)
1600 AH_TEMPLATE([CONFDIR],[tor's configuration directory])
1601 AC_DEFINE_UNQUOTED(CONFDIR,"$CONFDIR")
1603 BINDIR=`eval echo $bindir`
1604 AC_SUBST(BINDIR)
1605 LOCALSTATEDIR=`eval echo $localstatedir`
1606 AC_SUBST(LOCALSTATEDIR)
1608 if test "$bwin32" = "true"; then
1609   # Test if the linker supports the --nxcompat and --dynamicbase options
1610   # for Windows
1611   save_LDFLAGS="$LDFLAGS"
1612   LDFLAGS="-Wl,--nxcompat -Wl,--dynamicbase"
1613   AC_MSG_CHECKING([whether the linker supports DllCharacteristics])
1614   AC_LINK_IFELSE([AC_LANG_PROGRAM([])],
1615     [AC_MSG_RESULT([yes])]
1616     [save_LDFLAGS="$save_LDFLAGS $LDFLAGS"],
1617     [AC_MSG_RESULT([no])]
1618   )
1619   LDFLAGS="$save_LDFLAGS"
1622 # Set CFLAGS _after_ all the above checks, since our warnings are stricter
1623 # than autoconf's macros like.
1624 if test "$GCC" = "yes"; then
1625   # Disable GCC's strict aliasing checks.  They are an hours-to-debug
1626   # accident waiting to happen.
1627   CFLAGS="$CFLAGS -Wall -fno-strict-aliasing"
1628 else
1629   # Override optimization level for non-gcc compilers
1630   CFLAGS="$CFLAGS -O"
1631   enable_gcc_warnings=no
1632   enable_gcc_warnings_advisory=no
1635 # Warnings implies advisory-warnings and -Werror.
1636 if test "$enable_gcc_warnings" = "yes"; then
1637   enable_gcc_warnings_advisory=yes
1638   enable_fatal_warnings=yes
1641 # OS X Lion started deprecating the system openssl. Let's just disable
1642 # all deprecation warnings on OS X. Also, to potentially make the binary
1643 # a little smaller, let's enable dead_strip.
1644 case "$host_os" in
1646  darwin*)
1647     CFLAGS="$CFLAGS -Wno-deprecated-declarations"
1648     LDFLAGS="$LDFLAGS -dead_strip" ;;
1649 esac
1651 # Add some more warnings which we use in development but not in the
1652 # released versions.  (Some relevant gcc versions can't handle these.)
1654 # Note that we have to do this near the end  of the autoconf process, or
1655 # else we may run into problems when these warnings hit on the testing C
1656 # programs that autoconf wants to build.
1657 if test "x$enable_gcc_warnings_advisory" != "xno"; then
1659   case "$host" in
1660     *-*-openbsd* | *-*-bitrig*)
1661       # Some OpenBSD versions (like 4.8) have -Wsystem-headers by default.
1662       # That's fine, except that the headers don't pass -Wredundant-decls.
1663       # Therefore, let's disable -Wsystem-headers when we're building
1664       # with maximal warnings on OpenBSD.
1665       CFLAGS="$CFLAGS -Wno-system-headers" ;;
1666   esac
1668   # GCC4.3 users once report trouble with -Wstrict-overflow=5.  GCC5 users
1669   # have it work better.
1670   # CFLAGS="$CFLAGS -Wstrict-overflow=1"
1672   # This warning was added in gcc 4.3, but it appears to generate
1673   # spurious warnings in gcc 4.4.  I don't know if it works in 4.5.
1674   #CFLAGS="$CFLAGS -Wlogical-op"
1676   m4_foreach_w([warning_flag], [
1677      -Waddress
1678      -Waddress-of-array-temporary
1679      -Waddress-of-temporary
1680      -Wambiguous-macro
1681      -Wanonymous-pack-parens
1682      -Warc
1683      -Warc-abi
1684      -Warc-bridge-casts-disallowed-in-nonarc
1685      -Warc-maybe-repeated-use-of-weak
1686      -Warc-performSelector-leaks
1687      -Warc-repeated-use-of-weak
1688      -Warray-bounds
1689      -Warray-bounds-pointer-arithmetic
1690      -Wasm
1691      -Wasm-operand-widths
1692      -Watomic-properties
1693      -Watomic-property-with-user-defined-accessor
1694      -Wauto-import
1695      -Wauto-storage-class
1696      -Wauto-var-id
1697      -Wavailability
1698      -Wbackslash-newline-escape
1699      -Wbad-array-new-length
1700      -Wbind-to-temporary-copy
1701      -Wbitfield-constant-conversion
1702      -Wbool-conversion
1703      -Wbool-conversions
1704      -Wbuiltin-requires-header
1705      -Wchar-align
1706      -Wcompare-distinct-pointer-types
1707      -Wcomplex-component-init
1708      -Wconditional-type-mismatch
1709      -Wconfig-macros
1710      -Wconstant-conversion
1711      -Wconstant-logical-operand
1712      -Wconstexpr-not-const
1713      -Wcustom-atomic-properties
1714      -Wdangling-field
1715      -Wdangling-initializer-list
1716      -Wdate-time
1717      -Wdelegating-ctor-cycles
1718      -Wdeprecated-implementations
1719      -Wdeprecated-register
1720      -Wdirect-ivar-access
1721      -Wdiscard-qual
1722      -Wdistributed-object-modifiers
1723      -Wdivision-by-zero
1724      -Wdollar-in-identifier-extension
1725      -Wdouble-promotion
1726      -Wduplicate-decl-specifier
1727      -Wduplicate-enum
1728      -Wduplicate-method-arg
1729      -Wduplicate-method-match
1730      -Wduplicated-cond
1731      -Wdynamic-class-memaccess
1732      -Wembedded-directive
1733      -Wempty-translation-unit
1734      -Wenum-conversion
1735      -Wexit-time-destructors
1736      -Wexplicit-ownership-type
1737      -Wextern-initializer
1738      -Wextra
1739      -Wextra-semi
1740      -Wextra-tokens
1741      -Wflexible-array-extensions
1742      -Wfloat-conversion
1743      -Wformat-non-iso
1744      -Wfour-char-constants
1745      -Wgcc-compat
1746      -Wglobal-constructors
1747      -Wgnu-array-member-paren-init
1748      -Wgnu-designator
1749      -Wgnu-static-float-init
1750      -Wheader-guard
1751      -Wheader-hygiene
1752      -Widiomatic-parentheses
1753      -Wignored-attributes
1754      -Wimplicit-atomic-properties
1755      -Wimplicit-conversion-floating-point-to-bool
1756      -Wimplicit-exception-spec-mismatch
1757      -Wimplicit-fallthrough
1758      -Wimplicit-fallthrough-per-function
1759      -Wimplicit-retain-self
1760      -Wimport-preprocessor-directive-pedantic
1761      -Wincompatible-library-redeclaration
1762      -Wincompatible-pointer-types-discards-qualifiers
1763      -Wincomplete-implementation
1764      -Wincomplete-module
1765      -Wincomplete-umbrella
1766      -Winit-self
1767      -Wint-conversions
1768      -Wint-to-void-pointer-cast
1769      -Winteger-overflow
1770      -Winvalid-constexpr
1771      -Winvalid-iboutlet
1772      -Winvalid-noreturn
1773      -Winvalid-pp-token
1774      -Winvalid-source-encoding
1775      -Winvalid-token-paste
1776      -Wknr-promoted-parameter
1777      -Wlanguage-extension-token
1778      -Wlarge-by-value-copy
1779      -Wliteral-conversion
1780      -Wliteral-range
1781      -Wlocal-type-template-args
1782      -Wlogical-op
1783      -Wloop-analysis
1784      -Wmain-return-type
1785      -Wmalformed-warning-check
1786      -Wmethod-signatures
1787      -Wmicrosoft
1788      -Wmicrosoft-exists
1789      -Wmismatched-parameter-types
1790      -Wmismatched-return-types
1791      -Wmissing-field-initializers
1792      -Wmissing-format-attribute
1793      -Wmissing-noreturn
1794      -Wmissing-selector-name
1795      -Wmissing-sysroot
1796      -Wmissing-variable-declarations
1797      -Wmodule-conflict
1798      -Wnested-anon-types
1799      -Wnewline-eof
1800      -Wnon-literal-null-conversion
1801      -Wnon-pod-varargs
1802      -Wnonportable-cfstrings
1803      -Wnormalized=id
1804      -Wnull-arithmetic
1805      -Wnull-character
1806      -Wnull-conversion
1807      -Wnull-dereference
1808      -Wout-of-line-declaration
1809      -Wover-aligned
1810      -Woverlength-strings
1811      -Woverride-init
1812      -Woverriding-method-mismatch
1813      -Wpointer-type-mismatch
1814      -Wpredefined-identifier-outside-function
1815      -Wprotocol-property-synthesis-ambiguity
1816      -Wreadonly-iboutlet-property
1817      -Wreadonly-setter-attrs
1818      -Wreceiver-expr
1819      -Wreceiver-forward-class
1820      -Wreceiver-is-weak
1821      -Wreinterpret-base-class
1822      -Wrequires-super-attribute
1823      -Wreserved-user-defined-literal
1824      -Wreturn-stack-address
1825      -Wsection
1826      -Wselector-type-mismatch
1827      -Wsentinel
1828      -Wserialized-diagnostics
1829      -Wshadow
1830      -Wshift-count-negative
1831      -Wshift-count-overflow
1832      -Wshift-negative-value
1833      -Wshift-overflow=2
1834      -Wshift-sign-overflow
1835      -Wshorten-64-to-32
1836      -Wsizeof-array-argument
1837      -Wsource-uses-openmp
1838      -Wstatic-float-init
1839      -Wstatic-in-inline
1840      -Wstatic-local-in-inline
1841      -Wstrict-overflow=1
1842      -Wstring-compare
1843      -Wstring-conversion
1844      -Wstrlcpy-strlcat-size
1845      -Wstrncat-size
1846      -Wsuggest-attribute=format
1847      -Wsuggest-attribute=noreturn
1848      -Wsuper-class-method-mismatch
1849      -Wswitch-bool
1850      -Wsync-nand
1851      -Wtautological-constant-out-of-range-compare
1852      -Wtentative-definition-incomplete-type
1853      -Wtrampolines
1854      -Wtype-safety
1855      -Wtypedef-redefinition
1856      -Wtypename-missing
1857      -Wundefined-inline
1858      -Wundefined-internal
1859      -Wundefined-reinterpret-cast
1860      -Wunicode
1861      -Wunicode-whitespace
1862      -Wunknown-warning-option
1863      -Wunnamed-type-template-args
1864      -Wunneeded-member-function
1865      -Wunsequenced
1866      -Wunsupported-visibility
1867      -Wunused-but-set-parameter
1868      -Wunused-but-set-variable
1869      -Wunused-command-line-argument
1870      -Wunused-const-variable=2
1871      -Wunused-exception-parameter
1872      -Wunused-local-typedefs
1873      -Wunused-member-function
1874      -Wunused-sanitize-argument
1875      -Wunused-volatile-lvalue
1876      -Wuser-defined-literals
1877      -Wvariadic-macros
1878      -Wvector-conversion
1879      -Wvector-conversions
1880      -Wvexing-parse
1881      -Wvisibility
1882      -Wvla-extension
1883      -Wzero-length-array
1884   ], [ TOR_CHECK_CFLAGS([warning_flag]) ])
1886 dnl    We should re-enable this in some later version.  Clang doesn't
1887 dnl    mind, but it causes trouble with GCC.
1888 dnl     -Wstrict-overflow=2
1890 dnl    These seem to require annotations that we don't currently use,
1891 dnl    and they give false positives in our pthreads wrappers. (Clang 4)
1892 dnl     -Wthread-safety
1893 dnl     -Wthread-safety-analysis
1894 dnl     -Wthread-safety-attributes
1895 dnl     -Wthread-safety-beta
1896 dnl     -Wthread-safety-precise
1898   CFLAGS="$CFLAGS -W -Wfloat-equal -Wundef -Wpointer-arith"
1899   CFLAGS="$CFLAGS -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings"
1900   CFLAGS="$CFLAGS -Wredundant-decls -Wchar-subscripts -Wcomment -Wformat=2"
1901   CFLAGS="$CFLAGS -Wwrite-strings"
1902   CFLAGS="$CFLAGS -Wnested-externs -Wbad-function-cast -Wswitch-enum"
1903   CFLAGS="$CFLAGS -Waggregate-return -Wpacked -Wunused"
1904   CFLAGS="$CFLAGS -Wunused-parameter "
1905   # These interfere with building main() { return 0; }, which autoconf
1906   # likes to use as its default program.
1907   CFLAGS="$CFLAGS -Wold-style-definition -Wmissing-declarations"
1909   if test "$tor_cv_cflags__Wnull_dereference" = "yes"; then
1910     AC_DEFINE([HAVE_CFLAG_WNULL_DEREFERENCE], 1, [True if we have -Wnull-dereference])
1911   fi
1912   if test "$tor_cv_cflags__Woverlength_strings" = "yes"; then
1913     AC_DEFINE([HAVE_CFLAG_WOVERLENGTH_STRINGS], 1, [True if we have -Woverlength-strings])
1914   fi
1916   if test "x$enable_fatal_warnings" = "xyes"; then
1917     # I'd like to use TOR_CHECK_CFLAGS here, but I can't, since the
1918     # default autoconf programs are full of errors.
1919     CFLAGS="$CFLAGS -Werror"
1920   fi
1924 if test "$enable_coverage" = "yes" && test "$have_clang" = "no"; then
1925    case "$host_os" in
1926     darwin*)
1927       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.])
1928    esac
1931 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent $TOR_CPPFLAGS_openssl $TOR_CPPFLAGS_zlib"
1933 AC_CONFIG_FILES([
1934         Doxyfile
1935         Makefile
1936         contrib/dist/suse/tor.sh
1937         contrib/operator-tools/tor.logrotate
1938         contrib/dist/tor.sh
1939         contrib/dist/torctl
1940         contrib/dist/tor.service
1941         src/config/torrc.sample
1942         src/config/torrc.minimal
1943         scripts/maint/checkOptionDocs.pl
1944         scripts/maint/updateVersions.pl
1947 if test "x$asciidoc" = "xtrue" && test "$ASCIIDOC" = "none"; then
1948   regular_mans="doc/tor doc/tor-gencert doc/tor-resolve doc/torify"
1949   for file in $regular_mans ; do
1950     if ! [[ -f "$srcdir/$file.1.in" ]] || ! [[ -f "$srcdir/$file.html.in" ]] ; then
1951       echo "==================================";
1952       echo;
1953       echo "Building Tor has failed since manpages cannot be built.";
1954       echo;
1955       echo "You need asciidoc installed to be able to build the manpages.";
1956       echo "To build without manpages, use the --disable-asciidoc argument";
1957       echo "when calling configure.";
1958       echo;
1959       echo "==================================";
1960       exit 1;
1961     fi
1962   done
1965 AC_OUTPUT