fix another confusing whitespace instance
[tor.git] / configure.ac
blob2dd3a1e545648239d3f7b319d779ce1c7d9e008c
1 dnl Copyright (c) 2001-2004, Roger Dingledine
2 dnl Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson
3 dnl Copyright (c) 2007-2013, The Tor Project, Inc.
4 dnl See LICENSE for licensing information
6 AC_INIT([tor],[0.2.5.0-alpha-dev])
7 AC_CONFIG_SRCDIR([src/or/main.c])
8 AC_CONFIG_MACRO_DIR([m4])
9 AM_INIT_AUTOMAKE
10 m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
11 AC_CONFIG_HEADERS([orconfig.h])
13 AC_CANONICAL_HOST
15 if test -f /etc/redhat-release ; then
16   if test -f /usr/kerberos/include ; then
17     CPPFLAGS="$CPPFLAGS -I/usr/kerberos/include"
18   fi
21 # Not a no-op; we want to make sure that CPPFLAGS is set before we use
22 # the += operator on it in src/or/Makefile.am
23 CPPFLAGS="$CPPFLAGS -I\${top_srcdir}/src/common"
25 #XXXX020 We should make these enabled or not, before 0.2.0.x-final
26 AC_ARG_ENABLE(buf-freelists,
27    AS_HELP_STRING(--disable-buf-freelists, disable freelists for buffer RAM))
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(curve25519,
41    AS_HELP_STRING(--disable-curve25519, Build Tor with no curve25519 elliptic-curve crypto support))
42 AC_ARG_ENABLE(unittests,
43    AS_HELP_STRING(--disable-unittests, [Don't build unit tests for Tor. Risky!]))
44 AC_ARG_ENABLE(coverage,
45    AS_HELP_STRING(--enable-coverage, [Enable coverage support in the unit-test build]))
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 x$enable_buf_freelists != xno; then
58   AC_DEFINE(ENABLE_BUF_FREELISTS, 1,
59             [Defined if we try to use freelists for buffer RAM chunks])
61 AM_CONDITIONAL(USE_OPENBSD_MALLOC, test x$enable_openbsd_malloc = xyes)
62 if test x$enable_instrument_downloads = xyes; then
63   AC_DEFINE(INSTRUMENT_DOWNLOADS, 1,
64             [Defined if we want to keep track of how much of each kind of resource we download.])
67 AC_ARG_ENABLE(transparent,
68      AS_HELP_STRING(--disable-transparent, disable transparent proxy support),
69      [case "${enableval}" in
70         yes) transparent=true ;;
71         no)  transparent=false ;;
72         *) AC_MSG_ERROR(bad value for --enable-transparent) ;;
73       esac], [transparent=true])
75 AC_ARG_ENABLE(asciidoc,
76      AS_HELP_STRING(--disable-asciidoc, don't use asciidoc (disables building of manpages)),
77      [case "${enableval}" in
78         yes) asciidoc=true ;;
79         no)  asciidoc=false ;;
80         *) AC_MSG_ERROR(bad value for --disable-asciidoc) ;;
81       esac], [asciidoc=true])
83 # By default, we're not ready to ship a NAT-PMP aware Tor
84 AC_ARG_ENABLE(nat-pmp,
85      AS_HELP_STRING(--enable-nat-pmp, enable NAT-PMP support),
86      [case "${enableval}" in
87         yes) natpmp=true ;;
88         no)  natpmp=false ;;
89         * ) AC_MSG_ERROR(bad value for --enable-nat-pmp) ;;
90       esac], [natpmp=false])
92 # By default, we're not ready to ship a UPnP aware Tor
93 AC_ARG_ENABLE(upnp,
94      AS_HELP_STRING(--enable-upnp, enable UPnP support),
95      [case "${enableval}" in
96         yes) upnp=true ;;
97         no)  upnp=false ;;
98         * ) AC_MSG_ERROR(bad value for --enable-upnp) ;;
99       esac], [upnp=false])
102 AC_ARG_ENABLE(threads,
103      AS_HELP_STRING(--disable-threads, disable multi-threading support))
105 if test x$enable_threads = x; then
106    case $host in
107     *-*-solaris* )
108      # Don't try multithreading on solaris -- cpuworkers seem to lock.
109      AC_MSG_NOTICE([You are running Solaris; Sometimes threading makes
110 cpu workers lock up here, so I will disable threads.])
111      enable_threads="no";;
112     *)
113      enable_threads="yes";;
114    esac
117 if test "$enable_threads" = "yes"; then
118   AC_DEFINE(ENABLE_THREADS, 1, [Defined if we will try to use multithreading])
121 case $host in
122    *-*-solaris* )
123      AC_DEFINE(_REENTRANT, 1, [Define on some platforms to activate x_r() functions in time.h])
124      ;;
125 esac
127 AC_ARG_ENABLE(gcc-warnings,
128      AS_HELP_STRING(--enable-gcc-warnings, enable verbose warnings))
129 AC_ARG_ENABLE(gcc-warnings-advisory,
130      AS_HELP_STRING(--enable-gcc-warnings-advisory, [enable verbose warnings, excluding -Werror]))
132 dnl Adam shostack suggests the following for Windows:
133 dnl -D_FORTIFY_SOURCE=2 -fstack-protector-all
134 dnl Others suggest '/gs /safeseh /nxcompat /dynamicbase' for non-gcc on Windows
135 dnl This requires that we use gcc and that we add -O2 to the CFLAGS.
136 AC_ARG_ENABLE(gcc-hardening,
137     AS_HELP_STRING(--disable-gcc-hardening, disable compiler security checks))
139 dnl Linker hardening options
140 dnl Currently these options are ELF specific - you can't use this with MacOSX
141 AC_ARG_ENABLE(linker-hardening,
142     AS_HELP_STRING(--disable-linker-hardening, disable linker security fixups))
144 AC_ARG_ENABLE(local-appdata,
145    AS_HELP_STRING(--enable-local-appdata, default to host local application data paths on Windows))
146 if test "$enable_local_appdata" = "yes"; then
147   AC_DEFINE(ENABLE_LOCAL_APPDATA, 1,
148             [Defined if we default to host local appdata paths on Windows])
151 # Tor2web mode flag
152 AC_ARG_ENABLE(tor2web-mode,
153      AS_HELP_STRING(--enable-tor2web-mode, support tor2web non-anonymous mode),
154 [if test x$enableval = xyes; then
155     CFLAGS="$CFLAGS -D ENABLE_TOR2WEB_MODE=1"
156 fi])
158 AC_ARG_ENABLE(bufferevents,
159      AS_HELP_STRING(--enable-bufferevents, use Libevent's buffered IO.))
161 dnl check for the correct "ar" when cross-compiling
162 AN_MAKEVAR([AR], [AC_PROG_AR])
163 AN_PROGRAM([ar], [AC_PROG_AR])
164 AC_DEFUN([AC_PROG_AR], [AC_CHECK_TOOL([AR], [ar], [ar])])
165 AC_PROG_AR
167 AC_PROG_CC
168 AC_PROG_CPP
169 AC_PROG_MAKE_SET
170 AC_PROG_RANLIB
172 dnl autoconf 2.59 appears not to support AC_PROG_SED
173 AC_CHECK_PROG([SED],[sed],[sed],[/bin/false])
175 dnl check for asciidoc and a2x
176 AC_PATH_PROG([ASCIIDOC], [asciidoc], none)
177 AC_PATH_PROG([A2X], [a2x], none)
179 AM_CONDITIONAL(USE_ASCIIDOC, test x$asciidoc = xtrue)
181 AM_CONDITIONAL(USE_FW_HELPER, test x$natpmp = xtrue || test x$upnp = xtrue)
182 AM_CONDITIONAL(NAT_PMP, test x$natpmp = xtrue)
183 AM_CONDITIONAL(MINIUPNPC, test x$upnp = xtrue)
184 AM_PROG_CC_C_O
186 ifdef([AC_C_FLEXIBLE_ARRAY_MEMBER], [
187 AC_C_FLEXIBLE_ARRAY_MEMBER
188 ], [
189  dnl Maybe we've got an old autoconf...
190  AC_CACHE_CHECK([for flexible array members],
191      tor_cv_c_flexarray,
192      [AC_COMPILE_IFELSE(
193        AC_LANG_PROGRAM([
194  struct abc { int a; char b[]; };
195 ], [
196  struct abc *def = malloc(sizeof(struct abc)+sizeof(char));
197  def->b[0] = 33;
199   [tor_cv_c_flexarray=yes],
200   [tor_cv_c_flexarray=no])])
201  if test $tor_cv_flexarray = yes ; then
202    AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [], [Define to nothing if C supports flexible array members, and to 1 if it does not.])
203  else
204    AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [1], [Define to nothing if C supports flexible array members, and to 1 if it does not.])
205  fi
208 AC_PATH_PROG([SHA1SUM], [sha1sum], none)
209 AC_PATH_PROG([OPENSSL], [openssl], none)
211 TORUSER=_tor
212 AC_ARG_WITH(tor-user,
213         [  --with-tor-user=NAME    Specify username for tor daemon ],
214         [
215            TORUSER=$withval
216         ]
218 AC_SUBST(TORUSER)
220 TORGROUP=_tor
221 AC_ARG_WITH(tor-group,
222         [  --with-tor-group=NAME   Specify group name for tor daemon ],
223         [
224            TORGROUP=$withval
225         ]
227 AC_SUBST(TORGROUP)
230 dnl If _WIN32 is defined and non-zero, we are building for win32
231 AC_MSG_CHECKING([for win32])
232 AC_RUN_IFELSE([AC_LANG_SOURCE([
233 int main(int c, char **v) {
234 #ifdef _WIN32
235 #if _WIN32
236   return 0;
237 #else
238   return 1;
239 #endif
240 #else
241   return 2;
242 #endif
243 }])],
244 bwin32=true; AC_MSG_RESULT([yes]),
245 bwin32=false; AC_MSG_RESULT([no]),
246 bwin32=cross; AC_MSG_RESULT([cross])
249 if test "$bwin32" = cross; then
250 AC_MSG_CHECKING([for win32 (cross)])
251 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
252 #ifdef _WIN32
253 int main(int c, char **v) {return 0;}
254 #else
255 #error
256 int main(int c, char **v) {return x(y);}
257 #endif
258 ])],
259 bwin32=true; AC_MSG_RESULT([yes]),
260 bwin32=false; AC_MSG_RESULT([no]))
263 AM_CONDITIONAL(BUILD_NT_SERVICES, test x$bwin32 = xtrue)
265 dnl Enable C99 when compiling with MIPSpro
266 AC_MSG_CHECKING([for MIPSpro compiler])
267 AC_COMPILE_IFELSE([AC_LANG_PROGRAM(, [
268 #if (defined(__sgi) && defined(_COMPILER_VERSION))
269 #error
270   return x(y);
271 #endif
272 ])],
273 bmipspro=false; AC_MSG_RESULT(no),
274 bmipspro=true; AC_MSG_RESULT(yes))
276 if test "$bmipspro" = true; then
277   CFLAGS="$CFLAGS -c99"
280 AC_C_BIGENDIAN
282 AC_SEARCH_LIBS(socket, [socket network])
283 AC_SEARCH_LIBS(gethostbyname, [nsl])
284 AC_SEARCH_LIBS(dlopen, [dl])
285 AC_SEARCH_LIBS(inet_aton, [resolv])
286 saved_LIBS="$LIBS"
287 AC_SEARCH_LIBS([clock_gettime], [rt])
288 if test "$LIBS" != "$saved_LIBS"; then
289    # Looks like we need -lrt for clock_gettime().
290    have_rt=yes
293 if test "$enable_threads" = "yes"; then
294   AC_SEARCH_LIBS(pthread_create, [pthread])
295   AC_SEARCH_LIBS(pthread_detach, [pthread])
298 dnl -------------------------------------------------------------------
299 dnl Check for functions before libevent, since libevent-1.2 apparently
300 dnl exports strlcpy without defining it in a header.
302 AC_CHECK_FUNCS(
303         _NSGetEnviron \
304         accept4 \
305         clock_gettime \
306         flock \
307         ftime \
308         getaddrinfo \
309         getifaddrs \
310         getrlimit \
311         gettimeofday \
312         gmtime_r \
313         inet_aton \
314         ioctl \
315         issetugid \
316         llround \
317         localtime_r \
318         lround \
319         memmem \
320         prctl \
321         rint \
322         socketpair \
323         strlcat \
324         strlcpy \
325         strptime \
326         strtok_r \
327         strtoull \
328         sysconf \
329         uname \
330         vasprintf \
331         _vscprintf
334 if test "$enable_threads" = "yes"; then
335   AC_CHECK_HEADERS(pthread.h)
336   AC_CHECK_FUNCS(pthread_create)
339 dnl ------------------------------------------------------
340 dnl Where do you live, libevent?  And how do we call you?
342 if test "$bwin32" = true; then
343   TOR_LIB_WS32=-lws2_32
344   TOR_LIB_IPHLPAPI=-liphlpapi
345   # Some of the cargo-cults recommend -lwsock32 as well, but I don't
346   # think it's actually necessary.
347   TOR_LIB_GDI=-lgdi32
348 else
349   TOR_LIB_WS32=
350   TOR_LIB_GDI=
352 AC_SUBST(TOR_LIB_WS32)
353 AC_SUBST(TOR_LIB_GDI)
354 AC_SUBST(TOR_LIB_IPHLPAPI)
356 dnl We need to do this before we try our disgusting hack below.
357 AC_CHECK_HEADERS([sys/types.h])
359 dnl This is a disgusting hack so we safely include older libevent headers.
360 AC_CHECK_TYPE(u_int64_t, unsigned long long)
361 AC_CHECK_TYPE(u_int32_t, unsigned long)
362 AC_CHECK_TYPE(u_int16_t, unsigned short)
363 AC_CHECK_TYPE(u_int8_t, unsigned char)
365 tor_libevent_pkg_redhat="libevent"
366 tor_libevent_pkg_debian="libevent-dev"
367 tor_libevent_devpkg_redhat="libevent-devel"
368 tor_libevent_devpkg_debian="libevent-dev"
370 dnl On Gnu/Linux or any place we require it, we'll add librt to the Libevent
371 dnl linking for static builds.
372 STATIC_LIBEVENT_FLAGS=""
373 if test "$enable_static_libevent" = "yes"; then
374     if test "$have_rt" = yes; then
375       STATIC_LIBEVENT_FLAGS=" -lrt "
376     fi
379 TOR_SEARCH_LIBRARY(libevent, $trylibeventdir, [-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32], [
380 #ifdef _WIN32
381 #include <winsock2.h>
382 #endif
383 #include <stdlib.h>
384 #include <sys/time.h>
385 #include <sys/types.h>
386 #include <event.h>], [
387 #ifdef _WIN32
388 #include <winsock2.h>
389 #endif
390 void exit(int); void *event_init(void);],
391     [
392 #ifdef _WIN32
393 {WSADATA d; WSAStartup(0x101,&d); }
394 #endif
395 event_init(); exit(0);
396 ], [--with-libevent-dir], [/opt/libevent])
398 dnl Now check for particular libevent functions.
399 save_LIBS="$LIBS"
400 save_LDFLAGS="$LDFLAGS"
401 save_CPPFLAGS="$CPPFLAGS"
402 LIBS="-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32 $LIBS"
403 LDFLAGS="$TOR_LDFLAGS_libevent $LDFLAGS"
404 CPPFLAGS="$TOR_CPPFLAGS_libevent $CPPFLAGS"
405 AC_CHECK_FUNCS([event_get_version \
406                 event_get_version_number \
407                 event_get_method \
408                 event_set_log_callback \
409                 evdns_set_outgoing_bind_address \
410                 evutil_secure_rng_set_urandom_device_file \
411                 event_base_loopexit])
412 AC_CHECK_MEMBERS([struct event.min_heap_idx], , ,
413 [#include <event.h>
416 AC_CHECK_HEADERS(event2/event.h event2/dns.h event2/bufferevent_ssl.h)
418 LIBS="$save_LIBS"
419 LDFLAGS="$save_LDFLAGS"
420 CPPFLAGS="$save_CPPFLAGS"
423 AM_CONDITIONAL(USE_EXTERNAL_EVDNS, test x$ac_cv_header_event2_dns_h = xyes)
425 if test "$enable_static_libevent" = "yes"; then
426    if test "$tor_cv_library_libevent_dir" = "(system)"; then
427      AC_MSG_ERROR("You must specify an explicit --with-libevent-dir=x option when using --enable-static-libevent")
428    else
429      TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent.a $STATIC_LIBEVENT_FLAGS"
430    fi
431 else
432      TOR_LIBEVENT_LIBS="-levent"
435 dnl This isn't the best test for Libevent 2.0.3-alpha.  Once it's released,
436 dnl we can do much better.
437 if test "$enable_bufferevents" = "yes" ; then
438   if test "$ac_cv_header_event2_bufferevent_ssl_h" != "yes" ; then
439     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.])
440   else
442     CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent"
444     # Check for the right version.  First see if version detection works.
445     AC_MSG_CHECKING([whether we can detect the Libevent version])
446     AC_COMPILE_IFELSE([AC_LANG_SOURCE([
447 #include <event2/event.h>
448 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 10
449 #error
450 int x = y(zz);
451 #else
452 int x = 1;
453 #endif
454   ])], [event_version_number_works=yes; AC_MSG_RESULT([yes]) ],
455      [event_version_number_works=no;  AC_MSG_RESULT([no])])
456     if test "$event_version_number_works" != 'yes'; then
457       AC_MSG_WARN([Version detection on Libevent seems broken.  Your Libevent installation is probably screwed up or very old.])
458     else
459       AC_MSG_CHECKING([whether Libevent is new enough for bufferevents])
460       AC_COMPILE_IFELSE([AC_LANG_SOURCE([
461 #include <event2/event.h>
462 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 0x02000d00
463 #error
464 int x = y(zz);
465 #else
466 int x = 1;
467 #endif
468    ])], [ AC_MSG_RESULT([yes]) ],
469       [ AC_MSG_RESULT([no])
470         AC_MSG_ERROR([Libevent does not seem new enough to support bufferevents.  We require 2.0.13-stable or later]) ] )
471     fi
472   fi
475 LIBS="$save_LIBS"
476 LDFLAGS="$save_LDFLAGS"
477 CPPFLAGS="$save_CPPFLAGS"
479 AM_CONDITIONAL(USE_BUFFEREVENTS, test "$enable_bufferevents" = "yes")
480 if test "$enable_bufferevents" = "yes"; then
481   AC_DEFINE(USE_BUFFEREVENTS, 1, [Defined if we're going to use Libevent's buffered IO API])
482   if test "$enable_static_libevent" = "yes"; then
483     TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent_openssl.a $TOR_LIBEVENT_LIBS"
484   else
485     TOR_LIBEVENT_LIBS="-levent_openssl $TOR_LIBEVENT_LIBS"
486   fi
488 AC_SUBST(TOR_LIBEVENT_LIBS)
490 dnl ------------------------------------------------------
491 dnl Where do you live, libm?
493 dnl On some platforms (Haiku/BeOS) the math library is
494 dnl part of libroot. In which case don't link against lm
495 TOR_LIB_MATH=""
496 save_LIBS="$LIBS"
497 AC_SEARCH_LIBS(pow, [m], , AC_MSG_ERROR([Could not find pow in libm or libc.]))
498 if test "$ac_cv_search_pow" != "none required"; then
499     TOR_LIB_MATH="$ac_cv_search_pow"
501 LIBS="$save_LIBS"
502 AC_SUBST(TOR_LIB_MATH)
504 dnl ------------------------------------------------------
505 dnl Where do you live, openssl?  And how do we call you?
507 tor_openssl_pkg_redhat="openssl"
508 tor_openssl_pkg_debian="libssl-dev"
509 tor_openssl_devpkg_redhat="openssl-devel"
510 tor_openssl_devpkg_debian="libssl-dev"
512 ALT_openssl_WITHVAL=""
513 AC_ARG_WITH(ssl-dir,
514   [  --with-ssl-dir=PATH    Obsolete alias for --with-openssl-dir ],
515   [
516       if test "x$withval" != xno && test "x$withval" != "x" ; then
517          ALT_openssl_WITHVAL="$withval"
518       fi
519   ])
521 TOR_SEARCH_LIBRARY(openssl, $tryssldir, [-lssl -lcrypto $TOR_LIB_GDI],
522     [#include <openssl/rand.h>],
523     [void RAND_add(const void *buf, int num, double entropy);],
524     [RAND_add((void*)0,0,0); exit(0);], [],
525     [/usr/local/openssl /usr/lib/openssl /usr/local/ssl /usr/lib/ssl /usr/local /usr/athena /opt/openssl])
527 dnl XXXX check for OPENSSL_VERSION_NUMBER == SSLeay()
529 if test "$enable_static_openssl" = "yes"; then
530    if test "$tor_cv_library_openssl_dir" = "(system)"; then
531      AC_MSG_ERROR("You must specify an explicit --with-openssl-dir=x option when using --enable-static-openssl")
532    else
533      TOR_OPENSSL_LIBS="$TOR_LIBDIR_openssl/libssl.a $TOR_LIBDIR_openssl/libcrypto.a"
534    fi
535 else
536      TOR_OPENSSL_LIBS="-lssl -lcrypto"
538 AC_SUBST(TOR_OPENSSL_LIBS)
540 dnl ------------------------------------------------------
541 dnl Where do you live, zlib?  And how do we call you?
543 tor_zlib_pkg_redhat="zlib"
544 tor_zlib_pkg_debian="zlib1g"
545 tor_zlib_devpkg_redhat="zlib-devel"
546 tor_zlib_devpkg_debian="zlib1g-dev"
548 TOR_SEARCH_LIBRARY(zlib, $tryzlibdir, [-lz],
549     [#include <zlib.h>],
550     [const char * zlibVersion(void);],
551     [zlibVersion(); exit(0);], [--with-zlib-dir],
552     [/opt/zlib])
554 if test "$enable_static_zlib" = "yes"; then
555    if test "$tor_cv_library_zlib_dir" = "(system)"; then
556      AC_MSG_ERROR("You must specify an explicit --with-zlib-dir=x option when
557  using --enable-static-zlib")
558    else
559      TOR_ZLIB_LIBS="$TOR_LIBDIR_zlib/libz.a"
560    fi
561 else
562      TOR_ZLIB_LIBS="-lz"
564 AC_SUBST(TOR_ZLIB_LIBS)
566 dnl ---------------------------------------------------------------------
567 dnl Now that we know about our major libraries, we can check for compiler
568 dnl and linker hardening options.  We need to do this with the libraries known,
569 dnl since sometimes the linker will like an option but not be willing to
570 dnl use it with a build of a library.
572 all_ldflags_for_check="$TOR_LDFLAGS_zlib $TOR_LDFLAGS_openssl $TOR_LDFLAGS_libevent"
573 all_libs_for_check="$TOR_ZLIB_LIBS $TOR_LIB_MATH $TOR_LIBEVENT_LIBS $TOR_OPENSSL_LIBS $TOR_LIB_WS32 $TOR_LIB_GDI"
575 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
576 #if !defined(__clang__)
577 #error
578 #endif])], have_clang=yes, have_clang=no)
580 if test x$enable_gcc_hardening != xno; then
581     CFLAGS="$CFLAGS -D_FORTIFY_SOURCE=2"
582     if test x$have_clang = xyes; then
583         TOR_CHECK_CFLAGS(-Qunused-arguments)
584     fi
585     TOR_CHECK_CFLAGS(-fstack-protector-all)
586     TOR_CHECK_CFLAGS(-Wstack-protector)
587     TOR_CHECK_CFLAGS(-fwrapv)
588     TOR_CHECK_CFLAGS(--param ssp-buffer-size=1)
589     if test "$bwin32" = "false"; then
590        TOR_CHECK_CFLAGS(-fPIE)
591        TOR_CHECK_LDFLAGS(-pie, "$all_ldflags_for_check", "$all_libs_for_check")
592     fi
595 if test x$enable_linker_hardening != xno; then
596     TOR_CHECK_LDFLAGS(-z relro -z now, "$all_ldflags_for_check", "$all_libs_for_check")
599 dnl ------------------------------------------------------
600 dnl Now see if we have a -fomit-frame-pointer compiler option.
602 saved_CFLAGS="$CFLAGS"
603 TOR_CHECK_CFLAGS(-fomit-frame-pointer)
604 if test "$saved_CFLAGS" != "$CFLAGS"; then
605   F_OMIT_FRAME_POINTER='-fomit-frame-pointer'
606 else
607   F_OMIT_FRAME_POINTER=''
609 CFLAGS="$saved_CFLAGS"
610 AC_SUBST(F_OMIT_FRAME_POINTER)
612 dnl ------------------------------------------------------
613 dnl Where do you live, libnatpmp?  And how do we call you?
614 dnl There are no packages for Debian or Redhat as of this patch
616 if test "$natpmp" = "true"; then
617     AC_DEFINE(NAT_PMP, 1, [Define to 1 if we are building with nat-pmp.])
618     TOR_SEARCH_LIBRARY(libnatpmp, $trylibnatpmpdir, [-lnatpmp $TOR_LIB_WS32 $TOR_LIB_IPHLPAPI],
619         [#include <natpmp.h>],
620         [#ifdef _WIN32
621          #define STATICLIB
622          #endif
623          #include <natpmp.h>],
624         [   int r;
625             natpmp_t natpmp;
626             natpmpresp_t response;
627             r = initnatpmp(&natpmp, 0, 0);],
628             [printf("initnatpmp() returned %d (%s)\n", r, r?"FAILED":"SUCCESS");
629             exit(0);],
630         [--with-libnatpmp-dir],
631         [/usr/lib/])
635 dnl ------------------------------------------------------
636 dnl Where do you live, libminiupnpc?  And how do we call you?
637 dnl There are no packages for Debian or Redhat as of this patch
639 if test "$upnp" = "true"; then
640     AC_DEFINE(MINIUPNPC, 1, [Define to 1 if we are building with UPnP.])
642     dnl Before we call TOR_SEARCH_LIBRARY we'll do a quick compile test
643     dnl to see if we have miniupnpc-1.5 or -1.6
644     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include <miniupnpc/miniupnpc.h>],
645         [upnpDiscover(1, 0, 0, 0);exit(0);])],[miniupnpc15="true"],[miniupnpc15="false"])
647     if test "$miniupnpc15" = "true" ; then
648         AC_DEFINE([MINIUPNPC15],[1],[libminiupnpc version 1.5 found])
649         TOR_SEARCH_LIBRARY(libminiupnpc, $trylibminiupnpcdir, [-lminiupnpc $TOR_LIB_WS32 $TOR_LIB_IPHLPAPI],
650             [#include <miniupnpc/miniwget.h>
651              #include <miniupnpc/miniupnpc.h>
652              #include <miniupnpc/upnpcommands.h>],
653             [void upnpDiscover(int delay, const char * multicastif,
654              const char * minissdpdsock, int sameport);],
655             [upnpDiscover(1, 0, 0, 0); exit(0);],
656             [--with-libminiupnpc-dir],
657             [/usr/lib/])
658     else
659         TOR_SEARCH_LIBRARY(libminiupnpc, $trylibminiupnpcdir, [-lminiupnpc $TOR_LIB_WS32 $TOR_LIB_IPHLPAPI],
660             [#include <miniupnpc/miniwget.h>
661              #include <miniupnpc/miniupnpc.h>
662              #include <miniupnpc/upnpcommands.h>],
663             [void upnpDiscover(int delay, const char * multicastif,
664              const char * minissdpdsock, int sameport, int ipv6, int * error);],
665             [upnpDiscover(1, 0, 0, 0, 0, 0); exit(0);],
666             [--with-libminiupnpc-dir],
667             [/usr/lib/])
668     fi
671 dnl ============================================================
672 dnl Check for libseccomp
674 AC_CHECK_HEADERS([seccomp.h])
675 AC_SEARCH_LIBS(seccomp_init, [seccomp])
677 dnl ============================================================
678 dnl We need an implementation of curve25519.
680 dnl set these defaults.
681 have_a_curve25519=no
682 build_curve25519_donna=no
683 build_curve25519_donna_c64=no
684 use_curve25519_donna=no
685 use_curve25519_nacl=no
686 CURVE25519_LIBS=
688 if test x$enable_curve25519 != xno; then
690   dnl The best choice is using curve25519-donna-c64, but that requires
691   dnl that we
692   AC_CACHE_CHECK([whether we can use curve25519-donna-c64],
693     tor_cv_can_use_curve25519_donna_c64,
694     [AC_RUN_IFELSE(
695       [AC_LANG_PROGRAM([dnl
696         #include <stdint.h>
697         typedef unsigned uint128_t __attribute__((mode(TI)));
698         int func(uint64_t a, uint64_t b) {
699              uint128_t c = ((uint128_t)a) * b;
700              int ok = ((uint64_t)(c>>96)) == 522859 &&
701                    (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
702                    (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
703                    (((uint64_t)(c))&0xffffffffL) == 0;
704              return ok;
705         }
706         ], [dnl
707           int ok = func( ((uint64_t)2000000000) * 1000000000,
708                          ((uint64_t)1234567890) << 24);
709           return !ok;
710         ])],
711         [tor_cv_can_use_curve25519_donna_c64=yes],
712         [tor_cv_can_use_curve25519_donna_c64=no],
713         [AC_COMPILE_IFELSE(
714           [AC_LANG_PROGRAM([dnl
715         #include <stdint.h>
716         typedef unsigned uint128_t __attribute__((mode(TI)));
717         int func(uint64_t a, uint64_t b) {
718              uint128_t c = ((uint128_t)a) * b;
719              int ok = ((uint64_t)(c>>96)) == 522859 &&
720                    (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
721                    (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
722                    (((uint64_t)(c))&0xffffffffL) == 0;
723              return ok;
724         }
725         ], [dnl
726           int ok = func( ((uint64_t)2000000000) * 1000000000,
727                          ((uint64_t)1234567890) << 24);
728           return !ok;
729         ])],
730             [tor_cv_can_use_curve25519_donna_c64=cross],
731             [tor_cv_can_use_curve25519_donna_c64=no])])])
733   AC_CHECK_HEADERS([crypto_scalarmult_curve25519.h \
734                     nacl/crypto_scalarmult_curve25519.h])
736   AC_CACHE_CHECK([for nacl compiled with a fast curve25519 implementation],
737     tor_cv_can_use_curve25519_nacl,
738     [tor_saved_LIBS="$LIBS"
739      LIBS="$LIBS -lnacl"
740      AC_LINK_IFELSE(
741        [AC_LANG_PROGRAM([dnl
742          #ifdef HAVE_CRYPTO_SCALARMULT_CURVE25519_H
743          #include <crypto_scalarmult_curve25519.h>
744          #elif defined(HAVE_NACL_CRYPTO_SCALARMULT_CURVE25519_H)
745          #include <nacl/crypto_scalarmult_curve25519.h>
746          #endif
747          #ifdef crypto_scalarmult_curve25519_ref_BYTES
748          #error Hey, this is the reference implementation! That's not fast.
749          #endif
750        ], [
751          unsigned char *a, *b, *c; crypto_scalarmult_curve25519(a,b,c);
752        ])], [tor_cv_can_use_curve25519_nacl=yes],
753        [tor_cv_can_use_curve25519_nacl=no])
754      LIBS="$tor_saved_LIBS" ])
756    dnl Okay, now we need to figure out which one to actually use. Fall back
757    dnl to curve25519-donna.c
759    if test x$tor_cv_can_use_curve25519_donna_c64 != xno; then
760      build_curve25519_donna_c64=yes
761      use_curve25519_donna=yes
762    elif test x$tor_cv_can_use_curve25519_nacl = xyes; then
763      use_curve25519_nacl=yes
764      CURVE25519_LIBS=-lnacl
765    else
766      build_curve25519_donna=yes
767      use_curve25519_donna=yes
768    fi
769    have_a_curve25519=yes
772 if test x$have_a_curve25519 = xyes; then
773   AC_DEFINE(CURVE25519_ENABLED, 1,
774             [Defined if we have a curve25519 implementation])
776 if test x$use_curve25519_donna = xyes; then
777   AC_DEFINE(USE_CURVE25519_DONNA, 1,
778             [Defined if we should use an internal curve25519_donna{,_c64} implementation])
780 if test x$use_curve25519_nacl = xyes; then
781   AC_DEFINE(USE_CURVE25519_NACL, 1,
782             [Defined if we should use a curve25519 from nacl])
784 AM_CONDITIONAL(BUILD_CURVE25519_DONNA, test x$build_curve25519_donna = xyes)
785 AM_CONDITIONAL(BUILD_CURVE25519_DONNA_C64, test x$build_curve25519_donna_c64 = xyes)
786 AM_CONDITIONAL(CURVE25519_ENABLED, test x$have_a_curve25519 = xyes)
787 AC_SUBST(CURVE25519_LIBS)
789 dnl Make sure to enable support for large off_t if available.
790 AC_SYS_LARGEFILE
792 AC_CHECK_HEADERS(
793         assert.h \
794         errno.h \
795         fcntl.h \
796         signal.h \
797         string.h \
798         sys/fcntl.h \
799         sys/stat.h \
800         sys/time.h \
801         sys/types.h \
802         time.h \
803         unistd.h
804  , , 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.))
806 dnl These headers are not essential
808 AC_CHECK_HEADERS(
809         arpa/inet.h \
810         crt_externs.h \
811         grp.h \
812         ifaddrs.h \
813         inttypes.h \
814         limits.h \
815         linux/types.h \
816         machine/limits.h \
817         malloc.h \
818         malloc/malloc.h \
819         malloc_np.h \
820         netdb.h \
821         netinet/in.h \
822         netinet/in6.h \
823         pwd.h \
824         stdint.h \
825         sys/file.h \
826         sys/ioctl.h \
827         sys/limits.h \
828         sys/mman.h \
829         sys/param.h \
830         sys/prctl.h \
831         sys/resource.h \
832         sys/socket.h \
833         sys/syslimits.h \
834         sys/time.h \
835         sys/types.h \
836         sys/un.h \
837         sys/utime.h \
838         sys/wait.h \
839         syslog.h \
840         utime.h
843 AC_CHECK_HEADERS(sys/param.h)
845 AC_CHECK_HEADERS(net/if.h, net_if_found=1, net_if_found=0,
846 [#ifdef HAVE_SYS_TYPES_H
847 #include <sys/types.h>
848 #endif
849 #ifdef HAVE_SYS_SOCKET_H
850 #include <sys/socket.h>
851 #endif])
852 AC_CHECK_HEADERS(net/pfvar.h, net_pfvar_found=1, net_pfvar_found=0,
853 [#ifdef HAVE_SYS_TYPES_H
854 #include <sys/types.h>
855 #endif
856 #ifdef HAVE_SYS_SOCKET_H
857 #include <sys/socket.h>
858 #endif
859 #ifdef HAVE_NET_IF_H
860 #include <net/if.h>
861 #endif])
862 AC_CHECK_HEADERS(linux/netfilter_ipv4.h,
863         linux_netfilter_ipv4=1, linux_netfilter_ipv4=0,
864 [#ifdef HAVE_SYS_TYPES_H
865 #include <sys/types.h>
866 #endif
867 #ifdef HAVE_SYS_SOCKET_H
868 #include <sys/socket.h>
869 #endif
870 #ifdef HAVE_LIMITS_H
871 #include <limits.h>
872 #endif
873 #ifdef HAVE_LINUX_TYPES_H
874 #include <linux/types.h>
875 #endif
876 #ifdef HAVE_NETINET_IN6_H
877 #include <netinet/in6.h>
878 #endif
879 #ifdef HAVE_NETINET_IN_H
880 #include <netinet/in.h>
881 #endif])
883 if test x$transparent = xtrue ; then
884    transparent_ok=0
885    if test x$net_if_found = x1 && test x$net_pfvar_found = x1 ; then
886      transparent_ok=1
887    fi
888    if test x$linux_netfilter_ipv4 = x1 ; then
889      transparent_ok=1
890    fi
891    if test x$transparent_ok = x1 ; then
892      AC_DEFINE(USE_TRANSPARENT, 1, "Define to enable transparent proxy support")
893      case $host in
894        *-*-openbsd* | *-*-bitrig*)
895          AC_DEFINE(OPENBSD, 1, "Define to handle pf on OpenBSD properly") ;;
896      esac
897    else
898      AC_MSG_NOTICE([Transparent proxy support enabled, but missing headers.])
899    fi
902 AC_CHECK_MEMBERS([struct timeval.tv_sec], , ,
903 [#ifdef HAVE_SYS_TYPES_H
904 #include <sys/types.h>
905 #endif
906 #ifdef HAVE_SYS_TIME_H
907 #include <sys/time.h>
908 #endif])
910 dnl In case we aren't given a working stdint.h, we'll need to grow our own.
911 dnl Watch out.
913 AC_CHECK_SIZEOF(int8_t)
914 AC_CHECK_SIZEOF(int16_t)
915 AC_CHECK_SIZEOF(int32_t)
916 AC_CHECK_SIZEOF(int64_t)
917 AC_CHECK_SIZEOF(uint8_t)
918 AC_CHECK_SIZEOF(uint16_t)
919 AC_CHECK_SIZEOF(uint32_t)
920 AC_CHECK_SIZEOF(uint64_t)
921 AC_CHECK_SIZEOF(intptr_t)
922 AC_CHECK_SIZEOF(uintptr_t)
924 dnl AC_CHECK_TYPES([int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t, uint64_t, intptr_t, uintptr_t])
926 AC_CHECK_SIZEOF(char)
927 AC_CHECK_SIZEOF(short)
928 AC_CHECK_SIZEOF(int)
929 AC_CHECK_SIZEOF(long)
930 AC_CHECK_SIZEOF(long long)
931 AC_CHECK_SIZEOF(__int64)
932 AC_CHECK_SIZEOF(void *)
933 AC_CHECK_SIZEOF(time_t)
934 AC_CHECK_SIZEOF(size_t)
935 AC_CHECK_SIZEOF(pid_t)
937 AC_CHECK_TYPES([uint, u_char, ssize_t])
939 dnl used to include sockaddr_storage, but everybody has that.
940 AC_CHECK_TYPES([struct in6_addr, struct sockaddr_in6, sa_family_t], , ,
941 [#ifdef HAVE_SYS_TYPES_H
942 #include <sys/types.h>
943 #endif
944 #ifdef HAVE_NETINET_IN_H
945 #include <netinet/in.h>
946 #endif
947 #ifdef HAVE_NETINET_IN6_H
948 #include <netinet/in6.h>
949 #endif
950 #ifdef HAVE_SYS_SOCKET_H
951 #include <sys/socket.h>
952 #endif
953 #ifdef _WIN32
954 #define _WIN32_WINNT 0x0501
955 #define WIN32_LEAN_AND_MEAN
956 #if defined(_MSC_VER) && (_MSC_VER < 1300)
957 #include <winsock.h>
958 #else
959 #include <winsock2.h>
960 #include <ws2tcpip.h>
961 #endif
962 #endif
964 AC_CHECK_MEMBERS([struct in6_addr.s6_addr32, struct in6_addr.s6_addr16, struct sockaddr_in.sin_len, struct sockaddr_in6.sin6_len], , ,
965 [#ifdef HAVE_SYS_TYPES_H
966 #include <sys/types.h>
967 #endif
968 #ifdef HAVE_NETINET_IN_H
969 #include <netinet/in.h>
970 #endif
971 #ifdef HAVE_NETINET_IN6_H
972 #include <netinet/in6.h>
973 #endif
974 #ifdef HAVE_SYS_SOCKET_H
975 #include <sys/socket.h>
976 #endif
977 #ifdef _WIN32
978 #define _WIN32_WINNT 0x0501
979 #define WIN32_LEAN_AND_MEAN
980 #if defined(_MSC_VER) && (_MSC_VER < 1300)
981 #include <winsock.h>
982 #else
983 #include <winsock2.h>
984 #include <ws2tcpip.h>
985 #endif
986 #endif
989 AC_CHECK_TYPES([rlim_t], , ,
990 [#ifdef HAVE_SYS_TYPES_H
991 #include <sys/types.h>
992 #endif
993 #ifdef HAVE_SYS_TIME_H
994 #include <sys/time.h>
995 #endif
996 #ifdef HAVE_SYS_RESOURCE_H
997 #include <sys/resource.h>
998 #endif
1001 AX_CHECK_SIGN([time_t],
1002        [ AC_DEFINE(TIME_T_IS_SIGNED, 1, [Define if time_t is signed]) ],
1003        [ : ], [
1004 #ifdef HAVE_SYS_TYPES_H
1005 #include <sys/types.h>
1006 #endif
1007 #ifdef HAVE_SYS_TIME_H
1008 #include <sys/time.h>
1009 #endif
1010 #ifdef HAVE_TIME_H
1011 #include <time.h>
1012 #endif
1015 if test "$ax_cv_decl_time_t_signed" = no; then
1016   AC_MSG_WARN([You have an unsigned time_t; some things will probably break. Please tell the Tor developers about your interesting platform.])
1019 AX_CHECK_SIGN([size_t],
1020        [ tor_cv_size_t_signed=yes ],
1021        [ tor_cv_size_t_signed=no ], [
1022 #ifdef HAVE_SYS_TYPES_H
1023 #include <sys/types.h>
1024 #endif
1027 if test "$ax_cv_decl_size_t_signed" = yes; then
1028   AC_MSG_ERROR([You have a signed size_t; that's grossly nonconformant.])
1031 AX_CHECK_SIGN([enum always],
1032        [ AC_DEFINE(ENUM_VALS_ARE_SIGNED, 1, [Define if enum is always signed]) ],
1033        [ : ], [
1034  enum always { AAA, BBB, CCC };
1037 AC_CHECK_SIZEOF(socklen_t, , [AC_INCLUDES_DEFAULT()
1038 #ifdef HAVE_SYS_SOCKET_H
1039 #include <sys/socket.h>
1040 #endif
1043 # We want to make sure that we _don't_ have a cell_t defined, like IRIX does.
1045 AC_CHECK_SIZEOF(cell_t)
1047 # Now make sure that NULL can be represented as zero bytes.
1048 AC_CACHE_CHECK([whether memset(0) sets pointers to NULL], tor_cv_null_is_zero,
1049 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1050 [[#include <stdlib.h>
1051 #include <string.h>
1052 #include <stdio.h>
1053 #ifdef HAVE_STDDEF_H
1054 #include <stddef.h>
1055 #endif
1056 int main () { char *p1,*p2; p1=NULL; memset(&p2,0,sizeof(p2));
1057 return memcmp(&p1,&p2,sizeof(char*))?1:0; }]])],
1058        [tor_cv_null_is_zero=yes],
1059        [tor_cv_null_is_zero=no],
1060        [tor_cv_null_is_zero=cross])])
1062 if test "$tor_cv_null_is_zero" = cross ; then
1063   # Cross-compiling; let's hope that the target isn't raving mad.
1064   AC_MSG_NOTICE([Cross-compiling: we'll assume that NULL is represented as a sequence of 0-valued bytes.])
1067 if test "$tor_cv_null_is_zero" != no; then
1068   AC_DEFINE([NULL_REP_IS_ZERO_BYTES], 1,
1069             [Define to 1 iff memset(0) sets pointers to NULL])
1072 AC_CACHE_CHECK([whether memset(0) sets doubles to 0.0], tor_cv_dbl0_is_zero,
1073 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1074 [[#include <stdlib.h>
1075 #include <string.h>
1076 #include <stdio.h>
1077 #ifdef HAVE_STDDEF_H
1078 #include <stddef.h>
1079 #endif
1080 int main () { double d1,d2; d1=0; memset(&d2,0,sizeof(d2));
1081 return memcmp(&d1,&d2,sizeof(d1))?1:0; }]])],
1082        [tor_cv_dbl0_is_zero=yes],
1083        [tor_cv_dbl0_is_zero=no],
1084        [tor_cv_dbl0_is_zero=cross])])
1086 if test "$tor_cv_dbl0_is_zero" = cross ; then
1087   # Cross-compiling; let's hope that the target isn't raving mad.
1088   AC_MSG_NOTICE([Cross-compiling: we'll assume that 0.0 can be represented as a sequence of 0-valued bytes.])
1091 if test "$tor_cv_dbl0_is_zero" != no; then
1092   AC_DEFINE([DOUBLE_0_REP_IS_ZERO_BYTES], 1,
1093             [Define to 1 iff memset(0) sets doubles to 0.0])
1096 # And what happens when we malloc zero?
1097 AC_CACHE_CHECK([whether we can malloc(0) safely.], tor_cv_malloc_zero_works,
1098 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1099 [[#include <stdlib.h>
1100 #include <string.h>
1101 #include <stdio.h>
1102 #ifdef HAVE_STDDEF_H
1103 #include <stddef.h>
1104 #endif
1105 int main () { return malloc(0)?0:1; }]])],
1106        [tor_cv_malloc_zero_works=yes],
1107        [tor_cv_malloc_zero_works=no],
1108        [tor_cv_malloc_zero_works=cross])])
1110 if test "$tor_cv_malloc_zero_works" = cross; then
1111   # Cross-compiling; let's hope that the target isn't raving mad.
1112   AC_MSG_NOTICE([Cross-compiling: we'll assume that we need to check malloc() arguments for 0.])
1115 if test "$tor_cv_malloc_zero_works" = yes; then
1116   AC_DEFINE([MALLOC_ZERO_WORKS], 1,
1117             [Define to 1 iff malloc(0) returns a pointer])
1120 # whether we seem to be in a 2s-complement world.
1121 AC_CACHE_CHECK([whether we are using 2s-complement arithmetic], tor_cv_twos_complement,
1122 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1123 [[int main () { int problem = ((-99) != (~99)+1);
1124 return problem ? 1 : 0; }]])],
1125        [tor_cv_twos_complement=yes],
1126        [tor_cv_twos_complement=no],
1127        [tor_cv_twos_complement=cross])])
1129 if test "$tor_cv_twos_complement" = cross ; then
1130   # Cross-compiling; let's hope that the target isn't raving mad.
1131   AC_MSG_NOTICE([Cross-compiling: we'll assume that negative integers are represented with two's complement.])
1134 if test "$tor_cv_twos_complement" != no ; then
1135   AC_DEFINE([USING_TWOS_COMPLEMENT], 1,
1136             [Define to 1 iff we represent negative integers with two's complement])
1139 # What does shifting a negative value do?
1140 AC_CACHE_CHECK([whether right-shift on negative values does sign-extension], tor_cv_sign_extend,
1141 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1142 [[int main () { int okay = (-60 >> 8) == -1; return okay ? 0 : 1; }]])],
1143        [tor_cv_sign_extend=yes],
1144        [tor_cv_sign_extend=no],
1145        [tor_cv_sign_extend=cross])])
1147 if test "$tor_cv_sign_extend" = cross ; then
1148   # Cross-compiling; let's hope that the target isn't raving mad.
1149   AC_MSG_NOTICE([Cross-compiling: we'll assume that right-shifting negative integers causes sign-extension])
1152 if test "$tor_cv_sign_extend" != no ; then
1153   AC_DEFINE([RSHIFT_DOES_SIGN_EXTEND], 1,
1154             [Define to 1 iff right-shifting a negative value performs sign-extension])
1157 # Whether we should use the dmalloc memory allocation debugging library.
1158 AC_MSG_CHECKING(whether to use dmalloc (debug memory allocation library))
1159 AC_ARG_WITH(dmalloc,
1160 [  --with-dmalloc          Use debug memory allocation library. ],
1161 [if [[ "$withval" = "yes" ]]; then
1162   dmalloc=1
1163   AC_MSG_RESULT(yes)
1164 else
1165   dmalloc=1
1166   AC_MSG_RESULT(no)
1167 fi], [ dmalloc=0; AC_MSG_RESULT(no) ]
1170 if [[ $dmalloc -eq 1 ]]; then
1171   AC_CHECK_HEADERS(dmalloc.h, , AC_MSG_ERROR(dmalloc header file not found. Do you have the development files for dmalloc installed?))
1172   AC_SEARCH_LIBS(dmalloc_malloc, [dmallocth dmalloc], , AC_MSG_ERROR(Libdmalloc library not found. If you enable it you better have it installed.))
1173   AC_DEFINE(USE_DMALLOC, 1, [Debug memory allocation library])
1174   AC_DEFINE(DMALLOC_FUNC_CHECK, 1, [Enable dmalloc's malloc function check])
1175   AC_CHECK_FUNCS(dmalloc_strdup dmalloc_strndup)
1178 AC_ARG_WITH(tcmalloc,
1179 [  --with-tcmalloc         Use tcmalloc memory allocation library. ],
1180 [ tcmalloc=yes ], [ tcmalloc=no ])
1182 if test x$tcmalloc = xyes ; then
1183    LDFLAGS="-ltcmalloc $LDFLAGS"
1186 using_custom_malloc=no
1187 if test x$enable_openbsd_malloc = xyes ; then
1188    using_custom_malloc=yes
1190 if test x$tcmalloc = xyes ; then
1191    using_custom_malloc=yes
1193 if test $using_custom_malloc = no ; then
1194    AC_CHECK_FUNCS(mallinfo)
1197 # By default, we're going to assume we don't have mlockall()
1198 # bionic and other platforms have various broken mlockall subsystems.
1199 # Some systems don't have a working mlockall, some aren't linkable,
1200 # and some have it but don't declare it.
1201 AC_CHECK_FUNCS(mlockall)
1202 AC_CHECK_DECLS([mlockall], , , [
1203 #ifdef HAVE_SYS_MMAN_H
1204 #include <sys/mman.h>
1205 #endif])
1207 # Allow user to specify an alternate syslog facility
1208 AC_ARG_WITH(syslog-facility,
1209 [  --with-syslog-facility=LOG syslog facility to use (default=LOG_DAEMON)],
1210 syslog_facility="$withval", syslog_facility="LOG_DAEMON")
1211 AC_DEFINE_UNQUOTED(LOGFACILITY,$syslog_facility,[name of the syslog facility])
1212 AC_SUBST(LOGFACILITY)
1214 # Check if we have getresuid and getresgid
1215 AC_CHECK_FUNCS(getresuid getresgid)
1217 # Check for gethostbyname_r in all its glorious incompatible versions.
1218 #   (This logic is based on that in Python's configure.in)
1219 AH_TEMPLATE(HAVE_GETHOSTBYNAME_R,
1220   [Define this if you have any gethostbyname_r()])
1222 AC_CHECK_FUNC(gethostbyname_r, [
1223   AC_MSG_CHECKING([how many arguments gethostbyname_r() wants])
1224   OLD_CFLAGS=$CFLAGS
1225   CFLAGS="$CFLAGS $MY_CPPFLAGS $MY_THREAD_CPPFLAGS $MY_CFLAGS"
1226   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
1227 #include <netdb.h>
1228   ], [[
1229     char *cp1, *cp2;
1230     struct hostent *h1, *h2;
1231     int i1, i2;
1232     (void)gethostbyname_r(cp1,h1,cp2,i1,&h2,&i2);
1233   ]])],[
1234     AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1235     AC_DEFINE(HAVE_GETHOSTBYNAME_R_6_ARG, 1,
1236      [Define this if gethostbyname_r takes 6 arguments])
1237     AC_MSG_RESULT(6)
1238   ], [
1239     AC_TRY_COMPILE([
1240 #include <netdb.h>
1241     ], [
1242       char *cp1, *cp2;
1243       struct hostent *h1;
1244       int i1, i2;
1245       (void)gethostbyname_r(cp1,h1,cp2,i1,&i2);
1246     ], [
1247       AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1248       AC_DEFINE(HAVE_GETHOSTBYNAME_R_5_ARG, 1,
1249         [Define this if gethostbyname_r takes 5 arguments])
1250       AC_MSG_RESULT(5)
1251    ], [
1252       AC_TRY_COMPILE([
1253 #include <netdb.h>
1254      ], [
1255        char *cp1;
1256        struct hostent *h1;
1257        struct hostent_data hd;
1258        (void) gethostbyname_r(cp1,h1,&hd);
1259      ], [
1260        AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1261        AC_DEFINE(HAVE_GETHOSTBYNAME_R_3_ARG, 1,
1262          [Define this if gethostbyname_r takes 3 arguments])
1263        AC_MSG_RESULT(3)
1264      ], [
1265        AC_MSG_RESULT(0)
1266      ])
1267   ])
1268  ])
1269  CFLAGS=$OLD_CFLAGS
1272 AC_CACHE_CHECK([whether the C compiler supports __func__],
1273   tor_cv_have_func_macro,
1274   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1275 #include <stdio.h>
1276 int main(int c, char **v) { puts(__func__); }])],
1277   tor_cv_have_func_macro=yes,
1278   tor_cv_have_func_macro=no))
1280 AC_CACHE_CHECK([whether the C compiler supports __FUNC__],
1281   tor_cv_have_FUNC_macro,
1282   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1283 #include <stdio.h>
1284 int main(int c, char **v) { puts(__FUNC__); }])],
1285   tor_cv_have_FUNC_macro=yes,
1286   tor_cv_have_FUNC_macro=no))
1288 AC_CACHE_CHECK([whether the C compiler supports __FUNCTION__],
1289   tor_cv_have_FUNCTION_macro,
1290   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1291 #include <stdio.h>
1292 int main(int c, char **v) { puts(__FUNCTION__); }])],
1293   tor_cv_have_FUNCTION_macro=yes,
1294   tor_cv_have_FUNCTION_macro=no))
1296 AC_CACHE_CHECK([whether we have extern char **environ already declared],
1297   tor_cv_have_environ_declared,
1298   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1299 /* We define _GNU_SOURCE here because it is also defined in compat.c.
1300  * Without it environ doesn't get declared. */
1301 #define _GNU_SOURCE
1302 #ifdef HAVE_UNISTD_H
1303 #include <unistd.h>
1304 #endif
1305 #include <stdlib.h>
1306 int main(int c, char **v) { char **t = environ; }])],
1307   tor_cv_have_environ_declared=yes,
1308   tor_cv_have_environ_declared=no))
1310 if test "$tor_cv_have_func_macro" = 'yes'; then
1311   AC_DEFINE(HAVE_MACRO__func__, 1, [Defined if the compiler supports __func__])
1314 if test "$tor_cv_have_FUNC_macro" = 'yes'; then
1315   AC_DEFINE(HAVE_MACRO__FUNC__, 1, [Defined if the compiler supports __FUNC__])
1318 if test "$tor_cv_have_FUNCTION_macro" = 'yes'; then
1319   AC_DEFINE(HAVE_MACRO__FUNCTION__, 1,
1320            [Defined if the compiler supports __FUNCTION__])
1323 if test "$tor_cv_have_environ_declared" = 'yes'; then
1324   AC_DEFINE(HAVE_EXTERN_ENVIRON_DECLARED, 1,
1325            [Defined if we have extern char **environ already declared])
1328 # $prefix stores the value of the --prefix command line option, or
1329 # NONE if the option wasn't set.  In the case that it wasn't set, make
1330 # it be the default, so that we can use it to expand directories now.
1331 if test "x$prefix" = "xNONE"; then
1332   prefix=$ac_default_prefix
1335 # and similarly for $exec_prefix
1336 if test "x$exec_prefix" = "xNONE"; then
1337   exec_prefix=$prefix
1340 if test "x$BUILDDIR" = "x"; then
1341   BUILDDIR=`pwd`
1343 AC_SUBST(BUILDDIR)
1344 AH_TEMPLATE([BUILDDIR],[tor's build directory])
1345 AC_DEFINE_UNQUOTED(BUILDDIR,"$BUILDDIR")
1347 if test "x$CONFDIR" = "x"; then
1348   CONFDIR=`eval echo $sysconfdir/tor`
1350 AC_SUBST(CONFDIR)
1351 AH_TEMPLATE([CONFDIR],[tor's configuration directory])
1352 AC_DEFINE_UNQUOTED(CONFDIR,"$CONFDIR")
1354 BINDIR=`eval echo $bindir`
1355 AC_SUBST(BINDIR)
1356 LOCALSTATEDIR=`eval echo $localstatedir`
1357 AC_SUBST(LOCALSTATEDIR)
1359 if test "$bwin32" = true; then
1360   # Test if the linker supports the --nxcompat and --dynamicbase options
1361   # for Windows
1362   save_LDFLAGS="$LDFLAGS"
1363   LDFLAGS="-Wl,--nxcompat -Wl,--dynamicbase"
1364   AC_MSG_CHECKING([whether the linker supports DllCharacteristics])
1365   AC_LINK_IFELSE([AC_LANG_PROGRAM([])],
1366     [AC_MSG_RESULT([yes])]
1367     [save_LDFLAGS="$save_LDFLAGS $LDFLAGS"],
1368     [AC_MSG_RESULT([no])]
1369   )
1370   LDFLAGS="$save_LDFLAGS"
1373 # Set CFLAGS _after_ all the above checks, since our warnings are stricter
1374 # than autoconf's macros like.
1375 if test "$GCC" = yes; then
1376   # Disable GCC's strict aliasing checks.  They are an hours-to-debug
1377   # accident waiting to happen.
1378   CFLAGS="$CFLAGS -Wall -fno-strict-aliasing"
1379 else
1380   # Autoconf sets -g -O2 by default. Override optimization level
1381   # for non-gcc compilers
1382   CFLAGS="$CFLAGS -O"
1383   enable_gcc_warnings=no
1384   enable_gcc_warnings_advisory=no
1387 # OS X Lion started deprecating the system openssl. Let's just disable
1388 # all deprecation warnings on OS X. Also, to potentially make the binary
1389 # a little smaller, let's enable dead_strip.
1390 case "$host_os" in
1392  darwin*)
1393     CFLAGS="$CFLAGS -Wno-deprecated-declarations"
1394     LDFLAGS="$LDFLAGS -dead_strip" ;;
1395 esac
1397 # Add some more warnings which we use in development but not in the
1398 # released versions.  (Some relevant gcc versions can't handle these.)
1399 if test x$enable_gcc_warnings = xyes || test x$enable_gcc_warnings_advisory = xyes; then
1401   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1402 #if !defined(__GNUC__) || (__GNUC__ < 4)
1403 #error
1404 #endif])], have_gcc4=yes, have_gcc4=no)
1406   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1407 #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 2)
1408 #error
1409 #endif])], have_gcc42=yes, have_gcc42=no)
1411   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1412 #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 3)
1413 #error
1414 #endif])], have_gcc43=yes, have_gcc43=no)
1416   save_CFLAGS="$CFLAGS"
1417   CFLAGS="$CFLAGS -Wshorten-64-to-32"
1418   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], have_shorten64_flag=yes,
1419                     have_shorten64_flag=no)
1420   CFLAGS="$save_CFLAGS"
1422   case $host in
1423     *-*-openbsd* | *-*-bitrig*)
1424       # Some OpenBSD versions (like 4.8) have -Wsystem-headers by default.
1425       # That's fine, except that the headers don't pass -Wredundant-decls.
1426       # Therefore, let's disable -Wsystem-headers when we're building
1427       # with maximal warnings on OpenBSD.
1428       CFLAGS="$CFLAGS -Wno-system-headers" ;;
1429   esac
1431   CFLAGS="$CFLAGS -W -Wfloat-equal -Wundef -Wpointer-arith"
1432   CFLAGS="$CFLAGS -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings"
1433   CFLAGS="$CFLAGS -Wredundant-decls -Wchar-subscripts -Wcomment -Wformat=2"
1434   CFLAGS="$CFLAGS -Wwrite-strings -Wmissing-declarations -Wredundant-decls"
1435   CFLAGS="$CFLAGS -Wnested-externs -Wbad-function-cast -Wswitch-enum"
1437   if test x$enable_gcc_warnings = xyes; then
1438     CFLAGS="$CFLAGS -Werror"
1439   fi
1441   # Disabled, so we can use mallinfo(): -Waggregate-return
1443   if test x$have_gcc4 = xyes ; then
1444     # These warnings break gcc 3.3.5 and work on gcc 4.0.2
1445     CFLAGS="$CFLAGS -Winit-self -Wmissing-field-initializers -Wdeclaration-after-statement -Wold-style-definition"
1446   fi
1448   if test x$have_gcc42 = xyes ; then
1449     # These warnings break gcc 4.0.2 and work on gcc 4.2
1450     # XXXX020 See if any of these work with earlier versions.
1451     CFLAGS="$CFLAGS -Waddress -Wmissing-noreturn -Wstrict-overflow=1"
1453     # We used to use -Wstrict-overflow=5, but that breaks us heavily under 4.3.
1454   fi
1456   if test x$have_gcc42 = xyes && test x$have_clang = xno; then
1457     # These warnings break gcc 4.0.2 and clang, but work on gcc 4.2
1458     CFLAGS="$CFLAGS -Wnormalized=id -Woverride-init"
1459   fi
1461   if test x$have_gcc43 = xyes ; then
1462     # These warnings break gcc 4.2 and work on gcc 4.3
1463     # XXXX020 See if any of these work with earlier versions.
1464     CFLAGS="$CFLAGS -Wextra -Warray-bounds"
1465   fi
1467   if test x$have_shorten64_flag = xyes ; then
1468     CFLAGS="$CFLAGS -Wshorten-64-to-32"
1469   fi
1471 ##This will break the world on some 64-bit architectures
1472 # CFLAGS="$CFLAGS -Winline"
1475 if test "$enable_coverage" = yes && test "$have_clang" = "no"; then
1476    case "$host_os" in
1477     darwin*)
1478       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.])
1479    esac
1482 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent $TOR_CPPFLAGS_openssl $TOR_CPPFLAGS_zlib"
1484 AC_CONFIG_FILES([
1485         Doxyfile
1486         Makefile
1487         contrib/suse/tor.sh
1488         contrib/tor.logrotate
1489         contrib/tor.sh
1490         contrib/torctl
1491         src/config/torrc.sample
1494 if test x$asciidoc = xtrue && test "$ASCIIDOC" = "none" ; then
1495   regular_mans="doc/tor doc/tor-gencert doc/tor-resolve doc/torify"
1496   for file in $regular_mans ; do
1497     if ! [[ -f "$srcdir/$file.1.in" ]] || ! [[ -f "$srcdir/$file.html.in" ]] ; then
1498       echo "==================================";
1499       echo;
1500       echo "You need asciidoc installed to be able to build the manpage.";
1501       echo "To build without manpages, use the --disable-asciidoc argument";
1502       echo "when calling configure.";
1503       echo;
1504       echo "==================================";
1505       exit 1;
1506     fi
1507   done
1510 AC_OUTPUT
1512 if test -x /usr/bin/perl && test -x ./contrib/updateVersions.pl ; then
1513   ./contrib/updateVersions.pl