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