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