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.2-alpha-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 \
441 if test "$bwin32" != "true"; then
442 AC_CHECK_HEADERS(pthread.h)
443 AC_CHECK_FUNCS(pthread_create)
444 AC_CHECK_FUNCS(pthread_condattr_setclock)
447 if test "$bwin32" = "true"; then
448 AC_CHECK_DECLS([SecureZeroMemory, _getwch], , , [
455 AM_CONDITIONAL(BUILD_READPASSPHRASE_C,
456 test "x$ac_cv_func_readpassphrase" = "xno" && test "$bwin32" = "false")
458 dnl ------------------------------------------------------
459 dnl Where do you live, libevent? And how do we call you?
461 if test "$bwin32" = "true"; then
462 TOR_LIB_WS32=-lws2_32
463 TOR_LIB_IPHLPAPI=-liphlpapi
464 # Some of the cargo-cults recommend -lwsock32 as well, but I don't
465 # think it's actually necessary.
471 AC_SUBST(TOR_LIB_WS32)
472 AC_SUBST(TOR_LIB_GDI)
473 AC_SUBST(TOR_LIB_IPHLPAPI)
475 tor_libevent_pkg_redhat="libevent"
476 tor_libevent_pkg_debian="libevent-dev"
477 tor_libevent_devpkg_redhat="libevent-devel"
478 tor_libevent_devpkg_debian="libevent-dev"
480 dnl On Gnu/Linux or any place we require it, we'll add librt to the Libevent
481 dnl linking for static builds.
482 STATIC_LIBEVENT_FLAGS=""
483 if test "$enable_static_libevent" = "yes"; then
484 if test "$have_rt" = "yes"; then
485 STATIC_LIBEVENT_FLAGS=" -lrt "
489 TOR_SEARCH_LIBRARY(libevent, $trylibeventdir, [-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32], [
491 #include <winsock2.h>
493 #include <sys/time.h>
494 #include <sys/types.h>
495 #include <event.h>], [
497 #include <winsock2.h>
499 void *event_init(void);],
502 {WSADATA d; WSAStartup(0x101,&d); }
505 ], [--with-libevent-dir], [/opt/libevent])
507 dnl Now check for particular libevent functions.
509 save_LDFLAGS="$LDFLAGS"
510 save_CPPFLAGS="$CPPFLAGS"
511 LIBS="-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32 $LIBS"
512 LDFLAGS="$TOR_LDFLAGS_libevent $LDFLAGS"
513 CPPFLAGS="$TOR_CPPFLAGS_libevent $CPPFLAGS"
514 AC_CHECK_FUNCS([event_get_version_number \
515 evutil_secure_rng_set_urandom_device_file \
516 evutil_secure_rng_init \
518 AC_CHECK_MEMBERS([struct event.min_heap_idx], , ,
522 AC_CHECK_HEADERS(event2/event.h event2/dns.h event2/bufferevent_ssl.h)
524 LIBS="$STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32 $save_LIBS"
526 AM_CONDITIONAL(USE_EXTERNAL_EVDNS,
527 test "x$ac_cv_header_event2_dns_h" = "xyes")
529 if test "$enable_static_libevent" = "yes"; then
530 if test "$tor_cv_library_libevent_dir" = "(system)"; then
531 AC_MSG_ERROR("You must specify an explicit --with-libevent-dir=x option when using --enable-static-libevent")
533 TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent.a $STATIC_LIBEVENT_FLAGS"
536 if test "x$ac_cv_header_event2_event_h" = "xyes"; then
537 AC_SEARCH_LIBS(event_new, [event event_core], , AC_MSG_ERROR("libevent2 is installed but linking it failed while searching for event_new"))
538 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"))
540 if test "$ac_cv_search_event_new" != "none required"; then
541 TOR_LIBEVENT_LIBS="$ac_cv_search_event_new"
543 if test "$ac_cv_search_evdns_base_new" != "none required"; then
544 TOR_LIBEVENT_LIBS="$ac_cv_search_evdns_base_new $TOR_LIBEVENT_LIBS"
547 TOR_LIBEVENT_LIBS="-levent"
552 LDFLAGS="$save_LDFLAGS"
553 CPPFLAGS="$save_CPPFLAGS"
555 dnl This isn't the best test for Libevent 2.0.3-alpha. Once it's released,
556 dnl we can do much better.
557 if test "$enable_bufferevents" = "yes"; then
558 if test "$ac_cv_header_event2_bufferevent_ssl_h" != "yes"; then
559 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.])
562 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent"
564 # Check for the right version. First see if version detection works.
565 AC_MSG_CHECKING([whether we can detect the Libevent version])
566 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
567 #include <event2/event.h>
568 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 10
574 ])], [event_version_number_works=yes; AC_MSG_RESULT([yes]) ],
575 [event_version_number_works=no; AC_MSG_RESULT([no])])
576 if test "$event_version_number_works" != "yes"; then
577 AC_MSG_WARN([Version detection on Libevent seems broken. Your Libevent installation is probably screwed up or very old.])
579 AC_MSG_CHECKING([whether Libevent is new enough for bufferevents])
580 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
581 #include <event2/event.h>
582 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 0x02000d00
588 ])], [ AC_MSG_RESULT([yes]) ],
589 [ AC_MSG_RESULT([no])
590 AC_MSG_ERROR([Libevent does not seem new enough to support bufferevents. We require 2.0.13-stable or later]) ] )
596 LDFLAGS="$save_LDFLAGS"
597 CPPFLAGS="$save_CPPFLAGS"
599 AM_CONDITIONAL(USE_BUFFEREVENTS, test "$enable_bufferevents" = "yes")
600 if test "$enable_bufferevents" = "yes"; then
601 AC_DEFINE(USE_BUFFEREVENTS, 1, [Defined if we're going to use Libevent's buffered IO API])
602 if test "$enable_static_libevent" = "yes"; then
603 TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent_openssl.a $TOR_LIBEVENT_LIBS"
605 TOR_LIBEVENT_LIBS="-levent_openssl $TOR_LIBEVENT_LIBS"
608 AC_SUBST(TOR_LIBEVENT_LIBS)
610 dnl ------------------------------------------------------
611 dnl Where do you live, libm?
613 dnl On some platforms (Haiku/BeOS) the math library is
614 dnl part of libroot. In which case don't link against lm
617 AC_SEARCH_LIBS(pow, [m], , AC_MSG_ERROR([Could not find pow in libm or libc.]))
618 if test "$ac_cv_search_pow" != "none required"; then
619 TOR_LIB_MATH="$ac_cv_search_pow"
622 AC_SUBST(TOR_LIB_MATH)
624 dnl ------------------------------------------------------
625 dnl Where do you live, openssl? And how do we call you?
627 tor_openssl_pkg_redhat="openssl"
628 tor_openssl_pkg_debian="libssl-dev"
629 tor_openssl_devpkg_redhat="openssl-devel"
630 tor_openssl_devpkg_debian="libssl-dev"
632 ALT_openssl_WITHVAL=""
634 AS_HELP_STRING(--with-ssl-dir=PATH, [obsolete alias for --with-openssl-dir]),
636 if test "x$withval" != "xno" && test "x$withval" != "x"; then
637 ALT_openssl_WITHVAL="$withval"
641 TOR_SEARCH_LIBRARY(openssl, $tryssldir, [-lssl -lcrypto $TOR_LIB_GDI],
642 [#include <openssl/rand.h>],
643 [void RAND_add(const void *buf, int num, double entropy);],
644 [RAND_add((void*)0,0,0);], [],
645 [/usr/local/openssl /usr/lib/openssl /usr/local/ssl /usr/lib/ssl /usr/local /usr/athena /opt/openssl])
647 dnl XXXX check for OPENSSL_VERSION_NUMBER == SSLeay()
649 if test "$enable_static_openssl" = "yes"; then
650 if test "$tor_cv_library_openssl_dir" = "(system)"; then
651 AC_MSG_ERROR("You must specify an explicit --with-openssl-dir=x option when using --enable-static-openssl")
653 TOR_OPENSSL_LIBS="$TOR_LIBDIR_openssl/libssl.a $TOR_LIBDIR_openssl/libcrypto.a"
656 TOR_OPENSSL_LIBS="-lssl -lcrypto"
658 AC_SUBST(TOR_OPENSSL_LIBS)
660 dnl Now check for particular openssl functions.
662 save_LDFLAGS="$LDFLAGS"
663 save_CPPFLAGS="$CPPFLAGS"
664 LIBS="$TOR_OPENSSL_LIBS $LIBS"
665 LDFLAGS="$TOR_LDFLAGS_openssl $LDFLAGS"
666 CPPFLAGS="$TOR_CPPFLAGS_openssl $CPPFLAGS"
669 #include <openssl/opensslv.h>
670 #if OPENSSL_VERSION_NUMBER < 0x1000000fL
675 [ 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.]) ])
678 #include <openssl/opensslv.h>
679 #include <openssl/evp.h>
680 #if defined(OPENSSL_NO_EC) || defined(OPENSSL_NO_ECDH) || defined(OPENSSL_NO_ECDSA)
683 #if !defined(NID_X9_62_prime256v1) || !defined(NID_secp224r1)
684 #error "curves unavailable"
688 [ 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.]) ])
690 AC_CHECK_MEMBERS([struct ssl_method_st.get_cipher_by_char], , ,
691 [#include <openssl/ssl.h>
695 SSL_SESSION_get_master_key \
696 SSL_get_server_random \
697 SSL_get_client_ciphers \
698 SSL_get_client_random \
703 dnl Check if OpenSSL has scrypt implementation.
704 AC_CHECK_FUNCS([ EVP_PBE_scrypt ])
707 LDFLAGS="$save_LDFLAGS"
708 CPPFLAGS="$save_CPPFLAGS"
710 dnl ------------------------------------------------------
711 dnl Where do you live, zlib? And how do we call you?
713 tor_zlib_pkg_redhat="zlib"
714 tor_zlib_pkg_debian="zlib1g"
715 tor_zlib_devpkg_redhat="zlib-devel"
716 tor_zlib_devpkg_debian="zlib1g-dev"
718 TOR_SEARCH_LIBRARY(zlib, $tryzlibdir, [-lz],
720 [const char * zlibVersion(void);],
721 [zlibVersion();], [--with-zlib-dir],
724 if test "$enable_static_zlib" = "yes"; then
725 if test "$tor_cv_library_zlib_dir" = "(system)"; then
726 AC_MSG_ERROR("You must specify an explicit --with-zlib-dir=x option when
727 using --enable-static-zlib")
729 TOR_ZLIB_LIBS="$TOR_LIBDIR_zlib/libz.a"
734 AC_SUBST(TOR_ZLIB_LIBS)
736 dnl ----------------------------------------------------------------------
737 dnl Check if libcap is available for capabilities.
739 tor_cap_pkg_debian="libcap2"
740 tor_cap_pkg_redhat="libcap"
741 tor_cap_devpkg_debian="libcap-dev"
742 tor_cap_devpkg_redhat="libcap-devel"
744 AC_CHECK_LIB([cap], [cap_init], [],
745 AC_MSG_NOTICE([Libcap was not found. Capabilities will not be usable.])
747 AC_CHECK_FUNCS(cap_set_proc)
749 dnl ---------------------------------------------------------------------
750 dnl Now that we know about our major libraries, we can check for compiler
751 dnl and linker hardening options. We need to do this with the libraries known,
752 dnl since sometimes the linker will like an option but not be willing to
753 dnl use it with a build of a library.
755 all_ldflags_for_check="$TOR_LDFLAGS_zlib $TOR_LDFLAGS_openssl $TOR_LDFLAGS_libevent"
756 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"
758 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
759 #if !defined(__clang__)
761 #endif])], have_clang=yes, have_clang=no)
763 if test "x$enable_gcc_hardening" != "xno"; then
764 CFLAGS="$CFLAGS -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2"
765 if test "x$have_clang" = "xyes"; then
766 TOR_CHECK_CFLAGS(-Qunused-arguments)
768 TOR_CHECK_CFLAGS(-fstack-protector-all, also_link)
769 AS_VAR_PUSHDEF([can_compile], [tor_cv_cflags_-fstack-protector-all])
770 AS_VAR_PUSHDEF([can_link], [tor_can_link_-fstack-protector-all])
771 m4_ifdef([AS_VAR_IF],[
772 AS_VAR_IF(can_compile, [yes],
773 AS_VAR_IF(can_link, [yes],
775 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.)]))
777 AS_VAR_POPDEF([can_link])
778 AS_VAR_POPDEF([can_compile])
779 TOR_CHECK_CFLAGS(-Wstack-protector)
780 TOR_CHECK_CFLAGS(-fwrapv)
781 TOR_CHECK_CFLAGS(--param ssp-buffer-size=1)
782 if test "$bwin32" = "false"; then
783 TOR_CHECK_CFLAGS(-fPIE)
784 TOR_CHECK_LDFLAGS(-pie, "$all_ldflags_for_check", "$all_libs_for_check")
788 if test "x$enable_expensive_hardening" = "xyes"; then
789 TOR_CHECK_CFLAGS([-fsanitize=address])
790 TOR_CHECK_CFLAGS([-fsanitize=undefined])
791 TOR_CHECK_CFLAGS([-fno-omit-frame-pointer])
794 if test "x$enable_linker_hardening" != "xno"; then
795 TOR_CHECK_LDFLAGS(-z relro -z now, "$all_ldflags_for_check", "$all_libs_for_check")
798 # For backtrace support
799 TOR_CHECK_LDFLAGS(-rdynamic)
801 dnl ------------------------------------------------------
802 dnl Now see if we have a -fomit-frame-pointer compiler option.
804 saved_CFLAGS="$CFLAGS"
805 TOR_CHECK_CFLAGS(-fomit-frame-pointer)
806 F_OMIT_FRAME_POINTER=''
807 if test "$saved_CFLAGS" != "$CFLAGS"; then
808 if test "x$enable_expensive_hardening" != "xyes"; then
809 F_OMIT_FRAME_POINTER='-fomit-frame-pointer'
812 CFLAGS="$saved_CFLAGS"
813 AC_SUBST(F_OMIT_FRAME_POINTER)
815 dnl ------------------------------------------------------
816 dnl If we are adding -fomit-frame-pointer (or if the compiler's doing it
817 dnl for us, as GCC 4.6 and later do at many optimization levels), then
818 dnl we should try to add -fasynchronous-unwind-tables so that our backtrace
820 TOR_CHECK_CFLAGS(-fasynchronous-unwind-tables)
822 dnl ============================================================
823 dnl Check for libseccomp
825 if test "x$enable_seccomp" != "xno"; then
826 AC_CHECK_HEADERS([seccomp.h])
827 AC_SEARCH_LIBS(seccomp_init, [seccomp])
830 dnl ============================================================
831 dnl Check for libscrypt
833 if test "x$enable_libscrypt" != "xno"; then
834 AC_CHECK_HEADERS([libscrypt.h])
835 AC_SEARCH_LIBS(libscrypt_scrypt, [scrypt])
836 AC_CHECK_FUNCS([libscrypt_scrypt])
839 dnl ============================================================
840 dnl We need an implementation of curve25519.
842 dnl set these defaults.
843 build_curve25519_donna=no
844 build_curve25519_donna_c64=no
845 use_curve25519_donna=no
846 use_curve25519_nacl=no
849 dnl The best choice is using curve25519-donna-c64, but that requires
851 AC_CACHE_CHECK([whether we can use curve25519-donna-c64],
852 tor_cv_can_use_curve25519_donna_c64,
854 [AC_LANG_PROGRAM([dnl
856 typedef unsigned uint128_t __attribute__((mode(TI)));
857 int func(uint64_t a, uint64_t b) {
858 uint128_t c = ((uint128_t)a) * b;
859 int ok = ((uint64_t)(c>>96)) == 522859 &&
860 (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
861 (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
862 (((uint64_t)(c))&0xffffffffL) == 0;
866 int ok = func( ((uint64_t)2000000000) * 1000000000,
867 ((uint64_t)1234567890) << 24);
870 [tor_cv_can_use_curve25519_donna_c64=yes],
871 [tor_cv_can_use_curve25519_donna_c64=no],
873 [AC_LANG_PROGRAM([dnl
875 typedef unsigned uint128_t __attribute__((mode(TI)));
876 int func(uint64_t a, uint64_t b) {
877 uint128_t c = ((uint128_t)a) * b;
878 int ok = ((uint64_t)(c>>96)) == 522859 &&
879 (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
880 (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
881 (((uint64_t)(c))&0xffffffffL) == 0;
885 int ok = func( ((uint64_t)2000000000) * 1000000000,
886 ((uint64_t)1234567890) << 24);
889 [tor_cv_can_use_curve25519_donna_c64=cross],
890 [tor_cv_can_use_curve25519_donna_c64=no])])])
892 AC_CHECK_HEADERS([crypto_scalarmult_curve25519.h \
893 nacl/crypto_scalarmult_curve25519.h])
895 AC_CACHE_CHECK([for nacl compiled with a fast curve25519 implementation],
896 tor_cv_can_use_curve25519_nacl,
897 [tor_saved_LIBS="$LIBS"
900 [AC_LANG_PROGRAM([dnl
901 #ifdef HAVE_CRYPTO_SCALARMULT_CURVE25519_H
902 #include <crypto_scalarmult_curve25519.h>
903 #elif defined(HAVE_NACL_CRYPTO_SCALARMULT_CURVE25519_H)
904 #include <nacl/crypto_scalarmult_curve25519.h>
906 #ifdef crypto_scalarmult_curve25519_ref_BYTES
907 #error Hey, this is the reference implementation! That's not fast.
910 unsigned char *a, *b, *c; crypto_scalarmult_curve25519(a,b,c);
911 ])], [tor_cv_can_use_curve25519_nacl=yes],
912 [tor_cv_can_use_curve25519_nacl=no])
913 LIBS="$tor_saved_LIBS" ])
915 dnl Okay, now we need to figure out which one to actually use. Fall back
916 dnl to curve25519-donna.c
918 if test "x$tor_cv_can_use_curve25519_donna_c64" != "xno"; then
919 build_curve25519_donna_c64=yes
920 use_curve25519_donna=yes
921 elif test "x$tor_cv_can_use_curve25519_nacl" = "xyes"; then
922 use_curve25519_nacl=yes
923 CURVE25519_LIBS=-lnacl
925 build_curve25519_donna=yes
926 use_curve25519_donna=yes
929 if test "x$use_curve25519_donna" = "xyes"; then
930 AC_DEFINE(USE_CURVE25519_DONNA, 1,
931 [Defined if we should use an internal curve25519_donna{,_c64} implementation])
933 if test "x$use_curve25519_nacl" = "xyes"; then
934 AC_DEFINE(USE_CURVE25519_NACL, 1,
935 [Defined if we should use a curve25519 from nacl])
937 AM_CONDITIONAL(BUILD_CURVE25519_DONNA,
938 test "x$build_curve25519_donna" = "xyes")
939 AM_CONDITIONAL(BUILD_CURVE25519_DONNA_C64,
940 test "x$build_curve25519_donna_c64" = "xyes")
941 AC_SUBST(CURVE25519_LIBS)
943 dnl Make sure to enable support for large off_t if available.
959 , , 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.))
961 dnl These headers are not essential
1005 AC_CHECK_HEADERS(sys/param.h)
1007 AC_CHECK_HEADERS(net/if.h, net_if_found=1, net_if_found=0,
1008 [#ifdef HAVE_SYS_TYPES_H
1009 #include <sys/types.h>
1011 #ifdef HAVE_SYS_SOCKET_H
1012 #include <sys/socket.h>
1014 AC_CHECK_HEADERS(net/pfvar.h, net_pfvar_found=1, net_pfvar_found=0,
1015 [#ifdef HAVE_SYS_TYPES_H
1016 #include <sys/types.h>
1018 #ifdef HAVE_SYS_SOCKET_H
1019 #include <sys/socket.h>
1021 #ifdef HAVE_NET_IF_H
1024 #ifdef HAVE_NETINET_IN_H
1025 #include <netinet/in.h>
1028 AC_CHECK_HEADERS(linux/if.h,[],[],
1030 #ifdef HAVE_SYS_SOCKET_H
1031 #include <sys/socket.h>
1035 AC_CHECK_HEADERS(linux/netfilter_ipv4.h,
1036 linux_netfilter_ipv4=1, linux_netfilter_ipv4=0,
1037 [#ifdef HAVE_SYS_TYPES_H
1038 #include <sys/types.h>
1040 #ifdef HAVE_SYS_SOCKET_H
1041 #include <sys/socket.h>
1043 #ifdef HAVE_LIMITS_H
1046 #ifdef HAVE_LINUX_TYPES_H
1047 #include <linux/types.h>
1049 #ifdef HAVE_NETINET_IN6_H
1050 #include <netinet/in6.h>
1052 #ifdef HAVE_NETINET_IN_H
1053 #include <netinet/in.h>
1056 AC_CHECK_HEADERS(linux/netfilter_ipv6/ip6_tables.h,
1057 linux_netfilter_ipv6_ip6_tables=1, linux_netfilter_ipv6_ip6_tables=0,
1058 [#ifdef HAVE_SYS_TYPES_H
1059 #include <sys/types.h>
1061 #ifdef HAVE_SYS_SOCKET_H
1062 #include <sys/socket.h>
1064 #ifdef HAVE_LIMITS_H
1067 #ifdef HAVE_LINUX_TYPES_H
1068 #include <linux/types.h>
1070 #ifdef HAVE_NETINET_IN6_H
1071 #include <netinet/in6.h>
1073 #ifdef HAVE_NETINET_IN_H
1074 #include <netinet/in.h>
1076 #ifdef HAVE_LINUX_IF_H
1077 #include <linux/if.h>
1080 if test "x$transparent" = "xtrue"; then
1082 if test "x$net_if_found" = "x1" && test "x$net_pfvar_found" = "x1"; then
1085 if test "x$linux_netfilter_ipv4" = "x1"; then
1088 if test "x$linux_netfilter_ipv6_ip6_tables" = "x1"; then
1091 if test "x$transparent_ok" = "x1"; then
1092 AC_DEFINE(USE_TRANSPARENT, 1, "Define to enable transparent proxy support")
1094 *-*-openbsd* | *-*-bitrig*)
1095 AC_DEFINE(OPENBSD, 1, "Define to handle pf on OpenBSD properly") ;;
1098 AC_MSG_NOTICE([Transparent proxy support enabled, but missing headers.])
1102 AC_CHECK_MEMBERS([struct timeval.tv_sec], , ,
1103 [#ifdef HAVE_SYS_TYPES_H
1104 #include <sys/types.h>
1106 #ifdef HAVE_SYS_TIME_H
1107 #include <sys/time.h>
1110 dnl In case we aren't given a working stdint.h, we'll need to grow our own.
1113 AC_CHECK_SIZEOF(int8_t)
1114 AC_CHECK_SIZEOF(int16_t)
1115 AC_CHECK_SIZEOF(int32_t)
1116 AC_CHECK_SIZEOF(int64_t)
1117 AC_CHECK_SIZEOF(uint8_t)
1118 AC_CHECK_SIZEOF(uint16_t)
1119 AC_CHECK_SIZEOF(uint32_t)
1120 AC_CHECK_SIZEOF(uint64_t)
1121 AC_CHECK_SIZEOF(intptr_t)
1122 AC_CHECK_SIZEOF(uintptr_t)
1124 dnl AC_CHECK_TYPES([int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t, uint64_t, intptr_t, uintptr_t])
1126 AC_CHECK_SIZEOF(char)
1127 AC_CHECK_SIZEOF(short)
1128 AC_CHECK_SIZEOF(int)
1129 AC_CHECK_SIZEOF(long)
1130 AC_CHECK_SIZEOF(long long)
1131 AC_CHECK_SIZEOF(__int64)
1132 AC_CHECK_SIZEOF(void *)
1133 AC_CHECK_SIZEOF(time_t)
1134 AC_CHECK_SIZEOF(size_t)
1135 AC_CHECK_SIZEOF(pid_t)
1137 AC_CHECK_TYPES([uint, u_char, ssize_t])
1139 AC_PC_FROM_UCONTEXT([:])
1141 dnl used to include sockaddr_storage, but everybody has that.
1142 AC_CHECK_TYPES([struct in6_addr, struct sockaddr_in6, sa_family_t], , ,
1143 [#ifdef HAVE_SYS_TYPES_H
1144 #include <sys/types.h>
1146 #ifdef HAVE_NETINET_IN_H
1147 #include <netinet/in.h>
1149 #ifdef HAVE_NETINET_IN6_H
1150 #include <netinet/in6.h>
1152 #ifdef HAVE_SYS_SOCKET_H
1153 #include <sys/socket.h>
1156 #define _WIN32_WINNT 0x0501
1157 #define WIN32_LEAN_AND_MEAN
1158 #include <winsock2.h>
1159 #include <ws2tcpip.h>
1162 AC_CHECK_MEMBERS([struct in6_addr.s6_addr32, struct in6_addr.s6_addr16, struct sockaddr_in.sin_len, struct sockaddr_in6.sin6_len], , ,
1163 [#ifdef HAVE_SYS_TYPES_H
1164 #include <sys/types.h>
1166 #ifdef HAVE_NETINET_IN_H
1167 #include <netinet/in.h>
1169 #ifdef HAVE_NETINET_IN6_H
1170 #include <netinet/in6.h>
1172 #ifdef HAVE_SYS_SOCKET_H
1173 #include <sys/socket.h>
1176 #define _WIN32_WINNT 0x0501
1177 #define WIN32_LEAN_AND_MEAN
1178 #include <winsock2.h>
1179 #include <ws2tcpip.h>
1183 AC_CHECK_TYPES([rlim_t], , ,
1184 [#ifdef HAVE_SYS_TYPES_H
1185 #include <sys/types.h>
1187 #ifdef HAVE_SYS_TIME_H
1188 #include <sys/time.h>
1190 #ifdef HAVE_SYS_RESOURCE_H
1191 #include <sys/resource.h>
1195 AX_CHECK_SIGN([time_t],
1198 #ifdef HAVE_SYS_TYPES_H
1199 #include <sys/types.h>
1201 #ifdef HAVE_SYS_TIME_H
1202 #include <sys/time.h>
1209 if test "$ax_cv_decl_time_t_signed" = "no"; then
1210 AC_MSG_ERROR([You have an unsigned time_t; Tor does not support that. Please tell the Tor developers about your interesting platform.])
1213 AX_CHECK_SIGN([size_t],
1214 [ tor_cv_size_t_signed=yes ],
1215 [ tor_cv_size_t_signed=no ], [
1216 #ifdef HAVE_SYS_TYPES_H
1217 #include <sys/types.h>
1221 if test "$ax_cv_decl_size_t_signed" = "yes"; then
1222 AC_MSG_ERROR([You have a signed size_t; that's grossly nonconformant.])
1225 AX_CHECK_SIGN([enum always],
1226 [ AC_DEFINE(ENUM_VALS_ARE_SIGNED, 1, [Define if enum is always signed]) ],
1228 enum always { AAA, BBB, CCC };
1231 AC_CHECK_SIZEOF(socklen_t, , [AC_INCLUDES_DEFAULT()
1232 #ifdef HAVE_SYS_SOCKET_H
1233 #include <sys/socket.h>
1237 # We want to make sure that we _don't_ have a cell_t defined, like IRIX does.
1239 AC_CHECK_SIZEOF(cell_t)
1241 # Now make sure that NULL can be represented as zero bytes.
1242 AC_CACHE_CHECK([whether memset(0) sets pointers to NULL], tor_cv_null_is_zero,
1243 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1244 [[#include <stdlib.h>
1247 #ifdef HAVE_STDDEF_H
1250 int main () { char *p1,*p2; p1=NULL; memset(&p2,0,sizeof(p2));
1251 return memcmp(&p1,&p2,sizeof(char*))?1:0; }]])],
1252 [tor_cv_null_is_zero=yes],
1253 [tor_cv_null_is_zero=no],
1254 [tor_cv_null_is_zero=cross])])
1256 if test "$tor_cv_null_is_zero" = "cross"; then
1257 # Cross-compiling; let's hope that the target isn't raving mad.
1258 AC_MSG_NOTICE([Cross-compiling: we'll assume that NULL is represented as a sequence of 0-valued bytes.])
1261 if test "$tor_cv_null_is_zero" != "no"; then
1262 AC_DEFINE([NULL_REP_IS_ZERO_BYTES], 1,
1263 [Define to 1 iff memset(0) sets pointers to NULL])
1266 AC_CACHE_CHECK([whether memset(0) sets doubles to 0.0], tor_cv_dbl0_is_zero,
1267 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1268 [[#include <stdlib.h>
1271 #ifdef HAVE_STDDEF_H
1274 int main () { double d1,d2; d1=0; memset(&d2,0,sizeof(d2));
1275 return memcmp(&d1,&d2,sizeof(d1))?1:0; }]])],
1276 [tor_cv_dbl0_is_zero=yes],
1277 [tor_cv_dbl0_is_zero=no],
1278 [tor_cv_dbl0_is_zero=cross])])
1280 if test "$tor_cv_dbl0_is_zero" = "cross"; then
1281 # Cross-compiling; let's hope that the target isn't raving mad.
1282 AC_MSG_NOTICE([Cross-compiling: we'll assume that 0.0 can be represented as a sequence of 0-valued bytes.])
1285 if test "$tor_cv_dbl0_is_zero" != "no"; then
1286 AC_DEFINE([DOUBLE_0_REP_IS_ZERO_BYTES], 1,
1287 [Define to 1 iff memset(0) sets doubles to 0.0])
1290 # And what happens when we malloc zero?
1291 AC_CACHE_CHECK([whether we can malloc(0) safely.], tor_cv_malloc_zero_works,
1292 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1293 [[#include <stdlib.h>
1296 #ifdef HAVE_STDDEF_H
1299 int main () { return malloc(0)?0:1; }]])],
1300 [tor_cv_malloc_zero_works=yes],
1301 [tor_cv_malloc_zero_works=no],
1302 [tor_cv_malloc_zero_works=cross])])
1304 if test "$tor_cv_malloc_zero_works" = "cross"; then
1305 # Cross-compiling; let's hope that the target isn't raving mad.
1306 AC_MSG_NOTICE([Cross-compiling: we'll assume that we need to check malloc() arguments for 0.])
1309 if test "$tor_cv_malloc_zero_works" = "yes"; then
1310 AC_DEFINE([MALLOC_ZERO_WORKS], 1,
1311 [Define to 1 iff malloc(0) returns a pointer])
1314 # whether we seem to be in a 2s-complement world.
1315 AC_CACHE_CHECK([whether we are using 2s-complement arithmetic], tor_cv_twos_complement,
1316 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1317 [[int main () { int problem = ((-99) != (~99)+1);
1318 return problem ? 1 : 0; }]])],
1319 [tor_cv_twos_complement=yes],
1320 [tor_cv_twos_complement=no],
1321 [tor_cv_twos_complement=cross])])
1323 if test "$tor_cv_twos_complement" = "cross"; then
1324 # Cross-compiling; let's hope that the target isn't raving mad.
1325 AC_MSG_NOTICE([Cross-compiling: we'll assume that negative integers are represented with two's complement.])
1328 if test "$tor_cv_twos_complement" != "no"; then
1329 AC_DEFINE([USING_TWOS_COMPLEMENT], 1,
1330 [Define to 1 iff we represent negative integers with
1334 # What does shifting a negative value do?
1335 AC_CACHE_CHECK([whether right-shift on negative values does sign-extension], tor_cv_sign_extend,
1336 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1337 [[int main () { int okay = (-60 >> 8) == -1; return okay ? 0 : 1; }]])],
1338 [tor_cv_sign_extend=yes],
1339 [tor_cv_sign_extend=no],
1340 [tor_cv_sign_extend=cross])])
1342 if test "$tor_cv_sign_extend" = "cross"; then
1343 # Cross-compiling; let's hope that the target isn't raving mad.
1344 AC_MSG_NOTICE([Cross-compiling: we'll assume that right-shifting negative integers causes sign-extension])
1347 if test "$tor_cv_sign_extend" != "no"; then
1348 AC_DEFINE([RSHIFT_DOES_SIGN_EXTEND], 1,
1349 [Define to 1 iff right-shifting a negative value performs sign-extension])
1352 # Whether we should use the dmalloc memory allocation debugging library.
1353 AC_MSG_CHECKING(whether to use dmalloc (debug memory allocation library))
1354 AC_ARG_WITH(dmalloc,
1355 AS_HELP_STRING(--with-dmalloc, [use debug memory allocation library]),
1356 [if [[ "$withval" = "yes" ]]; then
1362 fi], [ dmalloc=0; AC_MSG_RESULT(no) ]
1365 if [[ $dmalloc -eq 1 ]]; then
1366 AC_CHECK_HEADERS(dmalloc.h, , AC_MSG_ERROR(dmalloc header file not found. Do you have the development files for dmalloc installed?))
1367 AC_SEARCH_LIBS(dmalloc_malloc, [dmallocth dmalloc], , AC_MSG_ERROR(Libdmalloc library not found. If you enable it you better have it installed.))
1368 AC_DEFINE(USE_DMALLOC, 1, [Debug memory allocation library])
1369 AC_CHECK_FUNCS(dmalloc_strdup dmalloc_strndup)
1372 AC_ARG_WITH(tcmalloc,
1373 AS_HELP_STRING(--with-tcmalloc, [use tcmalloc memory allocation library]),
1374 [ tcmalloc=yes ], [ tcmalloc=no ])
1376 if test "x$tcmalloc" = "xyes"; then
1377 LDFLAGS="-ltcmalloc $LDFLAGS"
1380 using_custom_malloc=no
1381 if test "x$enable_openbsd_malloc" = "xyes"; then
1382 using_custom_malloc=yes
1384 if test "x$tcmalloc" = "xyes"; then
1385 using_custom_malloc=yes
1387 if test "$using_custom_malloc" = "no"; then
1388 AC_CHECK_FUNCS(mallinfo)
1391 # By default, we're going to assume we don't have mlockall()
1392 # bionic and other platforms have various broken mlockall subsystems.
1393 # Some systems don't have a working mlockall, some aren't linkable,
1394 # and some have it but don't declare it.
1395 AC_CHECK_FUNCS(mlockall)
1396 AC_CHECK_DECLS([mlockall], , , [
1397 #ifdef HAVE_SYS_MMAN_H
1398 #include <sys/mman.h>
1401 # Allow user to specify an alternate syslog facility
1402 AC_ARG_WITH(syslog-facility,
1403 AS_HELP_STRING(--with-syslog-facility=LOG, [syslog facility to use (default=LOG_DAEMON)]),
1404 syslog_facility="$withval", syslog_facility="LOG_DAEMON")
1405 AC_DEFINE_UNQUOTED(LOGFACILITY,$syslog_facility,[name of the syslog facility])
1406 AC_SUBST(LOGFACILITY)
1408 # Check if we have getresuid and getresgid
1409 AC_CHECK_FUNCS(getresuid getresgid)
1411 # Check for gethostbyname_r in all its glorious incompatible versions.
1412 # (This logic is based on that in Python's configure.in)
1413 AH_TEMPLATE(HAVE_GETHOSTBYNAME_R,
1414 [Define this if you have any gethostbyname_r()])
1416 AC_CHECK_FUNC(gethostbyname_r, [
1417 AC_MSG_CHECKING([how many arguments gethostbyname_r() wants])
1419 CFLAGS="$CFLAGS $MY_CPPFLAGS $MY_THREAD_CPPFLAGS $MY_CFLAGS"
1420 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
1424 struct hostent *h1, *h2;
1426 (void)gethostbyname_r(cp1,h1,cp2,i1,&h2,&i2);
1428 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1429 AC_DEFINE(HAVE_GETHOSTBYNAME_R_6_ARG, 1,
1430 [Define this if gethostbyname_r takes 6 arguments])
1439 (void)gethostbyname_r(cp1,h1,cp2,i1,&i2);
1441 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1442 AC_DEFINE(HAVE_GETHOSTBYNAME_R_5_ARG, 1,
1443 [Define this if gethostbyname_r takes 5 arguments])
1451 struct hostent_data hd;
1452 (void) gethostbyname_r(cp1,h1,&hd);
1454 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1455 AC_DEFINE(HAVE_GETHOSTBYNAME_R_3_ARG, 1,
1456 [Define this if gethostbyname_r takes 3 arguments])
1466 AC_CACHE_CHECK([whether the C compiler supports __func__],
1467 tor_cv_have_func_macro,
1468 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1470 int main(int c, char **v) { puts(__func__); }])],
1471 tor_cv_have_func_macro=yes,
1472 tor_cv_have_func_macro=no))
1474 AC_CACHE_CHECK([whether the C compiler supports __FUNC__],
1475 tor_cv_have_FUNC_macro,
1476 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1478 int main(int c, char **v) { puts(__FUNC__); }])],
1479 tor_cv_have_FUNC_macro=yes,
1480 tor_cv_have_FUNC_macro=no))
1482 AC_CACHE_CHECK([whether the C compiler supports __FUNCTION__],
1483 tor_cv_have_FUNCTION_macro,
1484 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1486 int main(int c, char **v) { puts(__FUNCTION__); }])],
1487 tor_cv_have_FUNCTION_macro=yes,
1488 tor_cv_have_FUNCTION_macro=no))
1490 AC_CACHE_CHECK([whether we have extern char **environ already declared],
1491 tor_cv_have_environ_declared,
1492 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1493 /* We define _GNU_SOURCE here because it is also defined in compat.c.
1494 * Without it environ doesn't get declared. */
1496 #ifdef HAVE_UNISTD_H
1500 int main(int c, char **v) { char **t = environ; }])],
1501 tor_cv_have_environ_declared=yes,
1502 tor_cv_have_environ_declared=no))
1504 if test "$tor_cv_have_func_macro" = "yes"; then
1505 AC_DEFINE(HAVE_MACRO__func__, 1, [Defined if the compiler supports __func__])
1508 if test "$tor_cv_have_FUNC_macro" = "yes"; then
1509 AC_DEFINE(HAVE_MACRO__FUNC__, 1, [Defined if the compiler supports __FUNC__])
1512 if test "$tor_cv_have_FUNCTION_macro" = "yes"; then
1513 AC_DEFINE(HAVE_MACRO__FUNCTION__, 1,
1514 [Defined if the compiler supports __FUNCTION__])
1517 if test "$tor_cv_have_environ_declared" = "yes"; then
1518 AC_DEFINE(HAVE_EXTERN_ENVIRON_DECLARED, 1,
1519 [Defined if we have extern char **environ already declared])
1522 # $prefix stores the value of the --prefix command line option, or
1523 # NONE if the option wasn't set. In the case that it wasn't set, make
1524 # it be the default, so that we can use it to expand directories now.
1525 if test "x$prefix" = "xNONE"; then
1526 prefix=$ac_default_prefix
1529 # and similarly for $exec_prefix
1530 if test "x$exec_prefix" = "xNONE"; then
1534 if test "x$BUILDDIR" = "x"; then
1538 AH_TEMPLATE([BUILDDIR],[tor's build directory])
1539 AC_DEFINE_UNQUOTED(BUILDDIR,"$BUILDDIR")
1541 if test "x$CONFDIR" = "x"; then
1542 CONFDIR=`eval echo $sysconfdir/tor`
1545 AH_TEMPLATE([CONFDIR],[tor's configuration directory])
1546 AC_DEFINE_UNQUOTED(CONFDIR,"$CONFDIR")
1548 BINDIR=`eval echo $bindir`
1550 LOCALSTATEDIR=`eval echo $localstatedir`
1551 AC_SUBST(LOCALSTATEDIR)
1553 if test "$bwin32" = "true"; then
1554 # Test if the linker supports the --nxcompat and --dynamicbase options
1556 save_LDFLAGS="$LDFLAGS"
1557 LDFLAGS="-Wl,--nxcompat -Wl,--dynamicbase"
1558 AC_MSG_CHECKING([whether the linker supports DllCharacteristics])
1559 AC_LINK_IFELSE([AC_LANG_PROGRAM([])],
1560 [AC_MSG_RESULT([yes])]
1561 [save_LDFLAGS="$save_LDFLAGS $LDFLAGS"],
1562 [AC_MSG_RESULT([no])]
1564 LDFLAGS="$save_LDFLAGS"
1567 # Set CFLAGS _after_ all the above checks, since our warnings are stricter
1568 # than autoconf's macros like.
1569 if test "$GCC" = "yes"; then
1570 # Disable GCC's strict aliasing checks. They are an hours-to-debug
1571 # accident waiting to happen.
1572 CFLAGS="$CFLAGS -Wall -fno-strict-aliasing"
1574 # Override optimization level for non-gcc compilers
1576 enable_gcc_warnings=no
1577 enable_gcc_warnings_advisory=no
1580 # OS X Lion started deprecating the system openssl. Let's just disable
1581 # all deprecation warnings on OS X. Also, to potentially make the binary
1582 # a little smaller, let's enable dead_strip.
1586 CFLAGS="$CFLAGS -Wno-deprecated-declarations"
1587 LDFLAGS="$LDFLAGS -dead_strip" ;;
1590 # Add some more warnings which we use in development but not in the
1591 # released versions. (Some relevant gcc versions can't handle these.)
1592 if test "x$enable_gcc_warnings" = "xyes" ||
1593 test "x$enable_gcc_warnings_advisory" = "xyes"; then
1595 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1596 #if !defined(__GNUC__) || (__GNUC__ < 4)
1598 #endif])], have_gcc4=yes, have_gcc4=no)
1600 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1601 #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 2)
1603 #endif])], have_gcc42=yes, have_gcc42=no)
1605 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1606 #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 3)
1608 #endif])], have_gcc43=yes, have_gcc43=no)
1610 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1611 #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 6)
1613 #endif])], have_gcc46=yes, have_gcc46=no)
1616 save_CFLAGS="$CFLAGS"
1617 CFLAGS="$CFLAGS -Wshorten-64-to-32"
1618 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], have_shorten64_flag=yes,
1619 have_shorten64_flag=no)
1620 CFLAGS="$save_CFLAGS"
1623 *-*-openbsd* | *-*-bitrig*)
1624 # Some OpenBSD versions (like 4.8) have -Wsystem-headers by default.
1625 # That's fine, except that the headers don't pass -Wredundant-decls.
1626 # Therefore, let's disable -Wsystem-headers when we're building
1627 # with maximal warnings on OpenBSD.
1628 CFLAGS="$CFLAGS -Wno-system-headers" ;;
1631 CFLAGS="$CFLAGS -W -Wfloat-equal -Wundef -Wpointer-arith"
1632 CFLAGS="$CFLAGS -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings"
1633 CFLAGS="$CFLAGS -Wredundant-decls -Wchar-subscripts -Wcomment -Wformat=2"
1634 CFLAGS="$CFLAGS -Wwrite-strings -Wmissing-declarations -Wredundant-decls"
1635 CFLAGS="$CFLAGS -Wnested-externs -Wbad-function-cast -Wswitch-enum"
1637 if test "x$enable_gcc_warnings" = "xyes"; then
1638 CFLAGS="$CFLAGS -Werror"
1641 # Disabled, so we can use mallinfo(): -Waggregate-return
1643 if test "x$have_gcc4" = "xyes"; then
1644 # These warnings break gcc 3.3.5 and work on gcc 4.0.2
1645 CFLAGS="$CFLAGS -Winit-self -Wmissing-field-initializers -Wold-style-definition"
1648 if test "x$have_gcc42" = "xyes"; then
1649 # These warnings break gcc 4.0.2 and work on gcc 4.2
1650 # XXXX020 See if any of these work with earlier versions.
1651 CFLAGS="$CFLAGS -Waddress -Wmissing-noreturn -Wstrict-overflow=1"
1653 # We used to use -Wstrict-overflow=5, but that breaks us heavily under 4.3.
1656 if test "x$have_gcc42" = "xyes" && test "x$have_clang" = "xno"; then
1657 # These warnings break gcc 4.0.2 and clang, but work on gcc 4.2
1658 CFLAGS="$CFLAGS -Wnormalized=id -Woverride-init"
1661 if test "x$have_gcc43" = "xyes"; then
1662 # These warnings break gcc 4.2 and work on gcc 4.3
1663 # XXXX020 See if any of these work with earlier versions.
1664 CFLAGS="$CFLAGS -Wextra -Warray-bounds"
1667 if test "x$have_gcc46" = "xyes"; then
1668 # This warning was added in gcc 4.3, but it appears to generate
1669 # spurious warnings in gcc 4.4. I don't know if it works in 4.5.
1670 CFLAGS="$CFLAGS -Wlogical-op"
1673 if test "x$have_shorten64_flag" = "xyes"; then
1674 CFLAGS="$CFLAGS -Wshorten-64-to-32"
1679 ##This will break the world on some 64-bit architectures
1680 # CFLAGS="$CFLAGS -Winline"
1683 if test "$enable_coverage" = "yes" && test "$have_clang" = "no"; then
1686 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.])
1690 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent $TOR_CPPFLAGS_openssl $TOR_CPPFLAGS_zlib"
1695 contrib/dist/suse/tor.sh
1696 contrib/operator-tools/tor.logrotate
1699 contrib/dist/tor.service
1700 src/config/torrc.sample
1701 src/config/torrc.minimal
1702 scripts/maint/checkOptionDocs.pl
1703 scripts/maint/updateVersions.pl
1706 if test "x$asciidoc" = "xtrue" && test "$ASCIIDOC" = "none"; then
1707 regular_mans="doc/tor doc/tor-gencert doc/tor-resolve doc/torify"
1708 for file in $regular_mans ; do
1709 if ! [[ -f "$srcdir/$file.1.in" ]] || ! [[ -f "$srcdir/$file.html.in" ]] ; then
1710 echo "==================================";
1712 echo "Building Tor has failed since manpages cannot be built.";
1714 echo "You need asciidoc installed to be able to build the manpages.";
1715 echo "To build without manpages, use the --disable-asciidoc argument";
1716 echo "when calling configure.";
1718 echo "==================================";