1 dnl Copyright (c) 2001-2004, Roger Dingledine
2 dnl Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson
3 dnl Copyright (c) 2007-2015, The Tor Project, Inc.
4 dnl See LICENSE for licensing information
6 AC_INIT([tor],[0.2.6.2-alpha-dev])
7 AC_CONFIG_SRCDIR([src/or/main.c])
8 AC_CONFIG_MACRO_DIR([m4])
10 m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
11 AC_CONFIG_HEADERS([orconfig.h])
17 if test -f /etc/redhat-release ; then
18 if test -f /usr/kerberos/include ; then
19 CPPFLAGS="$CPPFLAGS -I/usr/kerberos/include"
23 # Not a no-op; we want to make sure that CPPFLAGS is set before we use
24 # the += operator on it in src/or/Makefile.am
25 CPPFLAGS="$CPPFLAGS -I\${top_srcdir}/src/common"
27 #XXXX020 We should make these enabled or not, before 0.2.0.x-final
28 AC_ARG_ENABLE(openbsd-malloc,
29 AS_HELP_STRING(--enable-openbsd-malloc, Use malloc code from openbsd. Linux only))
30 AC_ARG_ENABLE(instrument-downloads,
31 AS_HELP_STRING(--enable-instrument-downloads, Instrument downloads of directory resources etc.))
32 AC_ARG_ENABLE(static-openssl,
33 AS_HELP_STRING(--enable-static-openssl, Link against a static openssl library. Requires --with-openssl-dir))
34 AC_ARG_ENABLE(static-libevent,
35 AS_HELP_STRING(--enable-static-libevent, Link against a static libevent library. Requires --with-libevent-dir))
36 AC_ARG_ENABLE(static-zlib,
37 AS_HELP_STRING(--enable-static-zlib, Link against a static zlib library. Requires --with-zlib-dir))
38 AC_ARG_ENABLE(static-tor,
39 AS_HELP_STRING(--enable-static-tor, Create an entirely static Tor binary. Requires --with-openssl-dir and --with-libevent-dir and --with-zlib-dir))
40 AC_ARG_ENABLE(unittests,
41 AS_HELP_STRING(--disable-unittests, [Don't build unit tests for Tor. Risky!]))
42 AC_ARG_ENABLE(coverage,
43 AS_HELP_STRING(--enable-coverage, [Enable coverage support in the unit-test build]))
44 AC_ARG_ENABLE(system-torrc,
45 AS_HELP_STRING(--disable-system-torrc, [Don't look for a system-wide torrc file]))
47 AM_CONDITIONAL(UNITTESTS_ENABLED, test x$enable_unittests != xno)
48 AM_CONDITIONAL(COVERAGE_ENABLED, test x$enable_coverage = xyes)
50 if test "$enable_static_tor" = "yes"; then
51 enable_static_libevent="yes";
52 enable_static_openssl="yes";
53 enable_static_zlib="yes";
54 CFLAGS="$CFLAGS -static"
57 if test "$enable_system_torrc" = "no"; then
58 AC_DEFINE(DISABLE_SYSTEM_TORRC, 1,
59 [Defined if we're not going to look for a torrc in SYSCONF])
62 if test x$enable_buf_freelists = xyes; then
63 AC_DEFINE(ENABLE_BUF_FREELISTS, 1,
64 [Defined if we try to use freelists for buffer RAM chunks])
67 AM_CONDITIONAL(USE_MEMPOOLS, test x$enable_mempools = xyes)
68 if test x$enable_mempools = xyes; then
69 AC_DEFINE(ENABLE_MEMPOOLS, 1,
70 [Defined if we try to use mempools for cells being relayed])
73 AM_CONDITIONAL(USE_OPENBSD_MALLOC, test x$enable_openbsd_malloc = xyes)
74 if test x$enable_instrument_downloads = xyes; then
75 AC_DEFINE(INSTRUMENT_DOWNLOADS, 1,
76 [Defined if we want to keep track of how much of each kind of resource we download.])
79 AC_ARG_ENABLE(transparent,
80 AS_HELP_STRING(--disable-transparent, disable transparent proxy support),
81 [case "${enableval}" in
82 yes) transparent=true ;;
83 no) transparent=false ;;
84 *) AC_MSG_ERROR(bad value for --enable-transparent) ;;
85 esac], [transparent=true])
87 AC_ARG_ENABLE(asciidoc,
88 AS_HELP_STRING(--disable-asciidoc, don't use asciidoc (disables building of manpages)),
89 [case "${enableval}" in
92 *) AC_MSG_ERROR(bad value for --disable-asciidoc) ;;
93 esac], [asciidoc=true])
95 # By default, we're not ready to ship a NAT-PMP aware Tor
96 AC_ARG_ENABLE(nat-pmp,
97 AS_HELP_STRING(--enable-nat-pmp, enable NAT-PMP support),
98 [case "${enableval}" in
101 * ) AC_MSG_ERROR(bad value for --enable-nat-pmp) ;;
102 esac], [natpmp=false])
104 # By default, we're not ready to ship a UPnP aware Tor
106 AS_HELP_STRING(--enable-upnp, enable UPnP support),
107 [case "${enableval}" in
110 * ) AC_MSG_ERROR(bad value for --enable-upnp) ;;
113 # systemd notify support
114 AC_ARG_ENABLE(systemd,
115 AS_HELP_STRING(--enable-systemd, enable systemd notification support),
116 [case "${enableval}" in
119 * ) AC_MSG_ERROR(bad value for --enable-systemd) ;;
120 esac], [systemd=auto])
125 if test x$enable_systemd = xno ; then
128 PKG_CHECK_MODULES(SYSTEMD,
132 if test x$have_systemd=xno; then
133 AC_MSG_NOTICE([Okay, checking for systemd a different way...])
134 PKG_CHECK_MODULES(SYSTEMD,
141 if test x$have_systemd = xyes; then
142 AC_DEFINE(HAVE_SYSTEMD,1,[Have systemd])
143 TOR_SYSTEMD_CFLAGS="${SYSTEMD_CFLAGS}"
144 TOR_SYSTEMD_LIBS="${SYSTEMD_LIBS}"
145 PKG_CHECK_MODULES(SYSTEMD209, [systemd >= 209],
146 [AC_DEFINE(HAVE_SYSTEMD_209,1,[Have systemd v209 or more])], [])
148 AC_SUBST(TOR_SYSTEMD_CFLAGS)
149 AC_SUBST(TOR_SYSTEMD_LIBS)
151 if test x$enable_systemd = xyes -a x$have_systemd != xyes ; then
152 AC_MSG_ERROR([Explicitly requested systemd support, but systemd not found])
157 AC_DEFINE(_REENTRANT, 1, [Define on some platforms to activate x_r() functions in time.h])
161 AC_ARG_ENABLE(gcc-warnings,
162 AS_HELP_STRING(--enable-gcc-warnings, enable verbose warnings))
163 AC_ARG_ENABLE(gcc-warnings-advisory,
164 AS_HELP_STRING(--enable-gcc-warnings-advisory, [enable verbose warnings, excluding -Werror]))
166 dnl Others suggest '/gs /safeseh /nxcompat /dynamicbase' for non-gcc on Windows
167 AC_ARG_ENABLE(gcc-hardening,
168 AS_HELP_STRING(--disable-gcc-hardening, disable compiler security checks))
170 AC_ARG_ENABLE(expensive-hardening,
171 AS_HELP_STRING(--enable-expensive-hardening, enable more expensive compiler hardening; makes Tor slower))
173 dnl Linker hardening options
174 dnl Currently these options are ELF specific - you can't use this with MacOSX
175 AC_ARG_ENABLE(linker-hardening,
176 AS_HELP_STRING(--disable-linker-hardening, disable linker security fixups))
178 AC_ARG_ENABLE(local-appdata,
179 AS_HELP_STRING(--enable-local-appdata, default to host local application data paths on Windows))
180 if test "$enable_local_appdata" = "yes"; then
181 AC_DEFINE(ENABLE_LOCAL_APPDATA, 1,
182 [Defined if we default to host local appdata paths on Windows])
186 AC_ARG_ENABLE(tor2web-mode,
187 AS_HELP_STRING(--enable-tor2web-mode, support tor2web non-anonymous mode),
188 [if test x$enableval = xyes; then
189 CFLAGS="$CFLAGS -D ENABLE_TOR2WEB_MODE=1"
192 AC_ARG_ENABLE(bufferevents,
193 AS_HELP_STRING(--enable-bufferevents, use Libevent's buffered IO.))
195 AC_ARG_ENABLE(tool-name-check,
196 AS_HELP_STRING(--disable-tool-name-check, check for sanely named toolchain when cross-compiling))
198 AC_ARG_ENABLE(seccomp,
199 AS_HELP_STRING(--disable-seccomp, do not attempt to use libseccomp))
201 AC_ARG_ENABLE(libscrypt,
202 AS_HELP_STRING(--disable-libscrypt, do not attempt to use libscrypt))
204 dnl check for the correct "ar" when cross-compiling
205 AN_MAKEVAR([AR], [AC_PROG_AR])
206 AN_PROGRAM([ar], [AC_PROG_AR])
207 AC_DEFUN([AC_PROG_AR], [AC_CHECK_TOOL([AR], [ar], [ar])])
210 dnl Check whether the above macro has settled for a simply named tool even
211 dnl though we're cross compiling. We must do this before running AC_PROG_CC,
212 dnl because that will find any cc on the system, not only the cross-compiler,
213 dnl and then verify that a binary built with this compiler runs on the
214 dnl build system. It will then come to the false conclusion that we're not
216 if test x$enable_tool_name_check != xno; then
217 if test x$ac_tool_warned = xyes; then
218 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.)])
219 elif test "x$ac_ct_AR" != x -a x$cross_compiling = xmaybe; then
220 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.)])
229 dnl autoconf 2.59 appears not to support AC_PROG_SED
230 AC_CHECK_PROG([SED],[sed],[sed],[/bin/false])
232 dnl check for asciidoc and a2x
233 AC_PATH_PROG([ASCIIDOC], [asciidoc], none)
234 AC_PATH_PROGS([A2X], [a2x a2x.py], none)
236 AM_CONDITIONAL(USE_ASCIIDOC, test x$asciidoc = xtrue)
238 AM_CONDITIONAL(USE_FW_HELPER, test x$natpmp = xtrue || test x$upnp = xtrue)
239 AM_CONDITIONAL(NAT_PMP, test x$natpmp = xtrue)
240 AM_CONDITIONAL(MINIUPNPC, test x$upnp = xtrue)
244 AC_ARG_VAR([PYTHON], [path to Python binary])
245 AC_CHECK_PROGS(PYTHON, [python python2 python2.7 python3 python3.3])
246 if test "x$PYTHON" = "x"; then
247 AC_MSG_WARN([Python unavailable; some tests will not be run.])
249 AM_CONDITIONAL(USEPYTHON, [test "x$PYTHON" != "x"])
251 ifdef([AC_C_FLEXIBLE_ARRAY_MEMBER], [
252 AC_C_FLEXIBLE_ARRAY_MEMBER
254 dnl Maybe we've got an old autoconf...
255 AC_CACHE_CHECK([for flexible array members],
259 struct abc { int a; char b[]; };
261 struct abc *def = malloc(sizeof(struct abc)+sizeof(char));
264 [tor_cv_c_flexarray=yes],
265 [tor_cv_c_flexarray=no])])
266 if test $tor_cv_flexarray = yes ; then
267 AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [], [Define to nothing if C supports flexible array members, and to 1 if it does not.])
269 AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [1], [Define to nothing if C supports flexible array members, and to 1 if it does not.])
273 AC_CACHE_CHECK([for working C99 mid-block declaration syntax],
276 [AC_LANG_PROGRAM([], [int x; x = 3; int y; y = 4 + x;])],
277 [tor_cv_c_c99_decl=yes],
278 [tor_cv_c_c99_decl=no] )])
279 if test "$tor_cv_c_c99_decl" != "yes"; then
280 AC_MSG_ERROR([Your compiler doesn't support c99 mid-block declarations. This is required as of Tor 0.2.6.x])
283 AC_CACHE_CHECK([for working C99 designated initializers],
284 tor_cv_c_c99_designated_init,
286 [AC_LANG_PROGRAM([struct s { int a; int b; };],
287 [[ struct s ss = { .b = 5, .a = 6 }; ]])],
288 [tor_cv_c_c99_designated_init=yes],
289 [tor_cv_c_c99_designated_init=no] )])
291 if test "$tor_cv_c_c99_designated_init" != "yes"; then
292 AC_MSG_ERROR([Your compiler doesn't support c99 designated initializers. This is required as of Tor 0.2.6.x])
295 AC_PATH_PROG([SHA1SUM], [sha1sum], none)
296 AC_PATH_PROG([OPENSSL], [openssl], none)
299 AC_ARG_WITH(tor-user,
300 [ --with-tor-user=NAME Specify username for tor daemon ],
308 AC_ARG_WITH(tor-group,
309 [ --with-tor-group=NAME Specify group name for tor daemon ],
317 dnl If _WIN32 is defined and non-zero, we are building for win32
318 AC_MSG_CHECKING([for win32])
319 AC_RUN_IFELSE([AC_LANG_SOURCE([
320 int main(int c, char **v) {
331 bwin32=true; AC_MSG_RESULT([yes]),
332 bwin32=false; AC_MSG_RESULT([no]),
333 bwin32=cross; AC_MSG_RESULT([cross])
336 if test "$bwin32" = cross; then
337 AC_MSG_CHECKING([for win32 (cross)])
338 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
340 int main(int c, char **v) {return 0;}
343 int main(int c, char **v) {return x(y);}
346 bwin32=true; AC_MSG_RESULT([yes]),
347 bwin32=false; AC_MSG_RESULT([no]))
350 AM_CONDITIONAL(BUILD_NT_SERVICES, test x$bwin32 = xtrue)
352 dnl Enable C99 when compiling with MIPSpro
353 AC_MSG_CHECKING([for MIPSpro compiler])
354 AC_COMPILE_IFELSE([AC_LANG_PROGRAM(, [
355 #if (defined(__sgi) && defined(_COMPILER_VERSION))
360 bmipspro=false; AC_MSG_RESULT(no),
361 bmipspro=true; AC_MSG_RESULT(yes))
363 if test "$bmipspro" = true; then
364 CFLAGS="$CFLAGS -c99"
369 AC_SEARCH_LIBS(socket, [socket network])
370 AC_SEARCH_LIBS(gethostbyname, [nsl])
371 AC_SEARCH_LIBS(dlopen, [dl])
372 AC_SEARCH_LIBS(inet_aton, [resolv])
374 AC_SEARCH_LIBS([clock_gettime], [rt])
375 if test "$LIBS" != "$saved_LIBS"; then
376 # Looks like we need -lrt for clock_gettime().
380 AC_SEARCH_LIBS(pthread_create, [pthread])
381 AC_SEARCH_LIBS(pthread_detach, [pthread])
383 AM_CONDITIONAL(THREADS_WIN32, test "$bwin32" = "true")
384 AM_CONDITIONAL(THREADS_PTHREADS, test "$bwin32" = "false")
386 dnl -------------------------------------------------------------------
387 dnl Check for functions before libevent, since libevent-1.2 apparently
388 dnl exports strlcpy without defining it in a header.
394 backtrace_symbols_fd \
431 if test "$bwin32" != true; then
432 AC_CHECK_HEADERS(pthread.h)
433 AC_CHECK_FUNCS(pthread_create)
436 dnl ------------------------------------------------------
437 dnl Where do you live, libevent? And how do we call you?
439 if test "$bwin32" = true; then
440 TOR_LIB_WS32=-lws2_32
441 TOR_LIB_IPHLPAPI=-liphlpapi
442 # Some of the cargo-cults recommend -lwsock32 as well, but I don't
443 # think it's actually necessary.
449 AC_SUBST(TOR_LIB_WS32)
450 AC_SUBST(TOR_LIB_GDI)
451 AC_SUBST(TOR_LIB_IPHLPAPI)
453 dnl We need to do this before we try our disgusting hack below.
454 AC_CHECK_HEADERS([sys/types.h])
456 dnl This is a disgusting hack so we safely include older libevent headers.
457 AC_CHECK_TYPE(u_int64_t, unsigned long long)
458 AC_CHECK_TYPE(u_int32_t, unsigned long)
459 AC_CHECK_TYPE(u_int16_t, unsigned short)
460 AC_CHECK_TYPE(u_int8_t, unsigned char)
462 tor_libevent_pkg_redhat="libevent"
463 tor_libevent_pkg_debian="libevent-dev"
464 tor_libevent_devpkg_redhat="libevent-devel"
465 tor_libevent_devpkg_debian="libevent-dev"
467 dnl On Gnu/Linux or any place we require it, we'll add librt to the Libevent
468 dnl linking for static builds.
469 STATIC_LIBEVENT_FLAGS=""
470 if test "$enable_static_libevent" = "yes"; then
471 if test "$have_rt" = yes; then
472 STATIC_LIBEVENT_FLAGS=" -lrt "
476 TOR_SEARCH_LIBRARY(libevent, $trylibeventdir, [-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32], [
478 #include <winsock2.h>
481 #include <sys/time.h>
482 #include <sys/types.h>
483 #include <event.h>], [
485 #include <winsock2.h>
487 void exit(int); void *event_init(void);],
490 {WSADATA d; WSAStartup(0x101,&d); }
492 event_init(); exit(0);
493 ], [--with-libevent-dir], [/opt/libevent])
495 dnl Now check for particular libevent functions.
497 save_LDFLAGS="$LDFLAGS"
498 save_CPPFLAGS="$CPPFLAGS"
499 LIBS="-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32 $LIBS"
500 LDFLAGS="$TOR_LDFLAGS_libevent $LDFLAGS"
501 CPPFLAGS="$TOR_CPPFLAGS_libevent $CPPFLAGS"
502 AC_CHECK_FUNCS([event_get_version \
503 event_get_version_number \
505 event_set_log_callback \
506 evutil_secure_rng_set_urandom_device_file \
507 evutil_secure_rng_init \
508 event_base_loopexit])
509 AC_CHECK_MEMBERS([struct event.min_heap_idx], , ,
513 AC_CHECK_HEADERS(event2/event.h event2/dns.h event2/bufferevent_ssl.h)
516 LDFLAGS="$save_LDFLAGS"
517 CPPFLAGS="$save_CPPFLAGS"
520 AM_CONDITIONAL(USE_EXTERNAL_EVDNS, test x$ac_cv_header_event2_dns_h = xyes)
522 if test "$enable_static_libevent" = "yes"; then
523 if test "$tor_cv_library_libevent_dir" = "(system)"; then
524 AC_MSG_ERROR("You must specify an explicit --with-libevent-dir=x option when using --enable-static-libevent")
526 TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent.a $STATIC_LIBEVENT_FLAGS"
529 TOR_LIBEVENT_LIBS="-levent"
532 dnl This isn't the best test for Libevent 2.0.3-alpha. Once it's released,
533 dnl we can do much better.
534 if test "$enable_bufferevents" = "yes" ; then
535 if test "$ac_cv_header_event2_bufferevent_ssl_h" != "yes" ; then
536 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.])
539 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent"
541 # Check for the right version. First see if version detection works.
542 AC_MSG_CHECKING([whether we can detect the Libevent version])
543 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
544 #include <event2/event.h>
545 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 10
551 ])], [event_version_number_works=yes; AC_MSG_RESULT([yes]) ],
552 [event_version_number_works=no; AC_MSG_RESULT([no])])
553 if test "$event_version_number_works" != 'yes'; then
554 AC_MSG_WARN([Version detection on Libevent seems broken. Your Libevent installation is probably screwed up or very old.])
556 AC_MSG_CHECKING([whether Libevent is new enough for bufferevents])
557 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
558 #include <event2/event.h>
559 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 0x02000d00
565 ])], [ AC_MSG_RESULT([yes]) ],
566 [ AC_MSG_RESULT([no])
567 AC_MSG_ERROR([Libevent does not seem new enough to support bufferevents. We require 2.0.13-stable or later]) ] )
573 LDFLAGS="$save_LDFLAGS"
574 CPPFLAGS="$save_CPPFLAGS"
576 AM_CONDITIONAL(USE_BUFFEREVENTS, test "$enable_bufferevents" = "yes")
577 if test "$enable_bufferevents" = "yes"; then
578 AC_DEFINE(USE_BUFFEREVENTS, 1, [Defined if we're going to use Libevent's buffered IO API])
579 if test "$enable_static_libevent" = "yes"; then
580 TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent_openssl.a $TOR_LIBEVENT_LIBS"
582 TOR_LIBEVENT_LIBS="-levent_openssl $TOR_LIBEVENT_LIBS"
585 AC_SUBST(TOR_LIBEVENT_LIBS)
587 dnl ------------------------------------------------------
588 dnl Where do you live, libm?
590 dnl On some platforms (Haiku/BeOS) the math library is
591 dnl part of libroot. In which case don't link against lm
594 AC_SEARCH_LIBS(pow, [m], , AC_MSG_ERROR([Could not find pow in libm or libc.]))
595 if test "$ac_cv_search_pow" != "none required"; then
596 TOR_LIB_MATH="$ac_cv_search_pow"
599 AC_SUBST(TOR_LIB_MATH)
601 dnl ------------------------------------------------------
602 dnl Where do you live, openssl? And how do we call you?
604 tor_openssl_pkg_redhat="openssl"
605 tor_openssl_pkg_debian="libssl-dev"
606 tor_openssl_devpkg_redhat="openssl-devel"
607 tor_openssl_devpkg_debian="libssl-dev"
609 ALT_openssl_WITHVAL=""
611 [ --with-ssl-dir=PATH Obsolete alias for --with-openssl-dir ],
613 if test "x$withval" != xno && test "x$withval" != "x" ; then
614 ALT_openssl_WITHVAL="$withval"
618 TOR_SEARCH_LIBRARY(openssl, $tryssldir, [-lssl -lcrypto $TOR_LIB_GDI],
619 [#include <openssl/rand.h>],
620 [void RAND_add(const void *buf, int num, double entropy);],
621 [RAND_add((void*)0,0,0); exit(0);], [],
622 [/usr/local/openssl /usr/lib/openssl /usr/local/ssl /usr/lib/ssl /usr/local /usr/athena /opt/openssl])
624 dnl XXXX check for OPENSSL_VERSION_NUMBER == SSLeay()
626 if test "$enable_static_openssl" = "yes"; then
627 if test "$tor_cv_library_openssl_dir" = "(system)"; then
628 AC_MSG_ERROR("You must specify an explicit --with-openssl-dir=x option when using --enable-static-openssl")
630 TOR_OPENSSL_LIBS="$TOR_LIBDIR_openssl/libssl.a $TOR_LIBDIR_openssl/libcrypto.a"
633 TOR_OPENSSL_LIBS="-lssl -lcrypto"
635 AC_SUBST(TOR_OPENSSL_LIBS)
637 AC_CHECK_MEMBERS([struct ssl_method_st.get_cipher_by_char], , ,
638 [#include <openssl/ssl.h>
641 dnl ------------------------------------------------------
642 dnl Where do you live, zlib? And how do we call you?
644 tor_zlib_pkg_redhat="zlib"
645 tor_zlib_pkg_debian="zlib1g"
646 tor_zlib_devpkg_redhat="zlib-devel"
647 tor_zlib_devpkg_debian="zlib1g-dev"
649 TOR_SEARCH_LIBRARY(zlib, $tryzlibdir, [-lz],
651 [const char * zlibVersion(void);],
652 [zlibVersion(); exit(0);], [--with-zlib-dir],
655 if test "$enable_static_zlib" = "yes"; then
656 if test "$tor_cv_library_zlib_dir" = "(system)"; then
657 AC_MSG_ERROR("You must specify an explicit --with-zlib-dir=x option when
658 using --enable-static-zlib")
660 TOR_ZLIB_LIBS="$TOR_LIBDIR_zlib/libz.a"
665 AC_SUBST(TOR_ZLIB_LIBS)
667 dnl ---------------------------------------------------------------------
668 dnl Now that we know about our major libraries, we can check for compiler
669 dnl and linker hardening options. We need to do this with the libraries known,
670 dnl since sometimes the linker will like an option but not be willing to
671 dnl use it with a build of a library.
673 all_ldflags_for_check="$TOR_LDFLAGS_zlib $TOR_LDFLAGS_openssl $TOR_LDFLAGS_libevent"
674 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"
676 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
677 #if !defined(__clang__)
679 #endif])], have_clang=yes, have_clang=no)
681 if test x$enable_gcc_hardening != xno; then
682 CFLAGS="$CFLAGS -D_FORTIFY_SOURCE=2"
683 if test x$have_clang = xyes; then
684 TOR_CHECK_CFLAGS(-Qunused-arguments)
686 TOR_CHECK_CFLAGS(-fstack-protector-all, also_link)
687 AS_VAR_PUSHDEF([can_compile], [tor_cv_cflags_-fstack-protector-all])
688 AS_VAR_PUSHDEF([can_link], [tor_can_link_-fstack-protector-all])
689 m4_ifdef([AS_VAR_IF],[
690 AS_VAR_IF(can_compile, [yes],
691 AS_VAR_IF(can_link, [yes],
693 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.)]))
695 AS_VAR_POPDEF([can_link])
696 AS_VAR_POPDEF([can_compile])
697 TOR_CHECK_CFLAGS(-Wstack-protector)
698 TOR_CHECK_CFLAGS(-fwrapv)
699 TOR_CHECK_CFLAGS(--param ssp-buffer-size=1)
700 if test "$bwin32" = "false"; then
701 TOR_CHECK_CFLAGS(-fPIE)
702 TOR_CHECK_LDFLAGS(-pie, "$all_ldflags_for_check", "$all_libs_for_check")
706 if test x$enable_expensive_hardening = xyes ; then
707 TOR_CHECK_CFLAGS([-fsanitize=address])
708 TOR_CHECK_CFLAGS([-fsanitize=undefined])
709 TOR_CHECK_CFLAGS([-fno-omit-frame-pointer])
712 if test x$enable_linker_hardening != xno; then
713 TOR_CHECK_LDFLAGS(-z relro -z now, "$all_ldflags_for_check", "$all_libs_for_check")
716 # For backtrace support
717 TOR_CHECK_LDFLAGS(-rdynamic)
719 dnl ------------------------------------------------------
720 dnl Now see if we have a -fomit-frame-pointer compiler option.
722 saved_CFLAGS="$CFLAGS"
723 TOR_CHECK_CFLAGS(-fomit-frame-pointer)
724 F_OMIT_FRAME_POINTER=''
725 if test "$saved_CFLAGS" != "$CFLAGS"; then
726 if test x$enable_expensive_hardening != xyes ; then
727 F_OMIT_FRAME_POINTER='-fomit-frame-pointer'
730 CFLAGS="$saved_CFLAGS"
731 AC_SUBST(F_OMIT_FRAME_POINTER)
733 dnl ------------------------------------------------------
734 dnl If we are adding -fomit-frame-pointer (or if the compiler's doing it
735 dnl for us, as GCC 4.6 and later do at many optimization levels), then
736 dnl we should try to add -fasynchronous-unwind-tables so that our backtrace
738 TOR_CHECK_CFLAGS(-fasynchronous-unwind-tables)
740 dnl ------------------------------------------------------
741 dnl Where do you live, libnatpmp? And how do we call you?
742 dnl There are no packages for Debian or Redhat as of this patch
744 if test "$natpmp" = "true"; then
745 AC_DEFINE(NAT_PMP, 1, [Define to 1 if we are building with nat-pmp.])
746 TOR_SEARCH_LIBRARY(libnatpmp, $trylibnatpmpdir, [-lnatpmp $TOR_LIB_WS32 $TOR_LIB_IPHLPAPI],
747 [#include <natpmp.h>],
751 #include <natpmp.h>],
754 natpmpresp_t response;
755 r = initnatpmp(&natpmp, 0, 0);],
756 [printf("initnatpmp() returned %d (%s)\n", r, r?"FAILED":"SUCCESS");
758 [--with-libnatpmp-dir],
763 dnl ------------------------------------------------------
764 dnl Where do you live, libminiupnpc? And how do we call you?
765 dnl There are no packages for Debian or Redhat as of this patch
767 if test "$upnp" = "true"; then
768 AC_DEFINE(MINIUPNPC, 1, [Define to 1 if we are building with UPnP.])
770 dnl Before we call TOR_SEARCH_LIBRARY we'll do a quick compile test
771 dnl to see if we have miniupnpc-1.5 or -1.6
772 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include <miniupnpc/miniupnpc.h>],
773 [upnpDiscover(1, 0, 0, 0);exit(0);])],[miniupnpc15="true"],[miniupnpc15="false"])
775 if test "$miniupnpc15" = "true" ; then
776 AC_DEFINE([MINIUPNPC15],[1],[libminiupnpc version 1.5 found])
777 TOR_SEARCH_LIBRARY(libminiupnpc, $trylibminiupnpcdir, [-lminiupnpc $TOR_LIB_WS32 $TOR_LIB_IPHLPAPI],
778 [#include <miniupnpc/miniwget.h>
779 #include <miniupnpc/miniupnpc.h>
780 #include <miniupnpc/upnpcommands.h>],
781 [void upnpDiscover(int delay, const char * multicastif,
782 const char * minissdpdsock, int sameport);],
783 [upnpDiscover(1, 0, 0, 0); exit(0);],
784 [--with-libminiupnpc-dir],
787 TOR_SEARCH_LIBRARY(libminiupnpc, $trylibminiupnpcdir, [-lminiupnpc $TOR_LIB_WS32 $TOR_LIB_IPHLPAPI],
788 [#include <miniupnpc/miniwget.h>
789 #include <miniupnpc/miniupnpc.h>
790 #include <miniupnpc/upnpcommands.h>],
791 [void upnpDiscover(int delay, const char * multicastif,
792 const char * minissdpdsock, int sameport, int ipv6, int * error);],
793 [upnpDiscover(1, 0, 0, 0, 0, 0); exit(0);],
794 [--with-libminiupnpc-dir],
799 dnl ============================================================
800 dnl Check for libseccomp
802 if test "x$enable_seccomp" != "xno"; then
803 AC_CHECK_HEADERS([seccomp.h])
804 AC_SEARCH_LIBS(seccomp_init, [seccomp])
807 dnl ============================================================
808 dnl Check for libscrypt
810 if test "x$enable_libscrypt" != "xno"; then
811 AC_CHECK_HEADERS([libscrypt.h])
812 AC_SEARCH_LIBS(libscrypt_scrypt, [scrypt])
815 dnl ============================================================
816 dnl We need an implementation of curve25519.
818 dnl set these defaults.
819 build_curve25519_donna=no
820 build_curve25519_donna_c64=no
821 use_curve25519_donna=no
822 use_curve25519_nacl=no
825 dnl The best choice is using curve25519-donna-c64, but that requires
827 AC_CACHE_CHECK([whether we can use curve25519-donna-c64],
828 tor_cv_can_use_curve25519_donna_c64,
830 [AC_LANG_PROGRAM([dnl
832 typedef unsigned uint128_t __attribute__((mode(TI)));
833 int func(uint64_t a, uint64_t b) {
834 uint128_t c = ((uint128_t)a) * b;
835 int ok = ((uint64_t)(c>>96)) == 522859 &&
836 (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
837 (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
838 (((uint64_t)(c))&0xffffffffL) == 0;
842 int ok = func( ((uint64_t)2000000000) * 1000000000,
843 ((uint64_t)1234567890) << 24);
846 [tor_cv_can_use_curve25519_donna_c64=yes],
847 [tor_cv_can_use_curve25519_donna_c64=no],
849 [AC_LANG_PROGRAM([dnl
851 typedef unsigned uint128_t __attribute__((mode(TI)));
852 int func(uint64_t a, uint64_t b) {
853 uint128_t c = ((uint128_t)a) * b;
854 int ok = ((uint64_t)(c>>96)) == 522859 &&
855 (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
856 (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
857 (((uint64_t)(c))&0xffffffffL) == 0;
861 int ok = func( ((uint64_t)2000000000) * 1000000000,
862 ((uint64_t)1234567890) << 24);
865 [tor_cv_can_use_curve25519_donna_c64=cross],
866 [tor_cv_can_use_curve25519_donna_c64=no])])])
868 AC_CHECK_HEADERS([crypto_scalarmult_curve25519.h \
869 nacl/crypto_scalarmult_curve25519.h])
871 AC_CACHE_CHECK([for nacl compiled with a fast curve25519 implementation],
872 tor_cv_can_use_curve25519_nacl,
873 [tor_saved_LIBS="$LIBS"
876 [AC_LANG_PROGRAM([dnl
877 #ifdef HAVE_CRYPTO_SCALARMULT_CURVE25519_H
878 #include <crypto_scalarmult_curve25519.h>
879 #elif defined(HAVE_NACL_CRYPTO_SCALARMULT_CURVE25519_H)
880 #include <nacl/crypto_scalarmult_curve25519.h>
882 #ifdef crypto_scalarmult_curve25519_ref_BYTES
883 #error Hey, this is the reference implementation! That's not fast.
886 unsigned char *a, *b, *c; crypto_scalarmult_curve25519(a,b,c);
887 ])], [tor_cv_can_use_curve25519_nacl=yes],
888 [tor_cv_can_use_curve25519_nacl=no])
889 LIBS="$tor_saved_LIBS" ])
891 dnl Okay, now we need to figure out which one to actually use. Fall back
892 dnl to curve25519-donna.c
894 if test x$tor_cv_can_use_curve25519_donna_c64 != xno; then
895 build_curve25519_donna_c64=yes
896 use_curve25519_donna=yes
897 elif test x$tor_cv_can_use_curve25519_nacl = xyes; then
898 use_curve25519_nacl=yes
899 CURVE25519_LIBS=-lnacl
901 build_curve25519_donna=yes
902 use_curve25519_donna=yes
905 if test x$use_curve25519_donna = xyes; then
906 AC_DEFINE(USE_CURVE25519_DONNA, 1,
907 [Defined if we should use an internal curve25519_donna{,_c64} implementation])
909 if test x$use_curve25519_nacl = xyes; then
910 AC_DEFINE(USE_CURVE25519_NACL, 1,
911 [Defined if we should use a curve25519 from nacl])
913 AM_CONDITIONAL(BUILD_CURVE25519_DONNA, test x$build_curve25519_donna = xyes)
914 AM_CONDITIONAL(BUILD_CURVE25519_DONNA_C64, test x$build_curve25519_donna_c64 = xyes)
915 AC_SUBST(CURVE25519_LIBS)
917 dnl Make sure to enable support for large off_t if available.
932 , , 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.))
934 dnl These headers are not essential
975 AC_CHECK_HEADERS(sys/param.h)
977 AC_CHECK_HEADERS(net/if.h, net_if_found=1, net_if_found=0,
978 [#ifdef HAVE_SYS_TYPES_H
979 #include <sys/types.h>
981 #ifdef HAVE_SYS_SOCKET_H
982 #include <sys/socket.h>
984 AC_CHECK_HEADERS(net/pfvar.h, net_pfvar_found=1, net_pfvar_found=0,
985 [#ifdef HAVE_SYS_TYPES_H
986 #include <sys/types.h>
988 #ifdef HAVE_SYS_SOCKET_H
989 #include <sys/socket.h>
995 AC_CHECK_HEADERS(linux/if.h,[],[],
997 #ifdef HAVE_SYS_SOCKET_H
998 #include <sys/socket.h>
1002 AC_CHECK_HEADERS(linux/netfilter_ipv4.h,
1003 linux_netfilter_ipv4=1, linux_netfilter_ipv4=0,
1004 [#ifdef HAVE_SYS_TYPES_H
1005 #include <sys/types.h>
1007 #ifdef HAVE_SYS_SOCKET_H
1008 #include <sys/socket.h>
1010 #ifdef HAVE_LIMITS_H
1013 #ifdef HAVE_LINUX_TYPES_H
1014 #include <linux/types.h>
1016 #ifdef HAVE_NETINET_IN6_H
1017 #include <netinet/in6.h>
1019 #ifdef HAVE_NETINET_IN_H
1020 #include <netinet/in.h>
1023 AC_CHECK_HEADERS(linux/netfilter_ipv6/ip6_tables.h,
1024 linux_netfilter_ipv6_ip6_tables=1, linux_netfilter_ipv6_ip6_tables=0,
1025 [#ifdef HAVE_SYS_TYPES_H
1026 #include <sys/types.h>
1028 #ifdef HAVE_SYS_SOCKET_H
1029 #include <sys/socket.h>
1031 #ifdef HAVE_LIMITS_H
1034 #ifdef HAVE_LINUX_TYPES_H
1035 #include <linux/types.h>
1037 #ifdef HAVE_NETINET_IN6_H
1038 #include <netinet/in6.h>
1040 #ifdef HAVE_NETINET_IN_H
1041 #include <netinet/in.h>
1043 #ifdef HAVE_LINUX_IF_H
1044 #include <linux/if.h>
1047 if test x$transparent = xtrue ; then
1049 if test x$net_if_found = x1 && test x$net_pfvar_found = x1 ; then
1052 if test x$linux_netfilter_ipv4 = x1 ; then
1055 if test x$linux_netfilter_ipv6_ip6_tables = x1 ; then
1058 if test x$transparent_ok = x1 ; then
1059 AC_DEFINE(USE_TRANSPARENT, 1, "Define to enable transparent proxy support")
1061 *-*-openbsd* | *-*-bitrig*)
1062 AC_DEFINE(OPENBSD, 1, "Define to handle pf on OpenBSD properly") ;;
1065 AC_MSG_NOTICE([Transparent proxy support enabled, but missing headers.])
1069 AC_CHECK_MEMBERS([struct timeval.tv_sec], , ,
1070 [#ifdef HAVE_SYS_TYPES_H
1071 #include <sys/types.h>
1073 #ifdef HAVE_SYS_TIME_H
1074 #include <sys/time.h>
1077 dnl In case we aren't given a working stdint.h, we'll need to grow our own.
1080 AC_CHECK_SIZEOF(int8_t)
1081 AC_CHECK_SIZEOF(int16_t)
1082 AC_CHECK_SIZEOF(int32_t)
1083 AC_CHECK_SIZEOF(int64_t)
1084 AC_CHECK_SIZEOF(uint8_t)
1085 AC_CHECK_SIZEOF(uint16_t)
1086 AC_CHECK_SIZEOF(uint32_t)
1087 AC_CHECK_SIZEOF(uint64_t)
1088 AC_CHECK_SIZEOF(intptr_t)
1089 AC_CHECK_SIZEOF(uintptr_t)
1091 dnl AC_CHECK_TYPES([int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t, uint64_t, intptr_t, uintptr_t])
1093 AC_CHECK_SIZEOF(char)
1094 AC_CHECK_SIZEOF(short)
1095 AC_CHECK_SIZEOF(int)
1096 AC_CHECK_SIZEOF(long)
1097 AC_CHECK_SIZEOF(long long)
1098 AC_CHECK_SIZEOF(__int64)
1099 AC_CHECK_SIZEOF(void *)
1100 AC_CHECK_SIZEOF(time_t)
1101 AC_CHECK_SIZEOF(size_t)
1102 AC_CHECK_SIZEOF(pid_t)
1104 AC_CHECK_TYPES([uint, u_char, ssize_t])
1106 AC_PC_FROM_UCONTEXT([/bin/true])
1108 dnl used to include sockaddr_storage, but everybody has that.
1109 AC_CHECK_TYPES([struct in6_addr, struct sockaddr_in6, sa_family_t], , ,
1110 [#ifdef HAVE_SYS_TYPES_H
1111 #include <sys/types.h>
1113 #ifdef HAVE_NETINET_IN_H
1114 #include <netinet/in.h>
1116 #ifdef HAVE_NETINET_IN6_H
1117 #include <netinet/in6.h>
1119 #ifdef HAVE_SYS_SOCKET_H
1120 #include <sys/socket.h>
1123 #define _WIN32_WINNT 0x0501
1124 #define WIN32_LEAN_AND_MEAN
1125 #if defined(_MSC_VER) && (_MSC_VER < 1300)
1126 #include <winsock.h>
1128 #include <winsock2.h>
1129 #include <ws2tcpip.h>
1133 AC_CHECK_MEMBERS([struct in6_addr.s6_addr32, struct in6_addr.s6_addr16, struct sockaddr_in.sin_len, struct sockaddr_in6.sin6_len], , ,
1134 [#ifdef HAVE_SYS_TYPES_H
1135 #include <sys/types.h>
1137 #ifdef HAVE_NETINET_IN_H
1138 #include <netinet/in.h>
1140 #ifdef HAVE_NETINET_IN6_H
1141 #include <netinet/in6.h>
1143 #ifdef HAVE_SYS_SOCKET_H
1144 #include <sys/socket.h>
1147 #define _WIN32_WINNT 0x0501
1148 #define WIN32_LEAN_AND_MEAN
1149 #if defined(_MSC_VER) && (_MSC_VER < 1300)
1150 #include <winsock.h>
1152 #include <winsock2.h>
1153 #include <ws2tcpip.h>
1158 AC_CHECK_TYPES([rlim_t], , ,
1159 [#ifdef HAVE_SYS_TYPES_H
1160 #include <sys/types.h>
1162 #ifdef HAVE_SYS_TIME_H
1163 #include <sys/time.h>
1165 #ifdef HAVE_SYS_RESOURCE_H
1166 #include <sys/resource.h>
1170 AX_CHECK_SIGN([time_t],
1171 [ AC_DEFINE(TIME_T_IS_SIGNED, 1, [Define if time_t is signed]) ],
1173 #ifdef HAVE_SYS_TYPES_H
1174 #include <sys/types.h>
1176 #ifdef HAVE_SYS_TIME_H
1177 #include <sys/time.h>
1184 if test "$ax_cv_decl_time_t_signed" = no; then
1185 AC_MSG_WARN([You have an unsigned time_t; some things will probably break. Please tell the Tor developers about your interesting platform.])
1188 AX_CHECK_SIGN([size_t],
1189 [ tor_cv_size_t_signed=yes ],
1190 [ tor_cv_size_t_signed=no ], [
1191 #ifdef HAVE_SYS_TYPES_H
1192 #include <sys/types.h>
1196 if test "$ax_cv_decl_size_t_signed" = yes; then
1197 AC_MSG_ERROR([You have a signed size_t; that's grossly nonconformant.])
1200 AX_CHECK_SIGN([enum always],
1201 [ AC_DEFINE(ENUM_VALS_ARE_SIGNED, 1, [Define if enum is always signed]) ],
1203 enum always { AAA, BBB, CCC };
1206 AC_CHECK_SIZEOF(socklen_t, , [AC_INCLUDES_DEFAULT()
1207 #ifdef HAVE_SYS_SOCKET_H
1208 #include <sys/socket.h>
1212 # We want to make sure that we _don't_ have a cell_t defined, like IRIX does.
1214 AC_CHECK_SIZEOF(cell_t)
1216 # Now make sure that NULL can be represented as zero bytes.
1217 AC_CACHE_CHECK([whether memset(0) sets pointers to NULL], tor_cv_null_is_zero,
1218 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1219 [[#include <stdlib.h>
1222 #ifdef HAVE_STDDEF_H
1225 int main () { char *p1,*p2; p1=NULL; memset(&p2,0,sizeof(p2));
1226 return memcmp(&p1,&p2,sizeof(char*))?1:0; }]])],
1227 [tor_cv_null_is_zero=yes],
1228 [tor_cv_null_is_zero=no],
1229 [tor_cv_null_is_zero=cross])])
1231 if test "$tor_cv_null_is_zero" = cross ; then
1232 # Cross-compiling; let's hope that the target isn't raving mad.
1233 AC_MSG_NOTICE([Cross-compiling: we'll assume that NULL is represented as a sequence of 0-valued bytes.])
1236 if test "$tor_cv_null_is_zero" != no; then
1237 AC_DEFINE([NULL_REP_IS_ZERO_BYTES], 1,
1238 [Define to 1 iff memset(0) sets pointers to NULL])
1241 AC_CACHE_CHECK([whether memset(0) sets doubles to 0.0], tor_cv_dbl0_is_zero,
1242 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1243 [[#include <stdlib.h>
1246 #ifdef HAVE_STDDEF_H
1249 int main () { double d1,d2; d1=0; memset(&d2,0,sizeof(d2));
1250 return memcmp(&d1,&d2,sizeof(d1))?1:0; }]])],
1251 [tor_cv_dbl0_is_zero=yes],
1252 [tor_cv_dbl0_is_zero=no],
1253 [tor_cv_dbl0_is_zero=cross])])
1255 if test "$tor_cv_dbl0_is_zero" = cross ; then
1256 # Cross-compiling; let's hope that the target isn't raving mad.
1257 AC_MSG_NOTICE([Cross-compiling: we'll assume that 0.0 can be represented as a sequence of 0-valued bytes.])
1260 if test "$tor_cv_dbl0_is_zero" != no; then
1261 AC_DEFINE([DOUBLE_0_REP_IS_ZERO_BYTES], 1,
1262 [Define to 1 iff memset(0) sets doubles to 0.0])
1265 # And what happens when we malloc zero?
1266 AC_CACHE_CHECK([whether we can malloc(0) safely.], tor_cv_malloc_zero_works,
1267 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1268 [[#include <stdlib.h>
1271 #ifdef HAVE_STDDEF_H
1274 int main () { return malloc(0)?0:1; }]])],
1275 [tor_cv_malloc_zero_works=yes],
1276 [tor_cv_malloc_zero_works=no],
1277 [tor_cv_malloc_zero_works=cross])])
1279 if test "$tor_cv_malloc_zero_works" = cross; then
1280 # Cross-compiling; let's hope that the target isn't raving mad.
1281 AC_MSG_NOTICE([Cross-compiling: we'll assume that we need to check malloc() arguments for 0.])
1284 if test "$tor_cv_malloc_zero_works" = yes; then
1285 AC_DEFINE([MALLOC_ZERO_WORKS], 1,
1286 [Define to 1 iff malloc(0) returns a pointer])
1289 # whether we seem to be in a 2s-complement world.
1290 AC_CACHE_CHECK([whether we are using 2s-complement arithmetic], tor_cv_twos_complement,
1291 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1292 [[int main () { int problem = ((-99) != (~99)+1);
1293 return problem ? 1 : 0; }]])],
1294 [tor_cv_twos_complement=yes],
1295 [tor_cv_twos_complement=no],
1296 [tor_cv_twos_complement=cross])])
1298 if test "$tor_cv_twos_complement" = cross ; then
1299 # Cross-compiling; let's hope that the target isn't raving mad.
1300 AC_MSG_NOTICE([Cross-compiling: we'll assume that negative integers are represented with two's complement.])
1303 if test "$tor_cv_twos_complement" != no ; then
1304 AC_DEFINE([USING_TWOS_COMPLEMENT], 1,
1305 [Define to 1 iff we represent negative integers with two's complement])
1308 # What does shifting a negative value do?
1309 AC_CACHE_CHECK([whether right-shift on negative values does sign-extension], tor_cv_sign_extend,
1310 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1311 [[int main () { int okay = (-60 >> 8) == -1; return okay ? 0 : 1; }]])],
1312 [tor_cv_sign_extend=yes],
1313 [tor_cv_sign_extend=no],
1314 [tor_cv_sign_extend=cross])])
1316 if test "$tor_cv_sign_extend" = cross ; then
1317 # Cross-compiling; let's hope that the target isn't raving mad.
1318 AC_MSG_NOTICE([Cross-compiling: we'll assume that right-shifting negative integers causes sign-extension])
1321 if test "$tor_cv_sign_extend" != no ; then
1322 AC_DEFINE([RSHIFT_DOES_SIGN_EXTEND], 1,
1323 [Define to 1 iff right-shifting a negative value performs sign-extension])
1326 # Whether we should use the dmalloc memory allocation debugging library.
1327 AC_MSG_CHECKING(whether to use dmalloc (debug memory allocation library))
1328 AC_ARG_WITH(dmalloc,
1329 [ --with-dmalloc Use debug memory allocation library. ],
1330 [if [[ "$withval" = "yes" ]]; then
1336 fi], [ dmalloc=0; AC_MSG_RESULT(no) ]
1339 if [[ $dmalloc -eq 1 ]]; then
1340 AC_CHECK_HEADERS(dmalloc.h, , AC_MSG_ERROR(dmalloc header file not found. Do you have the development files for dmalloc installed?))
1341 AC_SEARCH_LIBS(dmalloc_malloc, [dmallocth dmalloc], , AC_MSG_ERROR(Libdmalloc library not found. If you enable it you better have it installed.))
1342 AC_DEFINE(USE_DMALLOC, 1, [Debug memory allocation library])
1343 AC_CHECK_FUNCS(dmalloc_strdup dmalloc_strndup)
1346 AC_ARG_WITH(tcmalloc,
1347 [ --with-tcmalloc Use tcmalloc memory allocation library. ],
1348 [ tcmalloc=yes ], [ tcmalloc=no ])
1350 if test x$tcmalloc = xyes ; then
1351 LDFLAGS="-ltcmalloc $LDFLAGS"
1354 using_custom_malloc=no
1355 if test x$enable_openbsd_malloc = xyes ; then
1356 using_custom_malloc=yes
1358 if test x$tcmalloc = xyes ; then
1359 using_custom_malloc=yes
1361 if test $using_custom_malloc = no ; then
1362 AC_CHECK_FUNCS(mallinfo)
1365 # By default, we're going to assume we don't have mlockall()
1366 # bionic and other platforms have various broken mlockall subsystems.
1367 # Some systems don't have a working mlockall, some aren't linkable,
1368 # and some have it but don't declare it.
1369 AC_CHECK_FUNCS(mlockall)
1370 AC_CHECK_DECLS([mlockall], , , [
1371 #ifdef HAVE_SYS_MMAN_H
1372 #include <sys/mman.h>
1375 # Allow user to specify an alternate syslog facility
1376 AC_ARG_WITH(syslog-facility,
1377 [ --with-syslog-facility=LOG syslog facility to use (default=LOG_DAEMON)],
1378 syslog_facility="$withval", syslog_facility="LOG_DAEMON")
1379 AC_DEFINE_UNQUOTED(LOGFACILITY,$syslog_facility,[name of the syslog facility])
1380 AC_SUBST(LOGFACILITY)
1382 # Check if we have getresuid and getresgid
1383 AC_CHECK_FUNCS(getresuid getresgid)
1385 # Check for gethostbyname_r in all its glorious incompatible versions.
1386 # (This logic is based on that in Python's configure.in)
1387 AH_TEMPLATE(HAVE_GETHOSTBYNAME_R,
1388 [Define this if you have any gethostbyname_r()])
1390 AC_CHECK_FUNC(gethostbyname_r, [
1391 AC_MSG_CHECKING([how many arguments gethostbyname_r() wants])
1393 CFLAGS="$CFLAGS $MY_CPPFLAGS $MY_THREAD_CPPFLAGS $MY_CFLAGS"
1394 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
1398 struct hostent *h1, *h2;
1400 (void)gethostbyname_r(cp1,h1,cp2,i1,&h2,&i2);
1402 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1403 AC_DEFINE(HAVE_GETHOSTBYNAME_R_6_ARG, 1,
1404 [Define this if gethostbyname_r takes 6 arguments])
1413 (void)gethostbyname_r(cp1,h1,cp2,i1,&i2);
1415 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1416 AC_DEFINE(HAVE_GETHOSTBYNAME_R_5_ARG, 1,
1417 [Define this if gethostbyname_r takes 5 arguments])
1425 struct hostent_data hd;
1426 (void) gethostbyname_r(cp1,h1,&hd);
1428 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1429 AC_DEFINE(HAVE_GETHOSTBYNAME_R_3_ARG, 1,
1430 [Define this if gethostbyname_r takes 3 arguments])
1440 AC_CACHE_CHECK([whether the C compiler supports __func__],
1441 tor_cv_have_func_macro,
1442 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1444 int main(int c, char **v) { puts(__func__); }])],
1445 tor_cv_have_func_macro=yes,
1446 tor_cv_have_func_macro=no))
1448 AC_CACHE_CHECK([whether the C compiler supports __FUNC__],
1449 tor_cv_have_FUNC_macro,
1450 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1452 int main(int c, char **v) { puts(__FUNC__); }])],
1453 tor_cv_have_FUNC_macro=yes,
1454 tor_cv_have_FUNC_macro=no))
1456 AC_CACHE_CHECK([whether the C compiler supports __FUNCTION__],
1457 tor_cv_have_FUNCTION_macro,
1458 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1460 int main(int c, char **v) { puts(__FUNCTION__); }])],
1461 tor_cv_have_FUNCTION_macro=yes,
1462 tor_cv_have_FUNCTION_macro=no))
1464 AC_CACHE_CHECK([whether we have extern char **environ already declared],
1465 tor_cv_have_environ_declared,
1466 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1467 /* We define _GNU_SOURCE here because it is also defined in compat.c.
1468 * Without it environ doesn't get declared. */
1470 #ifdef HAVE_UNISTD_H
1474 int main(int c, char **v) { char **t = environ; }])],
1475 tor_cv_have_environ_declared=yes,
1476 tor_cv_have_environ_declared=no))
1478 if test "$tor_cv_have_func_macro" = 'yes'; then
1479 AC_DEFINE(HAVE_MACRO__func__, 1, [Defined if the compiler supports __func__])
1482 if test "$tor_cv_have_FUNC_macro" = 'yes'; then
1483 AC_DEFINE(HAVE_MACRO__FUNC__, 1, [Defined if the compiler supports __FUNC__])
1486 if test "$tor_cv_have_FUNCTION_macro" = 'yes'; then
1487 AC_DEFINE(HAVE_MACRO__FUNCTION__, 1,
1488 [Defined if the compiler supports __FUNCTION__])
1491 if test "$tor_cv_have_environ_declared" = 'yes'; then
1492 AC_DEFINE(HAVE_EXTERN_ENVIRON_DECLARED, 1,
1493 [Defined if we have extern char **environ already declared])
1496 # $prefix stores the value of the --prefix command line option, or
1497 # NONE if the option wasn't set. In the case that it wasn't set, make
1498 # it be the default, so that we can use it to expand directories now.
1499 if test "x$prefix" = "xNONE"; then
1500 prefix=$ac_default_prefix
1503 # and similarly for $exec_prefix
1504 if test "x$exec_prefix" = "xNONE"; then
1508 if test "x$BUILDDIR" = "x"; then
1512 AH_TEMPLATE([BUILDDIR],[tor's build directory])
1513 AC_DEFINE_UNQUOTED(BUILDDIR,"$BUILDDIR")
1515 if test "x$CONFDIR" = "x"; then
1516 CONFDIR=`eval echo $sysconfdir/tor`
1519 AH_TEMPLATE([CONFDIR],[tor's configuration directory])
1520 AC_DEFINE_UNQUOTED(CONFDIR,"$CONFDIR")
1522 BINDIR=`eval echo $bindir`
1524 LOCALSTATEDIR=`eval echo $localstatedir`
1525 AC_SUBST(LOCALSTATEDIR)
1527 if test "$bwin32" = true; then
1528 # Test if the linker supports the --nxcompat and --dynamicbase options
1530 save_LDFLAGS="$LDFLAGS"
1531 LDFLAGS="-Wl,--nxcompat -Wl,--dynamicbase"
1532 AC_MSG_CHECKING([whether the linker supports DllCharacteristics])
1533 AC_LINK_IFELSE([AC_LANG_PROGRAM([])],
1534 [AC_MSG_RESULT([yes])]
1535 [save_LDFLAGS="$save_LDFLAGS $LDFLAGS"],
1536 [AC_MSG_RESULT([no])]
1538 LDFLAGS="$save_LDFLAGS"
1541 # Set CFLAGS _after_ all the above checks, since our warnings are stricter
1542 # than autoconf's macros like.
1543 if test "$GCC" = yes; then
1544 # Disable GCC's strict aliasing checks. They are an hours-to-debug
1545 # accident waiting to happen.
1546 CFLAGS="$CFLAGS -Wall -fno-strict-aliasing"
1548 # Override optimization level for non-gcc compilers
1550 enable_gcc_warnings=no
1551 enable_gcc_warnings_advisory=no
1554 # OS X Lion started deprecating the system openssl. Let's just disable
1555 # all deprecation warnings on OS X. Also, to potentially make the binary
1556 # a little smaller, let's enable dead_strip.
1560 CFLAGS="$CFLAGS -Wno-deprecated-declarations"
1561 LDFLAGS="$LDFLAGS -dead_strip" ;;
1564 # Add some more warnings which we use in development but not in the
1565 # released versions. (Some relevant gcc versions can't handle these.)
1566 if test x$enable_gcc_warnings = xyes || test x$enable_gcc_warnings_advisory = xyes; then
1568 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1569 #if !defined(__GNUC__) || (__GNUC__ < 4)
1571 #endif])], have_gcc4=yes, have_gcc4=no)
1573 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1574 #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 2)
1576 #endif])], have_gcc42=yes, have_gcc42=no)
1578 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1579 #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 3)
1581 #endif])], have_gcc43=yes, have_gcc43=no)
1583 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1584 #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 6)
1586 #endif])], have_gcc46=yes, have_gcc46=no)
1589 save_CFLAGS="$CFLAGS"
1590 CFLAGS="$CFLAGS -Wshorten-64-to-32"
1591 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], have_shorten64_flag=yes,
1592 have_shorten64_flag=no)
1593 CFLAGS="$save_CFLAGS"
1596 *-*-openbsd* | *-*-bitrig*)
1597 # Some OpenBSD versions (like 4.8) have -Wsystem-headers by default.
1598 # That's fine, except that the headers don't pass -Wredundant-decls.
1599 # Therefore, let's disable -Wsystem-headers when we're building
1600 # with maximal warnings on OpenBSD.
1601 CFLAGS="$CFLAGS -Wno-system-headers" ;;
1604 CFLAGS="$CFLAGS -W -Wfloat-equal -Wundef -Wpointer-arith"
1605 CFLAGS="$CFLAGS -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings"
1606 CFLAGS="$CFLAGS -Wredundant-decls -Wchar-subscripts -Wcomment -Wformat=2"
1607 CFLAGS="$CFLAGS -Wwrite-strings -Wmissing-declarations -Wredundant-decls"
1608 CFLAGS="$CFLAGS -Wnested-externs -Wbad-function-cast -Wswitch-enum"
1610 if test x$enable_gcc_warnings = xyes; then
1611 CFLAGS="$CFLAGS -Werror"
1614 # Disabled, so we can use mallinfo(): -Waggregate-return
1616 if test x$have_gcc4 = xyes ; then
1617 # These warnings break gcc 3.3.5 and work on gcc 4.0.2
1618 CFLAGS="$CFLAGS -Winit-self -Wmissing-field-initializers -Wold-style-definition"
1621 if test x$have_gcc42 = xyes ; then
1622 # These warnings break gcc 4.0.2 and work on gcc 4.2
1623 # XXXX020 See if any of these work with earlier versions.
1624 CFLAGS="$CFLAGS -Waddress -Wmissing-noreturn -Wstrict-overflow=1"
1626 # We used to use -Wstrict-overflow=5, but that breaks us heavily under 4.3.
1629 if test x$have_gcc42 = xyes && test x$have_clang = xno; then
1630 # These warnings break gcc 4.0.2 and clang, but work on gcc 4.2
1631 CFLAGS="$CFLAGS -Wnormalized=id -Woverride-init"
1634 if test x$have_gcc43 = xyes ; then
1635 # These warnings break gcc 4.2 and work on gcc 4.3
1636 # XXXX020 See if any of these work with earlier versions.
1637 CFLAGS="$CFLAGS -Wextra -Warray-bounds"
1640 if test x$have_gcc46 = xyes ; then
1641 # This warning was added in gcc 4.3, but it appears to generate
1642 # spurious warnings in gcc 4.4. I don't know if it works in 4.5.
1643 CFLAGS="$CFLAGS -Wlogical-op"
1646 if test x$have_shorten64_flag = xyes ; then
1647 CFLAGS="$CFLAGS -Wshorten-64-to-32"
1652 ##This will break the world on some 64-bit architectures
1653 # CFLAGS="$CFLAGS -Winline"
1656 if test "$enable_coverage" = yes && test "$have_clang" = "no"; then
1659 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.])
1663 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent $TOR_CPPFLAGS_openssl $TOR_CPPFLAGS_zlib"
1668 contrib/dist/suse/tor.sh
1669 contrib/operator-tools/tor.logrotate
1672 contrib/dist/tor.service
1673 src/config/torrc.sample
1674 src/config/torrc.minimal
1677 if test x$asciidoc = xtrue && test "$ASCIIDOC" = "none" ; then
1678 regular_mans="doc/tor doc/tor-gencert doc/tor-resolve doc/torify"
1679 for file in $regular_mans ; do
1680 if ! [[ -f "$srcdir/$file.1.in" ]] || ! [[ -f "$srcdir/$file.html.in" ]] ; then
1681 echo "==================================";
1683 echo "Building Tor has failed since manpages cannot be built.";
1685 echo "You need asciidoc installed to be able to build the manpages.";
1686 echo "To build without manpages, use the --disable-asciidoc argument";
1687 echo "when calling configure.";
1689 echo "==================================";
1697 if test -x /usr/bin/perl && test -x ./scripts/maint/updateVersions.pl ; then
1698 ./scripts/maint/updateVersions.pl