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
7 AC_INIT([tor],[0.2.8.16-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])
23 if test -f "/etc/redhat-release"; then
24 if test -f "/usr/kerberos/include"; then
25 CPPFLAGS="$CPPFLAGS -I/usr/kerberos/include"
29 # Not a no-op; we want to make sure that CPPFLAGS is set before we use
30 # the += operator on it in src/or/Makefile.am
31 CPPFLAGS="$CPPFLAGS -I\${top_srcdir}/src/common"
33 #XXXX020 We should make these enabled or not, before 0.2.0.x-final
34 AC_ARG_ENABLE(openbsd-malloc,
35 AS_HELP_STRING(--enable-openbsd-malloc, [use malloc code from OpenBSD. Linux only]))
36 AC_ARG_ENABLE(instrument-downloads,
37 AS_HELP_STRING(--enable-instrument-downloads, [instrument downloads of directory resources etc.]))
38 AC_ARG_ENABLE(static-openssl,
39 AS_HELP_STRING(--enable-static-openssl, [link against a static openssl library. Requires --with-openssl-dir]))
40 AC_ARG_ENABLE(static-libevent,
41 AS_HELP_STRING(--enable-static-libevent, [link against a static libevent library. Requires --with-libevent-dir]))
42 AC_ARG_ENABLE(static-zlib,
43 AS_HELP_STRING(--enable-static-zlib, [link against a static zlib library. Requires --with-zlib-dir]))
44 AC_ARG_ENABLE(static-tor,
45 AS_HELP_STRING(--enable-static-tor, [create an entirely static Tor binary. Requires --with-openssl-dir and --with-libevent-dir and --with-zlib-dir]))
46 AC_ARG_ENABLE(unittests,
47 AS_HELP_STRING(--disable-unittests, [don't build unit tests for Tor. Risky!]))
48 AC_ARG_ENABLE(coverage,
49 AS_HELP_STRING(--enable-coverage, [enable coverage support in the unit-test build]))
50 AC_ARG_ENABLE(asserts-in-tests,
51 AS_HELP_STRING(--disable-asserts-in-tests, [disable tor_assert() calls in the unit tests, for branch coverage]))
52 AC_ARG_ENABLE(system-torrc,
53 AS_HELP_STRING(--disable-system-torrc, [don't look for a system-wide torrc file]))
55 if test "x$enable_coverage" != "xyes" -a "x$enable_asserts_in_tests" = "xno" ; then
56 AC_MSG_ERROR([Can't disable assertions outside of coverage build])
59 AM_CONDITIONAL(UNITTESTS_ENABLED, test "x$enable_unittests" != "xno")
60 AM_CONDITIONAL(COVERAGE_ENABLED, test "x$enable_coverage" = "xyes")
61 AM_CONDITIONAL(DISABLE_ASSERTS_IN_UNIT_TESTS, test "x$enable_asserts_in_tests" = "xno")
63 if test "$enable_static_tor" = "yes"; then
64 enable_static_libevent="yes";
65 enable_static_openssl="yes";
66 enable_static_zlib="yes";
67 CFLAGS="$CFLAGS -static"
70 if test "$enable_system_torrc" = "no"; then
71 AC_DEFINE(DISABLE_SYSTEM_TORRC, 1,
72 [Defined if we're not going to look for a torrc in SYSCONF])
75 AM_CONDITIONAL(USE_OPENBSD_MALLOC, test "x$enable_openbsd_malloc" = "xyes")
76 if test "x$enable_instrument_downloads" = "xyes"; then
77 AC_DEFINE(INSTRUMENT_DOWNLOADS, 1,
78 [Defined if we want to keep track of how much of each kind of resource we download.])
81 AC_ARG_ENABLE(transparent,
82 AS_HELP_STRING(--disable-transparent, [disable transparent proxy support]),
83 [case "${enableval}" in
84 "yes") transparent=true ;;
85 "no") transparent=false ;;
86 *) AC_MSG_ERROR(bad value for --enable-transparent) ;;
87 esac], [transparent=true])
89 AC_ARG_ENABLE(asciidoc,
90 AS_HELP_STRING(--disable-asciidoc, [don't use asciidoc (disables building of manpages)]),
91 [case "${enableval}" in
92 "yes") asciidoc=true ;;
93 "no") asciidoc=false ;;
94 *) AC_MSG_ERROR(bad value for --disable-asciidoc) ;;
95 esac], [asciidoc=true])
97 # systemd notify support
98 AC_ARG_ENABLE(systemd,
99 AS_HELP_STRING(--enable-systemd, [enable systemd notification support]),
100 [case "${enableval}" in
101 "yes") systemd=true ;;
102 "no") systemd=false ;;
103 * ) AC_MSG_ERROR(bad value for --enable-systemd) ;;
104 esac], [systemd=auto])
109 if test "x$enable_systemd" = "xno"; then
112 PKG_CHECK_MODULES(SYSTEMD,
116 if test "x$have_systemd" = "xno"; then
117 AC_MSG_NOTICE([Okay, checking for systemd a different way...])
118 PKG_CHECK_MODULES(SYSTEMD,
125 if test "x$have_systemd" = "xyes"; then
126 AC_DEFINE(HAVE_SYSTEMD,1,[Have systemd])
127 TOR_SYSTEMD_CFLAGS="${SYSTEMD_CFLAGS}"
128 TOR_SYSTEMD_LIBS="${SYSTEMD_LIBS}"
129 PKG_CHECK_MODULES(LIBSYSTEMD209, [libsystemd >= 209],
130 [AC_DEFINE(HAVE_SYSTEMD_209,1,[Have systemd v209 or more])], [])
132 AC_SUBST(TOR_SYSTEMD_CFLAGS)
133 AC_SUBST(TOR_SYSTEMD_LIBS)
135 if test "x$enable_systemd" = "xyes" -a "x$have_systemd" != "xyes" ; then
136 AC_MSG_ERROR([Explicitly requested systemd support, but systemd not found])
141 AC_DEFINE(_REENTRANT, 1, [Define on some platforms to activate x_r() functions in time.h])
145 AC_ARG_ENABLE(gcc-warnings,
146 AS_HELP_STRING(--enable-gcc-warnings, [enable verbose warnings]))
147 AC_ARG_ENABLE(gcc-warnings-advisory,
148 AS_HELP_STRING(--enable-gcc-warnings-advisory, [enable verbose warnings, excluding -Werror]))
150 dnl Others suggest '/gs /safeseh /nxcompat /dynamicbase' for non-gcc on Windows
151 AC_ARG_ENABLE(gcc-hardening,
152 AS_HELP_STRING(--disable-gcc-hardening, [disable compiler security checks]))
154 AC_ARG_ENABLE(expensive-hardening,
155 AS_HELP_STRING(--enable-expensive-hardening, [enable more expensive compiler hardening; makes Tor slower]))
157 dnl Linker hardening options
158 dnl Currently these options are ELF specific - you can't use this with MacOSX
159 AC_ARG_ENABLE(linker-hardening,
160 AS_HELP_STRING(--disable-linker-hardening, [disable linker security fixups]))
162 AC_ARG_ENABLE(local-appdata,
163 AS_HELP_STRING(--enable-local-appdata, [default to host local application data paths on Windows]))
164 if test "$enable_local_appdata" = "yes"; then
165 AC_DEFINE(ENABLE_LOCAL_APPDATA, 1,
166 [Defined if we default to host local appdata paths on Windows])
170 AC_ARG_ENABLE(tor2web-mode,
171 AS_HELP_STRING(--enable-tor2web-mode, [support tor2web non-anonymous mode]),
172 [if test "x$enableval" = "xyes"; then
173 CFLAGS="$CFLAGS -D ENABLE_TOR2WEB_MODE=1"
176 AC_ARG_ENABLE(bufferevents,
177 AS_HELP_STRING(--enable-bufferevents, [use Libevent's buffered IO]))
179 AC_ARG_ENABLE(tool-name-check,
180 AS_HELP_STRING(--disable-tool-name-check, [check for sanely named toolchain when cross-compiling]))
182 AC_ARG_ENABLE(seccomp,
183 AS_HELP_STRING(--disable-seccomp, [do not attempt to use libseccomp]))
185 AC_ARG_ENABLE(libscrypt,
186 AS_HELP_STRING(--disable-libscrypt, [do not attempt to use libscrypt]))
188 dnl check for the correct "ar" when cross-compiling
189 AN_MAKEVAR([AR], [AC_PROG_AR])
190 AN_PROGRAM([ar], [AC_PROG_AR])
191 AC_DEFUN([AC_PROG_AR], [AC_CHECK_TOOL([AR], [ar], [ar])])
194 dnl Check whether the above macro has settled for a simply named tool even
195 dnl though we're cross compiling. We must do this before running AC_PROG_CC,
196 dnl because that will find any cc on the system, not only the cross-compiler,
197 dnl and then verify that a binary built with this compiler runs on the
198 dnl build system. It will then come to the false conclusion that we're not
200 if test "x$enable_tool_name_check" != "xno"; then
201 if test "x$ac_tool_warned" = "xyes"; then
202 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.)])
203 elif test "x$ac_ct_AR" != "x" -a "x$cross_compiling" = "xmaybe"; then
204 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.)])
213 AC_PATH_PROG([PERL], [perl])
215 dnl autoconf 2.59 appears not to support AC_PROG_SED
216 AC_CHECK_PROG([SED],[sed],[sed],[/bin/false])
218 dnl check for asciidoc and a2x
219 AC_PATH_PROG([ASCIIDOC], [asciidoc], none)
220 AC_PATH_PROGS([A2X], [a2x a2x.py], none)
222 AM_CONDITIONAL(USE_ASCIIDOC, test "x$asciidoc" = "xtrue")
224 AM_CONDITIONAL(USE_FW_HELPER, test "x$natpmp" = "xtrue" || test "x$upnp" = "xtrue")
225 AM_CONDITIONAL(NAT_PMP, test "x$natpmp" = "xtrue")
226 AM_CONDITIONAL(MINIUPNPC, test "x$upnp" = "xtrue")
230 AC_ARG_VAR([PYTHON], [path to Python binary])
231 AC_CHECK_PROGS(PYTHON, [python python2 python2.7 python3 python3.3])
232 if test "x$PYTHON" = "x"; then
233 AC_MSG_WARN([Python unavailable; some tests will not be run.])
235 AM_CONDITIONAL(USEPYTHON, [test "x$PYTHON" != "x"])
237 ifdef([AC_C_FLEXIBLE_ARRAY_MEMBER], [
238 AC_C_FLEXIBLE_ARRAY_MEMBER
240 dnl Maybe we've got an old autoconf...
241 AC_CACHE_CHECK([for flexible array members],
245 struct abc { int a; char b[]; };
247 struct abc *def = malloc(sizeof(struct abc)+sizeof(char));
250 [tor_cv_c_flexarray=yes],
251 [tor_cv_c_flexarray=no])])
252 if test "$tor_cv_flexarray" = "yes"; then
253 AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [], [Define to nothing if C supports flexible array members, and to 1 if it does not.])
255 AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [1], [Define to nothing if C supports flexible array members, and to 1 if it does not.])
259 AC_CACHE_CHECK([for working C99 mid-block declaration syntax],
262 [AC_LANG_PROGRAM([], [int x; x = 3; int y; y = 4 + x;])],
263 [tor_cv_c_c99_decl=yes],
264 [tor_cv_c_c99_decl=no] )])
265 if test "$tor_cv_c_c99_decl" != "yes"; then
266 AC_MSG_ERROR([Your compiler doesn't support c99 mid-block declarations. This is required as of Tor 0.2.6.x])
269 AC_CACHE_CHECK([for working C99 designated initializers],
270 tor_cv_c_c99_designated_init,
272 [AC_LANG_PROGRAM([struct s { int a; int b; };],
273 [[ struct s ss = { .b = 5, .a = 6 }; ]])],
274 [tor_cv_c_c99_designated_init=yes],
275 [tor_cv_c_c99_designated_init=no] )])
277 if test "$tor_cv_c_c99_designated_init" != "yes"; then
278 AC_MSG_ERROR([Your compiler doesn't support c99 designated initializers. This is required as of Tor 0.2.6.x])
282 AC_ARG_WITH(tor-user,
283 AS_HELP_STRING(--with-tor-user=NAME, [specify username for tor daemon]),
291 AC_ARG_WITH(tor-group,
292 AS_HELP_STRING(--with-tor-group=NAME, [specify group name for tor daemon]),
300 dnl If _WIN32 is defined and non-zero, we are building for win32
301 AC_MSG_CHECKING([for win32])
302 AC_RUN_IFELSE([AC_LANG_SOURCE([
303 int main(int c, char **v) {
314 bwin32=true; AC_MSG_RESULT([yes]),
315 bwin32=false; AC_MSG_RESULT([no]),
316 bwin32=cross; AC_MSG_RESULT([cross])
319 if test "$bwin32" = "cross"; then
320 AC_MSG_CHECKING([for win32 (cross)])
321 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
323 int main(int c, char **v) {return 0;}
326 int main(int c, char **v) {return x(y);}
329 bwin32=true; AC_MSG_RESULT([yes]),
330 bwin32=false; AC_MSG_RESULT([no]))
335 /* Defined to access windows functions and definitions for >=WinXP */
337 # define WINVER 0x0501
340 /* Defined to access _other_ windows functions and definitions for >=WinXP */
341 # ifndef _WIN32_WINNT
342 # define _WIN32_WINNT 0x0501
345 /* Defined to avoid including some windows headers as part of Windows.h */
346 # ifndef WIN32_LEAN_AND_MEAN
347 # define WIN32_LEAN_AND_MEAN 1
353 AM_CONDITIONAL(BUILD_NT_SERVICES, test "x$bwin32" = "xtrue")
355 dnl Enable C99 when compiling with MIPSpro
356 AC_MSG_CHECKING([for MIPSpro compiler])
357 AC_COMPILE_IFELSE([AC_LANG_PROGRAM(, [
358 #if (defined(__sgi) && defined(_COMPILER_VERSION))
363 bmipspro=false; AC_MSG_RESULT(no),
364 bmipspro=true; AC_MSG_RESULT(yes))
366 if test "$bmipspro" = "true"; then
367 CFLAGS="$CFLAGS -c99"
372 AC_SEARCH_LIBS(socket, [socket network])
373 AC_SEARCH_LIBS(gethostbyname, [nsl])
374 AC_SEARCH_LIBS(dlopen, [dl])
375 AC_SEARCH_LIBS(inet_aton, [resolv])
376 AC_SEARCH_LIBS(backtrace, [execinfo])
378 AC_SEARCH_LIBS([clock_gettime], [rt])
379 if test "$LIBS" != "$saved_LIBS"; then
380 # Looks like we need -lrt for clock_gettime().
384 AC_SEARCH_LIBS(pthread_create, [pthread])
385 AC_SEARCH_LIBS(pthread_detach, [pthread])
387 AM_CONDITIONAL(THREADS_WIN32, test "$bwin32" = "true")
388 AM_CONDITIONAL(THREADS_PTHREADS, test "$bwin32" = "false")
392 RtlSecureZeroMemory \
396 backtrace_symbols_fd \
439 # Apple messed up when they added two functions functions in Sierra: they
440 # forgot to decorate them with appropriate AVAILABLE_MAC_OS_VERSION
441 # checks. So we should only probe for those functions if we are sure that we
442 # are not targetting OSX 10.11 or earlier.
443 AC_MSG_CHECKING([for a pre-Sierra OSX build target])
446 # include <AvailabilityMacros.h>
447 # ifndef MAC_OS_VERSION_10_12
448 # define MAC_OS_VERSION_10_12 101200
450 # if defined(MAC_OS_X_VERSION_MIN_REQUIRED)
451 # if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_VERSION_10_12
452 # error "Running on Mac OSX 10.11 or earlier"
457 [on_macos_pre_10_12=no ; AC_MSG_RESULT([no])],
458 [on_macos_pre_10_12=yes; AC_MSG_RESULT([yes])])
460 if test "$on_macos_pre_10_12" = "no"; then
467 if test "$bwin32" != "true"; then
468 AC_CHECK_HEADERS(pthread.h)
469 AC_CHECK_FUNCS(pthread_create)
470 AC_CHECK_FUNCS(pthread_condattr_setclock)
473 if test "$bwin32" = "true"; then
474 AC_CHECK_DECLS([SecureZeroMemory, _getwch], , , [
481 AM_CONDITIONAL(BUILD_READPASSPHRASE_C,
482 test "x$ac_cv_func_readpassphrase" = "xno" && test "$bwin32" = "false")
484 dnl ------------------------------------------------------
485 dnl Where do you live, libevent? And how do we call you?
487 if test "$bwin32" = "true"; then
488 TOR_LIB_WS32=-lws2_32
489 TOR_LIB_IPHLPAPI=-liphlpapi
490 # Some of the cargo-cults recommend -lwsock32 as well, but I don't
491 # think it's actually necessary.
497 AC_SUBST(TOR_LIB_WS32)
498 AC_SUBST(TOR_LIB_GDI)
499 AC_SUBST(TOR_LIB_IPHLPAPI)
501 tor_libevent_pkg_redhat="libevent"
502 tor_libevent_pkg_debian="libevent-dev"
503 tor_libevent_devpkg_redhat="libevent-devel"
504 tor_libevent_devpkg_debian="libevent-dev"
506 dnl On Gnu/Linux or any place we require it, we'll add librt to the Libevent
507 dnl linking for static builds.
508 STATIC_LIBEVENT_FLAGS=""
509 if test "$enable_static_libevent" = "yes"; then
510 if test "$have_rt" = "yes"; then
511 STATIC_LIBEVENT_FLAGS=" -lrt "
515 TOR_SEARCH_LIBRARY(libevent, $trylibeventdir, [-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32], [
517 #include <winsock2.h>
519 #include <sys/time.h>
520 #include <sys/types.h>
521 #include <event.h>], [
523 #include <winsock2.h>
525 void *event_init(void);],
528 {WSADATA d; WSAStartup(0x101,&d); }
531 ], [--with-libevent-dir], [/opt/libevent])
533 dnl Now check for particular libevent functions.
535 save_LDFLAGS="$LDFLAGS"
536 save_CPPFLAGS="$CPPFLAGS"
537 LIBS="-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32 $LIBS"
538 LDFLAGS="$TOR_LDFLAGS_libevent $LDFLAGS"
539 CPPFLAGS="$TOR_CPPFLAGS_libevent $CPPFLAGS"
540 AC_CHECK_FUNCS([event_get_version_number \
541 evutil_secure_rng_set_urandom_device_file \
542 evutil_secure_rng_init \
544 AC_CHECK_MEMBERS([struct event.min_heap_idx], , ,
548 AC_CHECK_HEADERS(event2/event.h event2/dns.h event2/bufferevent_ssl.h)
550 LIBS="$STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32 $save_LIBS"
552 AM_CONDITIONAL(USE_EXTERNAL_EVDNS,
553 test "x$ac_cv_header_event2_dns_h" = "xyes")
555 if test "$enable_static_libevent" = "yes"; then
556 if test "$tor_cv_library_libevent_dir" = "(system)"; then
557 AC_MSG_ERROR("You must specify an explicit --with-libevent-dir=x option when using --enable-static-libevent")
559 TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent.a $STATIC_LIBEVENT_FLAGS"
562 if test "x$ac_cv_header_event2_event_h" = "xyes"; then
563 AC_SEARCH_LIBS(event_new, [event event_core], , AC_MSG_ERROR("libevent2 is installed but linking it failed while searching for event_new"))
564 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"))
566 if test "$ac_cv_search_event_new" != "none required"; then
567 TOR_LIBEVENT_LIBS="$ac_cv_search_event_new"
569 if test "$ac_cv_search_evdns_base_new" != "none required"; then
570 TOR_LIBEVENT_LIBS="$ac_cv_search_evdns_base_new $TOR_LIBEVENT_LIBS"
573 TOR_LIBEVENT_LIBS="-levent"
578 LDFLAGS="$save_LDFLAGS"
579 CPPFLAGS="$save_CPPFLAGS"
581 dnl This isn't the best test for Libevent 2.0.3-alpha. Once it's released,
582 dnl we can do much better.
583 if test "$enable_bufferevents" = "yes"; then
584 if test "$ac_cv_header_event2_bufferevent_ssl_h" != "yes"; then
585 AC_MSG_ERROR([You've asked for bufferevent support, but you're using a version of Libevent without SSL support. This won't work. We need Libevent 2.0.8-rc or later, and you don't seem to even have Libevent 2.0.3-alpha.])
588 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent"
590 # Check for the right version. First see if version detection works.
591 AC_MSG_CHECKING([whether we can detect the Libevent version])
592 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
593 #include <event2/event.h>
594 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 10
600 ])], [event_version_number_works=yes; AC_MSG_RESULT([yes]) ],
601 [event_version_number_works=no; AC_MSG_RESULT([no])])
602 if test "$event_version_number_works" != "yes"; then
603 AC_MSG_WARN([Version detection on Libevent seems broken. Your Libevent installation is probably screwed up or very old.])
605 AC_MSG_CHECKING([whether Libevent is new enough for bufferevents])
606 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
607 #include <event2/event.h>
608 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 0x02000d00
614 ])], [ AC_MSG_RESULT([yes]) ],
615 [ AC_MSG_RESULT([no])
616 AC_MSG_ERROR([Libevent does not seem new enough to support bufferevents. We require 2.0.13-stable or later]) ] )
622 LDFLAGS="$save_LDFLAGS"
623 CPPFLAGS="$save_CPPFLAGS"
625 AM_CONDITIONAL(USE_BUFFEREVENTS, test "$enable_bufferevents" = "yes")
626 if test "$enable_bufferevents" = "yes"; then
627 AC_DEFINE(USE_BUFFEREVENTS, 1, [Defined if we're going to use Libevent's buffered IO API])
628 if test "$enable_static_libevent" = "yes"; then
629 TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent_openssl.a $TOR_LIBEVENT_LIBS"
631 TOR_LIBEVENT_LIBS="-levent_openssl $TOR_LIBEVENT_LIBS"
634 AC_SUBST(TOR_LIBEVENT_LIBS)
636 dnl ------------------------------------------------------
637 dnl Where do you live, libm?
639 dnl On some platforms (Haiku/BeOS) the math library is
640 dnl part of libroot. In which case don't link against lm
643 AC_SEARCH_LIBS(pow, [m], , AC_MSG_ERROR([Could not find pow in libm or libc.]))
644 if test "$ac_cv_search_pow" != "none required"; then
645 TOR_LIB_MATH="$ac_cv_search_pow"
648 AC_SUBST(TOR_LIB_MATH)
650 dnl ------------------------------------------------------
651 dnl Where do you live, openssl? And how do we call you?
653 tor_openssl_pkg_redhat="openssl"
654 tor_openssl_pkg_debian="libssl-dev"
655 tor_openssl_devpkg_redhat="openssl-devel"
656 tor_openssl_devpkg_debian="libssl-dev"
658 ALT_openssl_WITHVAL=""
660 AS_HELP_STRING(--with-ssl-dir=PATH, [obsolete alias for --with-openssl-dir]),
662 if test "x$withval" != "xno" && test "x$withval" != "x"; then
663 ALT_openssl_WITHVAL="$withval"
667 TOR_SEARCH_LIBRARY(openssl, $tryssldir, [-lssl -lcrypto $TOR_LIB_GDI],
668 [#include <openssl/rand.h>],
669 [void RAND_add(const void *buf, int num, double entropy);],
670 [RAND_add((void*)0,0,0);], [],
671 [/usr/local/openssl /usr/lib/openssl /usr/local/ssl /usr/lib/ssl /usr/local /usr/athena /opt/openssl])
673 dnl XXXX check for OPENSSL_VERSION_NUMBER == SSLeay()
675 if test "$enable_static_openssl" = "yes"; then
676 if test "$tor_cv_library_openssl_dir" = "(system)"; then
677 AC_MSG_ERROR("You must specify an explicit --with-openssl-dir=x option when using --enable-static-openssl")
679 TOR_OPENSSL_LIBS="$TOR_LIBDIR_openssl/libssl.a $TOR_LIBDIR_openssl/libcrypto.a"
682 TOR_OPENSSL_LIBS="-lssl -lcrypto"
684 AC_SUBST(TOR_OPENSSL_LIBS)
686 dnl Now check for particular openssl functions.
688 save_LDFLAGS="$LDFLAGS"
689 save_CPPFLAGS="$CPPFLAGS"
690 LIBS="$TOR_OPENSSL_LIBS $LIBS"
691 LDFLAGS="$TOR_LDFLAGS_openssl $LDFLAGS"
692 CPPFLAGS="$TOR_CPPFLAGS_openssl $CPPFLAGS"
695 #include <openssl/opensslv.h>
696 #if OPENSSL_VERSION_NUMBER < 0x1000000fL
701 [ 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.]) ])
704 #include <openssl/opensslv.h>
705 #include <openssl/evp.h>
706 #if defined(OPENSSL_NO_EC) || defined(OPENSSL_NO_ECDH) || defined(OPENSSL_NO_ECDSA)
709 #if !defined(NID_X9_62_prime256v1) || !defined(NID_secp224r1)
710 #error "curves unavailable"
714 [ 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.]) ])
716 AC_CHECK_MEMBERS([struct ssl_method_st.get_cipher_by_char], , ,
717 [#include <openssl/ssl.h>
721 SSL_SESSION_get_master_key \
722 SSL_get_server_random \
723 SSL_get_client_ciphers \
724 SSL_get_client_random \
729 dnl Check if OpenSSL has scrypt implementation.
730 AC_CHECK_FUNCS([ EVP_PBE_scrypt ])
733 LDFLAGS="$save_LDFLAGS"
734 CPPFLAGS="$save_CPPFLAGS"
736 dnl ------------------------------------------------------
737 dnl Where do you live, zlib? And how do we call you?
739 tor_zlib_pkg_redhat="zlib"
740 tor_zlib_pkg_debian="zlib1g"
741 tor_zlib_devpkg_redhat="zlib-devel"
742 tor_zlib_devpkg_debian="zlib1g-dev"
744 TOR_SEARCH_LIBRARY(zlib, $tryzlibdir, [-lz],
746 [const char * zlibVersion(void);],
747 [zlibVersion();], [--with-zlib-dir],
750 if test "$enable_static_zlib" = "yes"; then
751 if test "$tor_cv_library_zlib_dir" = "(system)"; then
752 AC_MSG_ERROR("You must specify an explicit --with-zlib-dir=x option when
753 using --enable-static-zlib")
755 TOR_ZLIB_LIBS="$TOR_LIBDIR_zlib/libz.a"
760 AC_SUBST(TOR_ZLIB_LIBS)
762 dnl ----------------------------------------------------------------------
763 dnl Check if libcap is available for capabilities.
765 tor_cap_pkg_debian="libcap2"
766 tor_cap_pkg_redhat="libcap"
767 tor_cap_devpkg_debian="libcap-dev"
768 tor_cap_devpkg_redhat="libcap-devel"
770 AC_CHECK_LIB([cap], [cap_init], [],
771 AC_MSG_NOTICE([Libcap was not found. Capabilities will not be usable.])
773 AC_CHECK_FUNCS(cap_set_proc)
775 dnl ---------------------------------------------------------------------
776 dnl Now that we know about our major libraries, we can check for compiler
777 dnl and linker hardening options. We need to do this with the libraries known,
778 dnl since sometimes the linker will like an option but not be willing to
779 dnl use it with a build of a library.
781 all_ldflags_for_check="$TOR_LDFLAGS_zlib $TOR_LDFLAGS_openssl $TOR_LDFLAGS_libevent"
782 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"
784 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
785 #if !defined(__clang__)
787 #endif])], have_clang=yes, have_clang=no)
789 if test "x$enable_gcc_hardening" != "xno"; then
790 CFLAGS="$CFLAGS -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2"
791 if test "x$have_clang" = "xyes"; then
792 TOR_CHECK_CFLAGS(-Qunused-arguments)
794 TOR_CHECK_CFLAGS(-fstack-protector-all, also_link)
795 AS_VAR_PUSHDEF([can_compile], [tor_cv_cflags_-fstack-protector-all])
796 AS_VAR_PUSHDEF([can_link], [tor_can_link_-fstack-protector-all])
797 m4_ifdef([AS_VAR_IF],[
798 AS_VAR_IF(can_compile, [yes],
799 AS_VAR_IF(can_link, [yes],
801 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.)]))
803 AS_VAR_POPDEF([can_link])
804 AS_VAR_POPDEF([can_compile])
805 TOR_CHECK_CFLAGS(-Wstack-protector)
806 TOR_CHECK_CFLAGS(-fwrapv)
807 TOR_CHECK_CFLAGS(--param ssp-buffer-size=1)
808 if test "$bwin32" = "false"; then
809 TOR_CHECK_CFLAGS(-fPIE)
810 TOR_CHECK_LDFLAGS(-pie, "$all_ldflags_for_check", "$all_libs_for_check")
814 if test "x$enable_expensive_hardening" = "xyes"; then
815 TOR_CHECK_CFLAGS([-fsanitize=address])
816 TOR_CHECK_CFLAGS([-fsanitize=undefined])
817 TOR_CHECK_CFLAGS([-fno-omit-frame-pointer])
820 if test "x$enable_linker_hardening" != "xno"; then
821 TOR_CHECK_LDFLAGS(-z relro -z now, "$all_ldflags_for_check", "$all_libs_for_check")
824 # For backtrace support
825 TOR_CHECK_LDFLAGS(-rdynamic)
827 dnl ------------------------------------------------------
828 dnl Now see if we have a -fomit-frame-pointer compiler option.
830 saved_CFLAGS="$CFLAGS"
831 TOR_CHECK_CFLAGS(-fomit-frame-pointer)
832 F_OMIT_FRAME_POINTER=''
833 if test "$saved_CFLAGS" != "$CFLAGS"; then
834 if test "x$enable_expensive_hardening" != "xyes"; then
835 F_OMIT_FRAME_POINTER='-fomit-frame-pointer'
838 CFLAGS="$saved_CFLAGS"
839 AC_SUBST(F_OMIT_FRAME_POINTER)
841 dnl ------------------------------------------------------
842 dnl If we are adding -fomit-frame-pointer (or if the compiler's doing it
843 dnl for us, as GCC 4.6 and later do at many optimization levels), then
844 dnl we should try to add -fasynchronous-unwind-tables so that our backtrace
846 TOR_CHECK_CFLAGS(-fasynchronous-unwind-tables)
848 dnl ============================================================
849 dnl Check for libseccomp
851 if test "x$enable_seccomp" != "xno"; then
852 AC_CHECK_HEADERS([seccomp.h])
853 AC_SEARCH_LIBS(seccomp_init, [seccomp])
856 dnl ============================================================
857 dnl Check for libscrypt
859 if test "x$enable_libscrypt" != "xno"; then
860 AC_CHECK_HEADERS([libscrypt.h])
861 AC_SEARCH_LIBS(libscrypt_scrypt, [scrypt])
862 AC_CHECK_FUNCS([libscrypt_scrypt])
865 dnl ============================================================
866 dnl We need an implementation of curve25519.
868 dnl set these defaults.
869 build_curve25519_donna=no
870 build_curve25519_donna_c64=no
871 use_curve25519_donna=no
872 use_curve25519_nacl=no
875 dnl The best choice is using curve25519-donna-c64, but that requires
877 AC_CACHE_CHECK([whether we can use curve25519-donna-c64],
878 tor_cv_can_use_curve25519_donna_c64,
880 [AC_LANG_PROGRAM([dnl
882 typedef unsigned uint128_t __attribute__((mode(TI)));
883 int func(uint64_t a, uint64_t b) {
884 uint128_t c = ((uint128_t)a) * b;
885 int ok = ((uint64_t)(c>>96)) == 522859 &&
886 (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
887 (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
888 (((uint64_t)(c))&0xffffffffL) == 0;
892 int ok = func( ((uint64_t)2000000000) * 1000000000,
893 ((uint64_t)1234567890) << 24);
896 [tor_cv_can_use_curve25519_donna_c64=yes],
897 [tor_cv_can_use_curve25519_donna_c64=no],
899 [AC_LANG_PROGRAM([dnl
901 typedef unsigned uint128_t __attribute__((mode(TI)));
902 int func(uint64_t a, uint64_t b) {
903 uint128_t c = ((uint128_t)a) * b;
904 int ok = ((uint64_t)(c>>96)) == 522859 &&
905 (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
906 (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
907 (((uint64_t)(c))&0xffffffffL) == 0;
911 int ok = func( ((uint64_t)2000000000) * 1000000000,
912 ((uint64_t)1234567890) << 24);
915 [tor_cv_can_use_curve25519_donna_c64=cross],
916 [tor_cv_can_use_curve25519_donna_c64=no])])])
918 AC_CHECK_HEADERS([crypto_scalarmult_curve25519.h \
919 nacl/crypto_scalarmult_curve25519.h])
921 AC_CACHE_CHECK([for nacl compiled with a fast curve25519 implementation],
922 tor_cv_can_use_curve25519_nacl,
923 [tor_saved_LIBS="$LIBS"
926 [AC_LANG_PROGRAM([dnl
927 #ifdef HAVE_CRYPTO_SCALARMULT_CURVE25519_H
928 #include <crypto_scalarmult_curve25519.h>
929 #elif defined(HAVE_NACL_CRYPTO_SCALARMULT_CURVE25519_H)
930 #include <nacl/crypto_scalarmult_curve25519.h>
932 #ifdef crypto_scalarmult_curve25519_ref_BYTES
933 #error Hey, this is the reference implementation! That's not fast.
936 unsigned char *a, *b, *c; crypto_scalarmult_curve25519(a,b,c);
937 ])], [tor_cv_can_use_curve25519_nacl=yes],
938 [tor_cv_can_use_curve25519_nacl=no])
939 LIBS="$tor_saved_LIBS" ])
941 dnl Okay, now we need to figure out which one to actually use. Fall back
942 dnl to curve25519-donna.c
944 if test "x$tor_cv_can_use_curve25519_donna_c64" != "xno"; then
945 build_curve25519_donna_c64=yes
946 use_curve25519_donna=yes
947 elif test "x$tor_cv_can_use_curve25519_nacl" = "xyes"; then
948 use_curve25519_nacl=yes
949 CURVE25519_LIBS=-lnacl
951 build_curve25519_donna=yes
952 use_curve25519_donna=yes
955 if test "x$use_curve25519_donna" = "xyes"; then
956 AC_DEFINE(USE_CURVE25519_DONNA, 1,
957 [Defined if we should use an internal curve25519_donna{,_c64} implementation])
959 if test "x$use_curve25519_nacl" = "xyes"; then
960 AC_DEFINE(USE_CURVE25519_NACL, 1,
961 [Defined if we should use a curve25519 from nacl])
963 AM_CONDITIONAL(BUILD_CURVE25519_DONNA,
964 test "x$build_curve25519_donna" = "xyes")
965 AM_CONDITIONAL(BUILD_CURVE25519_DONNA_C64,
966 test "x$build_curve25519_donna_c64" = "xyes")
967 AC_SUBST(CURVE25519_LIBS)
969 dnl Make sure to enable support for large off_t if available.
985 , , AC_MSG_WARN(Some headers were not found, compilation may fail. If compilation succeeds, please send your orconfig.h to the developers so we can fix this warning.))
987 dnl These headers are not essential
1031 AC_CHECK_HEADERS(sys/param.h)
1033 AC_CHECK_HEADERS(net/if.h, net_if_found=1, net_if_found=0,
1034 [#ifdef HAVE_SYS_TYPES_H
1035 #include <sys/types.h>
1037 #ifdef HAVE_SYS_SOCKET_H
1038 #include <sys/socket.h>
1040 AC_CHECK_HEADERS(net/pfvar.h, net_pfvar_found=1, net_pfvar_found=0,
1041 [#ifdef HAVE_SYS_TYPES_H
1042 #include <sys/types.h>
1044 #ifdef HAVE_SYS_SOCKET_H
1045 #include <sys/socket.h>
1047 #ifdef HAVE_NET_IF_H
1050 #ifdef HAVE_NETINET_IN_H
1051 #include <netinet/in.h>
1054 AC_CHECK_HEADERS(linux/if.h,[],[],
1056 #ifdef HAVE_SYS_SOCKET_H
1057 #include <sys/socket.h>
1061 AC_CHECK_HEADERS(linux/netfilter_ipv4.h,
1062 linux_netfilter_ipv4=1, linux_netfilter_ipv4=0,
1063 [#ifdef HAVE_SYS_TYPES_H
1064 #include <sys/types.h>
1066 #ifdef HAVE_SYS_SOCKET_H
1067 #include <sys/socket.h>
1069 #ifdef HAVE_LIMITS_H
1072 #ifdef HAVE_LINUX_TYPES_H
1073 #include <linux/types.h>
1075 #ifdef HAVE_NETINET_IN6_H
1076 #include <netinet/in6.h>
1078 #ifdef HAVE_NETINET_IN_H
1079 #include <netinet/in.h>
1082 AC_CHECK_HEADERS(linux/netfilter_ipv6/ip6_tables.h,
1083 linux_netfilter_ipv6_ip6_tables=1, linux_netfilter_ipv6_ip6_tables=0,
1084 [#ifdef HAVE_SYS_TYPES_H
1085 #include <sys/types.h>
1087 #ifdef HAVE_SYS_SOCKET_H
1088 #include <sys/socket.h>
1090 #ifdef HAVE_LIMITS_H
1093 #ifdef HAVE_LINUX_TYPES_H
1094 #include <linux/types.h>
1096 #ifdef HAVE_NETINET_IN6_H
1097 #include <netinet/in6.h>
1099 #ifdef HAVE_NETINET_IN_H
1100 #include <netinet/in.h>
1102 #ifdef HAVE_LINUX_IF_H
1103 #include <linux/if.h>
1106 if test "x$transparent" = "xtrue"; then
1108 if test "x$net_if_found" = "x1" && test "x$net_pfvar_found" = "x1"; then
1111 if test "x$linux_netfilter_ipv4" = "x1"; then
1114 if test "x$linux_netfilter_ipv6_ip6_tables" = "x1"; then
1117 if test "x$transparent_ok" = "x1"; then
1118 AC_DEFINE(USE_TRANSPARENT, 1, "Define to enable transparent proxy support")
1120 *-*-openbsd* | *-*-bitrig*)
1121 AC_DEFINE(OPENBSD, 1, "Define to handle pf on OpenBSD properly") ;;
1124 AC_MSG_NOTICE([Transparent proxy support enabled, but missing headers.])
1128 AC_CHECK_MEMBERS([struct timeval.tv_sec], , ,
1129 [#ifdef HAVE_SYS_TYPES_H
1130 #include <sys/types.h>
1132 #ifdef HAVE_SYS_TIME_H
1133 #include <sys/time.h>
1136 dnl In case we aren't given a working stdint.h, we'll need to grow our own.
1139 AC_CHECK_SIZEOF(int8_t)
1140 AC_CHECK_SIZEOF(int16_t)
1141 AC_CHECK_SIZEOF(int32_t)
1142 AC_CHECK_SIZEOF(int64_t)
1143 AC_CHECK_SIZEOF(uint8_t)
1144 AC_CHECK_SIZEOF(uint16_t)
1145 AC_CHECK_SIZEOF(uint32_t)
1146 AC_CHECK_SIZEOF(uint64_t)
1147 AC_CHECK_SIZEOF(intptr_t)
1148 AC_CHECK_SIZEOF(uintptr_t)
1150 dnl AC_CHECK_TYPES([int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t, uint64_t, intptr_t, uintptr_t])
1152 AC_CHECK_SIZEOF(char)
1153 AC_CHECK_SIZEOF(short)
1154 AC_CHECK_SIZEOF(int)
1155 AC_CHECK_SIZEOF(long)
1156 AC_CHECK_SIZEOF(long long)
1157 AC_CHECK_SIZEOF(__int64)
1158 AC_CHECK_SIZEOF(void *)
1159 AC_CHECK_SIZEOF(time_t)
1160 AC_CHECK_SIZEOF(size_t)
1161 AC_CHECK_SIZEOF(pid_t)
1163 AC_CHECK_TYPES([uint, u_char, ssize_t])
1165 AC_PC_FROM_UCONTEXT([:])
1167 dnl used to include sockaddr_storage, but everybody has that.
1168 AC_CHECK_TYPES([struct in6_addr, struct sockaddr_in6, sa_family_t], , ,
1169 [#ifdef HAVE_SYS_TYPES_H
1170 #include <sys/types.h>
1172 #ifdef HAVE_NETINET_IN_H
1173 #include <netinet/in.h>
1175 #ifdef HAVE_NETINET_IN6_H
1176 #include <netinet/in6.h>
1178 #ifdef HAVE_SYS_SOCKET_H
1179 #include <sys/socket.h>
1182 #define _WIN32_WINNT 0x0501
1183 #define WIN32_LEAN_AND_MEAN
1184 #include <winsock2.h>
1185 #include <ws2tcpip.h>
1188 AC_CHECK_MEMBERS([struct in6_addr.s6_addr32, struct in6_addr.s6_addr16, struct sockaddr_in.sin_len, struct sockaddr_in6.sin6_len], , ,
1189 [#ifdef HAVE_SYS_TYPES_H
1190 #include <sys/types.h>
1192 #ifdef HAVE_NETINET_IN_H
1193 #include <netinet/in.h>
1195 #ifdef HAVE_NETINET_IN6_H
1196 #include <netinet/in6.h>
1198 #ifdef HAVE_SYS_SOCKET_H
1199 #include <sys/socket.h>
1202 #define _WIN32_WINNT 0x0501
1203 #define WIN32_LEAN_AND_MEAN
1204 #include <winsock2.h>
1205 #include <ws2tcpip.h>
1209 AC_CHECK_TYPES([rlim_t], , ,
1210 [#ifdef HAVE_SYS_TYPES_H
1211 #include <sys/types.h>
1213 #ifdef HAVE_SYS_TIME_H
1214 #include <sys/time.h>
1216 #ifdef HAVE_SYS_RESOURCE_H
1217 #include <sys/resource.h>
1221 AX_CHECK_SIGN([time_t],
1224 #ifdef HAVE_SYS_TYPES_H
1225 #include <sys/types.h>
1227 #ifdef HAVE_SYS_TIME_H
1228 #include <sys/time.h>
1235 if test "$ax_cv_decl_time_t_signed" = "no"; then
1236 AC_MSG_ERROR([You have an unsigned time_t; Tor does not support that. Please tell the Tor developers about your interesting platform.])
1239 AX_CHECK_SIGN([size_t],
1240 [ tor_cv_size_t_signed=yes ],
1241 [ tor_cv_size_t_signed=no ], [
1242 #ifdef HAVE_SYS_TYPES_H
1243 #include <sys/types.h>
1247 if test "$ax_cv_decl_size_t_signed" = "yes"; then
1248 AC_MSG_ERROR([You have a signed size_t; that's grossly nonconformant.])
1251 AX_CHECK_SIGN([enum always],
1252 [ AC_DEFINE(ENUM_VALS_ARE_SIGNED, 1, [Define if enum is always signed]) ],
1254 enum always { AAA, BBB, CCC };
1257 AC_CHECK_SIZEOF(socklen_t, , [AC_INCLUDES_DEFAULT()
1258 #ifdef HAVE_SYS_SOCKET_H
1259 #include <sys/socket.h>
1263 # We want to make sure that we _don't_ have a cell_t defined, like IRIX does.
1265 AC_CHECK_SIZEOF(cell_t)
1267 # Now make sure that NULL can be represented as zero bytes.
1268 AC_CACHE_CHECK([whether memset(0) sets pointers to NULL], tor_cv_null_is_zero,
1269 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1270 [[#include <stdlib.h>
1273 #ifdef HAVE_STDDEF_H
1276 int main () { char *p1,*p2; p1=NULL; memset(&p2,0,sizeof(p2));
1277 return memcmp(&p1,&p2,sizeof(char*))?1:0; }]])],
1278 [tor_cv_null_is_zero=yes],
1279 [tor_cv_null_is_zero=no],
1280 [tor_cv_null_is_zero=cross])])
1282 if test "$tor_cv_null_is_zero" = "cross"; then
1283 # Cross-compiling; let's hope that the target isn't raving mad.
1284 AC_MSG_NOTICE([Cross-compiling: we'll assume that NULL is represented as a sequence of 0-valued bytes.])
1287 if test "$tor_cv_null_is_zero" != "no"; then
1288 AC_DEFINE([NULL_REP_IS_ZERO_BYTES], 1,
1289 [Define to 1 iff memset(0) sets pointers to NULL])
1292 AC_CACHE_CHECK([whether memset(0) sets doubles to 0.0], tor_cv_dbl0_is_zero,
1293 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1294 [[#include <stdlib.h>
1297 #ifdef HAVE_STDDEF_H
1300 int main () { double d1,d2; d1=0; memset(&d2,0,sizeof(d2));
1301 return memcmp(&d1,&d2,sizeof(d1))?1:0; }]])],
1302 [tor_cv_dbl0_is_zero=yes],
1303 [tor_cv_dbl0_is_zero=no],
1304 [tor_cv_dbl0_is_zero=cross])])
1306 if test "$tor_cv_dbl0_is_zero" = "cross"; then
1307 # Cross-compiling; let's hope that the target isn't raving mad.
1308 AC_MSG_NOTICE([Cross-compiling: we'll assume that 0.0 can be represented as a sequence of 0-valued bytes.])
1311 if test "$tor_cv_dbl0_is_zero" != "no"; then
1312 AC_DEFINE([DOUBLE_0_REP_IS_ZERO_BYTES], 1,
1313 [Define to 1 iff memset(0) sets doubles to 0.0])
1316 # And what happens when we malloc zero?
1317 AC_CACHE_CHECK([whether we can malloc(0) safely.], tor_cv_malloc_zero_works,
1318 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1319 [[#include <stdlib.h>
1322 #ifdef HAVE_STDDEF_H
1325 int main () { return malloc(0)?0:1; }]])],
1326 [tor_cv_malloc_zero_works=yes],
1327 [tor_cv_malloc_zero_works=no],
1328 [tor_cv_malloc_zero_works=cross])])
1330 if test "$tor_cv_malloc_zero_works" = "cross"; then
1331 # Cross-compiling; let's hope that the target isn't raving mad.
1332 AC_MSG_NOTICE([Cross-compiling: we'll assume that we need to check malloc() arguments for 0.])
1335 if test "$tor_cv_malloc_zero_works" = "yes"; then
1336 AC_DEFINE([MALLOC_ZERO_WORKS], 1,
1337 [Define to 1 iff malloc(0) returns a pointer])
1340 # whether we seem to be in a 2s-complement world.
1341 AC_CACHE_CHECK([whether we are using 2s-complement arithmetic], tor_cv_twos_complement,
1342 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1343 [[int main () { int problem = ((-99) != (~99)+1);
1344 return problem ? 1 : 0; }]])],
1345 [tor_cv_twos_complement=yes],
1346 [tor_cv_twos_complement=no],
1347 [tor_cv_twos_complement=cross])])
1349 if test "$tor_cv_twos_complement" = "cross"; then
1350 # Cross-compiling; let's hope that the target isn't raving mad.
1351 AC_MSG_NOTICE([Cross-compiling: we'll assume that negative integers are represented with two's complement.])
1354 if test "$tor_cv_twos_complement" != "no"; then
1355 AC_DEFINE([USING_TWOS_COMPLEMENT], 1,
1356 [Define to 1 iff we represent negative integers with
1360 # What does shifting a negative value do?
1361 AC_CACHE_CHECK([whether right-shift on negative values does sign-extension], tor_cv_sign_extend,
1362 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1363 [[int main () { int okay = (-60 >> 8) == -1; return okay ? 0 : 1; }]])],
1364 [tor_cv_sign_extend=yes],
1365 [tor_cv_sign_extend=no],
1366 [tor_cv_sign_extend=cross])])
1368 if test "$tor_cv_sign_extend" = "cross"; then
1369 # Cross-compiling; let's hope that the target isn't raving mad.
1370 AC_MSG_NOTICE([Cross-compiling: we'll assume that right-shifting negative integers causes sign-extension])
1373 if test "$tor_cv_sign_extend" != "no"; then
1374 AC_DEFINE([RSHIFT_DOES_SIGN_EXTEND], 1,
1375 [Define to 1 iff right-shifting a negative value performs sign-extension])
1378 # Whether we should use the dmalloc memory allocation debugging library.
1379 AC_MSG_CHECKING(whether to use dmalloc (debug memory allocation library))
1380 AC_ARG_WITH(dmalloc,
1381 AS_HELP_STRING(--with-dmalloc, [use debug memory allocation library]),
1382 [if [[ "$withval" = "yes" ]]; then
1388 fi], [ dmalloc=0; AC_MSG_RESULT(no) ]
1391 if [[ $dmalloc -eq 1 ]]; then
1392 AC_CHECK_HEADERS(dmalloc.h, , AC_MSG_ERROR(dmalloc header file not found. Do you have the development files for dmalloc installed?))
1393 AC_SEARCH_LIBS(dmalloc_malloc, [dmallocth dmalloc], , AC_MSG_ERROR(Libdmalloc library not found. If you enable it you better have it installed.))
1394 AC_DEFINE(USE_DMALLOC, 1, [Debug memory allocation library])
1395 AC_CHECK_FUNCS(dmalloc_strdup dmalloc_strndup)
1398 AC_ARG_WITH(tcmalloc,
1399 AS_HELP_STRING(--with-tcmalloc, [use tcmalloc memory allocation library]),
1400 [ tcmalloc=yes ], [ tcmalloc=no ])
1402 if test "x$tcmalloc" = "xyes"; then
1403 LDFLAGS="-ltcmalloc $LDFLAGS"
1406 using_custom_malloc=no
1407 if test "x$enable_openbsd_malloc" = "xyes"; then
1408 using_custom_malloc=yes
1410 if test "x$tcmalloc" = "xyes"; then
1411 using_custom_malloc=yes
1413 if test "$using_custom_malloc" = "no"; then
1414 AC_CHECK_FUNCS(mallinfo)
1417 # By default, we're going to assume we don't have mlockall()
1418 # bionic and other platforms have various broken mlockall subsystems.
1419 # Some systems don't have a working mlockall, some aren't linkable,
1420 # and some have it but don't declare it.
1421 AC_CHECK_FUNCS(mlockall)
1422 AC_CHECK_DECLS([mlockall], , , [
1423 #ifdef HAVE_SYS_MMAN_H
1424 #include <sys/mman.h>
1427 # Allow user to specify an alternate syslog facility
1428 AC_ARG_WITH(syslog-facility,
1429 AS_HELP_STRING(--with-syslog-facility=LOG, [syslog facility to use (default=LOG_DAEMON)]),
1430 syslog_facility="$withval", syslog_facility="LOG_DAEMON")
1431 AC_DEFINE_UNQUOTED(LOGFACILITY,$syslog_facility,[name of the syslog facility])
1432 AC_SUBST(LOGFACILITY)
1434 # Check if we have getresuid and getresgid
1435 AC_CHECK_FUNCS(getresuid getresgid)
1437 # Check for gethostbyname_r in all its glorious incompatible versions.
1438 # (This logic is based on that in Python's configure.in)
1439 AH_TEMPLATE(HAVE_GETHOSTBYNAME_R,
1440 [Define this if you have any gethostbyname_r()])
1442 AC_CHECK_FUNC(gethostbyname_r, [
1443 AC_MSG_CHECKING([how many arguments gethostbyname_r() wants])
1445 CFLAGS="$CFLAGS $MY_CPPFLAGS $MY_THREAD_CPPFLAGS $MY_CFLAGS"
1446 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
1450 struct hostent *h1, *h2;
1452 (void)gethostbyname_r(cp1,h1,cp2,i1,&h2,&i2);
1454 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1455 AC_DEFINE(HAVE_GETHOSTBYNAME_R_6_ARG, 1,
1456 [Define this if gethostbyname_r takes 6 arguments])
1465 (void)gethostbyname_r(cp1,h1,cp2,i1,&i2);
1467 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1468 AC_DEFINE(HAVE_GETHOSTBYNAME_R_5_ARG, 1,
1469 [Define this if gethostbyname_r takes 5 arguments])
1477 struct hostent_data hd;
1478 (void) gethostbyname_r(cp1,h1,&hd);
1480 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1481 AC_DEFINE(HAVE_GETHOSTBYNAME_R_3_ARG, 1,
1482 [Define this if gethostbyname_r takes 3 arguments])
1492 AC_CACHE_CHECK([whether the C compiler supports __func__],
1493 tor_cv_have_func_macro,
1494 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1496 int main(int c, char **v) { puts(__func__); }])],
1497 tor_cv_have_func_macro=yes,
1498 tor_cv_have_func_macro=no))
1500 AC_CACHE_CHECK([whether the C compiler supports __FUNC__],
1501 tor_cv_have_FUNC_macro,
1502 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1504 int main(int c, char **v) { puts(__FUNC__); }])],
1505 tor_cv_have_FUNC_macro=yes,
1506 tor_cv_have_FUNC_macro=no))
1508 AC_CACHE_CHECK([whether the C compiler supports __FUNCTION__],
1509 tor_cv_have_FUNCTION_macro,
1510 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1512 int main(int c, char **v) { puts(__FUNCTION__); }])],
1513 tor_cv_have_FUNCTION_macro=yes,
1514 tor_cv_have_FUNCTION_macro=no))
1516 AC_CACHE_CHECK([whether we have extern char **environ already declared],
1517 tor_cv_have_environ_declared,
1518 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1519 /* We define _GNU_SOURCE here because it is also defined in compat.c.
1520 * Without it environ doesn't get declared. */
1522 #ifdef HAVE_UNISTD_H
1526 int main(int c, char **v) { char **t = environ; }])],
1527 tor_cv_have_environ_declared=yes,
1528 tor_cv_have_environ_declared=no))
1530 if test "$tor_cv_have_func_macro" = "yes"; then
1531 AC_DEFINE(HAVE_MACRO__func__, 1, [Defined if the compiler supports __func__])
1534 if test "$tor_cv_have_FUNC_macro" = "yes"; then
1535 AC_DEFINE(HAVE_MACRO__FUNC__, 1, [Defined if the compiler supports __FUNC__])
1538 if test "$tor_cv_have_FUNCTION_macro" = "yes"; then
1539 AC_DEFINE(HAVE_MACRO__FUNCTION__, 1,
1540 [Defined if the compiler supports __FUNCTION__])
1543 if test "$tor_cv_have_environ_declared" = "yes"; then
1544 AC_DEFINE(HAVE_EXTERN_ENVIRON_DECLARED, 1,
1545 [Defined if we have extern char **environ already declared])
1548 # $prefix stores the value of the --prefix command line option, or
1549 # NONE if the option wasn't set. In the case that it wasn't set, make
1550 # it be the default, so that we can use it to expand directories now.
1551 if test "x$prefix" = "xNONE"; then
1552 prefix=$ac_default_prefix
1555 # and similarly for $exec_prefix
1556 if test "x$exec_prefix" = "xNONE"; then
1560 if test "x$BUILDDIR" = "x"; then
1564 AH_TEMPLATE([BUILDDIR],[tor's build directory])
1565 AC_DEFINE_UNQUOTED(BUILDDIR,"$BUILDDIR")
1567 if test "x$CONFDIR" = "x"; then
1568 CONFDIR=`eval echo $sysconfdir/tor`
1571 AH_TEMPLATE([CONFDIR],[tor's configuration directory])
1572 AC_DEFINE_UNQUOTED(CONFDIR,"$CONFDIR")
1574 BINDIR=`eval echo $bindir`
1576 LOCALSTATEDIR=`eval echo $localstatedir`
1577 AC_SUBST(LOCALSTATEDIR)
1579 if test "$bwin32" = "true"; then
1580 # Test if the linker supports the --nxcompat and --dynamicbase options
1582 save_LDFLAGS="$LDFLAGS"
1583 LDFLAGS="-Wl,--nxcompat -Wl,--dynamicbase"
1584 AC_MSG_CHECKING([whether the linker supports DllCharacteristics])
1585 AC_LINK_IFELSE([AC_LANG_PROGRAM([])],
1586 [AC_MSG_RESULT([yes])]
1587 [save_LDFLAGS="$save_LDFLAGS $LDFLAGS"],
1588 [AC_MSG_RESULT([no])]
1590 LDFLAGS="$save_LDFLAGS"
1593 # Set CFLAGS _after_ all the above checks, since our warnings are stricter
1594 # than autoconf's macros like.
1595 if test "$GCC" = "yes"; then
1596 # Disable GCC's strict aliasing checks. They are an hours-to-debug
1597 # accident waiting to happen.
1598 CFLAGS="$CFLAGS -Wall -fno-strict-aliasing"
1600 # Override optimization level for non-gcc compilers
1602 enable_gcc_warnings=no
1603 enable_gcc_warnings_advisory=no
1606 # OS X Lion started deprecating the system openssl. Let's just disable
1607 # all deprecation warnings on OS X. Also, to potentially make the binary
1608 # a little smaller, let's enable dead_strip.
1612 CFLAGS="$CFLAGS -Wno-deprecated-declarations"
1613 LDFLAGS="$LDFLAGS -dead_strip" ;;
1616 # Add some more warnings which we use in development but not in the
1617 # released versions. (Some relevant gcc versions can't handle these.)
1618 if test "x$enable_gcc_warnings" = "xyes" ||
1619 test "x$enable_gcc_warnings_advisory" = "xyes"; then
1621 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1622 #if !defined(__GNUC__) || (__GNUC__ < 4)
1624 #endif])], have_gcc4=yes, have_gcc4=no)
1626 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1627 #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 2)
1629 #endif])], have_gcc42=yes, have_gcc42=no)
1631 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1632 #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 3)
1634 #endif])], have_gcc43=yes, have_gcc43=no)
1636 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1637 #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 6)
1639 #endif])], have_gcc46=yes, have_gcc46=no)
1642 save_CFLAGS="$CFLAGS"
1643 CFLAGS="$CFLAGS -Wshorten-64-to-32"
1644 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], have_shorten64_flag=yes,
1645 have_shorten64_flag=no)
1646 CFLAGS="$save_CFLAGS"
1649 *-*-openbsd* | *-*-bitrig*)
1650 # Some OpenBSD versions (like 4.8) have -Wsystem-headers by default.
1651 # That's fine, except that the headers don't pass -Wredundant-decls.
1652 # Therefore, let's disable -Wsystem-headers when we're building
1653 # with maximal warnings on OpenBSD.
1654 CFLAGS="$CFLAGS -Wno-system-headers" ;;
1657 CFLAGS="$CFLAGS -W -Wfloat-equal -Wundef -Wpointer-arith"
1658 CFLAGS="$CFLAGS -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings"
1659 CFLAGS="$CFLAGS -Wredundant-decls -Wchar-subscripts -Wcomment -Wformat=2"
1660 CFLAGS="$CFLAGS -Wwrite-strings -Wmissing-declarations -Wredundant-decls"
1661 CFLAGS="$CFLAGS -Wnested-externs -Wbad-function-cast -Wswitch-enum"
1663 if test "x$enable_gcc_warnings" = "xyes"; then
1664 CFLAGS="$CFLAGS -Werror"
1667 # Disabled, so we can use mallinfo(): -Waggregate-return
1669 if test "x$have_gcc4" = "xyes"; then
1670 # These warnings break gcc 3.3.5 and work on gcc 4.0.2
1671 CFLAGS="$CFLAGS -Winit-self -Wmissing-field-initializers -Wold-style-definition"
1674 if test "x$have_gcc42" = "xyes"; then
1675 # These warnings break gcc 4.0.2 and work on gcc 4.2
1676 # XXXX020 See if any of these work with earlier versions.
1677 CFLAGS="$CFLAGS -Waddress -Wmissing-noreturn -Wstrict-overflow=1"
1679 # We used to use -Wstrict-overflow=5, but that breaks us heavily under 4.3.
1682 if test "x$have_gcc42" = "xyes" && test "x$have_clang" = "xno"; then
1683 # These warnings break gcc 4.0.2 and clang, but work on gcc 4.2
1684 CFLAGS="$CFLAGS -Wnormalized=id -Woverride-init"
1687 if test "x$have_gcc43" = "xyes"; then
1688 # These warnings break gcc 4.2 and work on gcc 4.3
1689 # XXXX020 See if any of these work with earlier versions.
1690 CFLAGS="$CFLAGS -Wextra -Warray-bounds"
1693 if test "x$have_gcc46" = "xyes"; then
1694 # This warning was added in gcc 4.3, but it appears to generate
1695 # spurious warnings in gcc 4.4. I don't know if it works in 4.5.
1696 CFLAGS="$CFLAGS -Wlogical-op"
1699 if test "x$have_shorten64_flag" = "xyes"; then
1700 CFLAGS="$CFLAGS -Wshorten-64-to-32"
1705 ##This will break the world on some 64-bit architectures
1706 # CFLAGS="$CFLAGS -Winline"
1709 if test "$enable_coverage" = "yes" && test "$have_clang" = "no"; then
1712 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-profiling.])
1716 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent $TOR_CPPFLAGS_openssl $TOR_CPPFLAGS_zlib"
1721 contrib/dist/suse/tor.sh
1722 contrib/operator-tools/tor.logrotate
1725 contrib/dist/tor.service
1726 src/config/torrc.sample
1727 src/config/torrc.minimal
1728 scripts/maint/checkOptionDocs.pl
1729 scripts/maint/updateVersions.pl
1732 if test "x$asciidoc" = "xtrue" && test "$ASCIIDOC" = "none"; then
1733 regular_mans="doc/tor doc/tor-gencert doc/tor-resolve doc/torify"
1734 for file in $regular_mans ; do
1735 if ! [[ -f "$srcdir/$file.1.in" ]] || ! [[ -f "$srcdir/$file.html.in" ]] ; then
1736 echo "==================================";
1738 echo "Building Tor has failed since manpages cannot be built.";
1740 echo "You need asciidoc installed to be able to build the manpages.";
1741 echo "To build without manpages, use the --disable-asciidoc argument";
1742 echo "when calling configure.";
1744 echo "==================================";