bump to 0.2.4.7-alpha-dev
[tor.git] / configure.ac
blobdf56efd5e8994e2f5cb497b4ffc8327d8bee46d2
1 dnl Copyright (c) 2001-2004, Roger Dingledine
2 dnl Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson
3 dnl Copyright (c) 2007-2012, The Tor Project, Inc.
4 dnl See LICENSE for licensing information
6 AC_INIT([tor],[0.2.4.7-alpha-dev])
7 AC_CONFIG_SRCDIR([src/or/main.c])
8 AM_INIT_AUTOMAKE
9 m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
10 AC_CONFIG_HEADERS([orconfig.h])
12 AC_CANONICAL_HOST
14 if test -f /etc/redhat-release ; then
15   if test -f /usr/kerberos/include ; then
16     CPPFLAGS="$CPPFLAGS -I/usr/kerberos/include"
17   fi
20 # Not a no-op; we want to make sure that CPPFLAGS is set before we use
21 # the += operator on it in src/or/Makefile.am
22 CPPFLAGS="$CPPFLAGS -I\${top_srcdir}/src/common"
24 #XXXX020 We should make these enabled or not, before 0.2.0.x-final
25 AC_ARG_ENABLE(buf-freelists,
26    AS_HELP_STRING(--disable-buf-freelists, disable freelists for buffer RAM))
27 AC_ARG_ENABLE(openbsd-malloc,
28    AS_HELP_STRING(--enable-openbsd-malloc, Use malloc code from openbsd.  Linux only))
29 AC_ARG_ENABLE(instrument-downloads,
30    AS_HELP_STRING(--enable-instrument-downloads, Instrument downloads of directory resources etc.))
31 AC_ARG_ENABLE(static-openssl,
32    AS_HELP_STRING(--enable-static-openssl, Link against a static openssl library. Requires --with-openssl-dir))
33 AC_ARG_ENABLE(static-libevent,
34    AS_HELP_STRING(--enable-static-libevent, Link against a static libevent library. Requires --with-libevent-dir))
35 AC_ARG_ENABLE(static-zlib,
36    AS_HELP_STRING(--enable-static-zlib, Link against a static zlib library. Requires --with-zlib-dir))
37 AC_ARG_ENABLE(static-tor,
38    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 if test "$enable_static_tor" = "yes"; then
41   enable_static_libevent="yes";
42   enable_static_openssl="yes";
43   enable_static_zlib="yes";
44   CFLAGS="$CFLAGS -static"
47 if test x$enable_buf_freelists != xno; then
48   AC_DEFINE(ENABLE_BUF_FREELISTS, 1,
49             [Defined if we try to use freelists for buffer RAM chunks])
51 AM_CONDITIONAL(USE_OPENBSD_MALLOC, test x$enable_openbsd_malloc = xyes)
52 if test x$enable_instrument_downloads = xyes; then
53   AC_DEFINE(INSTRUMENT_DOWNLOADS, 1,
54             [Defined if we want to keep track of how much of each kind of resource we download.])
57 AC_ARG_ENABLE(transparent,
58      AS_HELP_STRING(--disable-transparent, disable transparent proxy support),
59      [case "${enableval}" in
60         yes) transparent=true ;;
61         no)  transparent=false ;;
62         *) AC_MSG_ERROR(bad value for --enable-transparent) ;;
63       esac], [transparent=true])
65 AC_ARG_ENABLE(asciidoc,
66      AS_HELP_STRING(--disable-asciidoc, don't use asciidoc (disables building of manpages)),
67      [case "${enableval}" in
68         yes) asciidoc=true ;;
69         no)  asciidoc=false ;;
70         *) AC_MSG_ERROR(bad value for --disable-asciidoc) ;;
71       esac], [asciidoc=true])
73 # By default, we're not ready to ship a NAT-PMP aware Tor
74 AC_ARG_ENABLE(nat-pmp,
75      AS_HELP_STRING(--enable-nat-pmp, enable NAT-PMP support),
76      [case "${enableval}" in
77         yes) natpmp=true ;;
78         no)  natpmp=false ;;
79         * ) AC_MSG_ERROR(bad value for --enable-nat-pmp) ;;
80       esac], [natpmp=false])
82 # By default, we're not ready to ship a UPnP aware Tor
83 AC_ARG_ENABLE(upnp,
84      AS_HELP_STRING(--enable-upnp, enable UPnP support),
85      [case "${enableval}" in
86         yes) upnp=true ;;
87         no)  upnp=false ;;
88         * ) AC_MSG_ERROR(bad value for --enable-upnp) ;;
89       esac], [upnp=false])
92 AC_ARG_ENABLE(threads,
93      AS_HELP_STRING(--disable-threads, disable multi-threading support))
95 if test x$enable_threads = x; then
96    case $host in
97     *-*-solaris* )
98      # Don't try multithreading on solaris -- cpuworkers seem to lock.
99      AC_MSG_NOTICE([You are running Solaris; Sometimes threading makes
100 cpu workers lock up here, so I will disable threads.])
101      enable_threads="no";;
102     *)
103      enable_threads="yes";;
104    esac
107 if test "$enable_threads" = "yes"; then
108   AC_DEFINE(ENABLE_THREADS, 1, [Defined if we will try to use multithreading])
111 case $host in
112    *-*-solaris* )
113      AC_DEFINE(_REENTRANT, 1, [Define on some platforms to activate x_r() functions in time.h])
114      ;;
115 esac
117 AC_ARG_ENABLE(gcc-warnings,
118      AS_HELP_STRING(--enable-gcc-warnings, enable verbose warnings))
119 AC_ARG_ENABLE(gcc-warnings-advisory,
120      AS_HELP_STRING(--enable-gcc-warnings-advisory, [enable verbose warnings, excluding -Werror]))
122 dnl Adam shostack suggests the following for Windows:
123 dnl -D_FORTIFY_SOURCE=2 -fstack-protector-all
124 dnl Others suggest '/gs /safeseh /nxcompat /dynamicbase' for non-gcc on Windows
125 dnl This requires that we use gcc and that we add -O2 to the CFLAGS.
126 AC_ARG_ENABLE(gcc-hardening,
127     AS_HELP_STRING(--disable-gcc-hardening, disable compiler security checks))
129 dnl Linker hardening options
130 dnl Currently these options are ELF specific - you can't use this with MacOSX
131 AC_ARG_ENABLE(linker-hardening,
132     AS_HELP_STRING(--disable-linker-hardening, disable linker security fixups))
134 AC_ARG_ENABLE(local-appdata,
135    AS_HELP_STRING(--enable-local-appdata, default to host local application data paths on Windows))
136 if test "$enable_local_appdata" = "yes"; then
137   AC_DEFINE(ENABLE_LOCAL_APPDATA, 1,
138             [Defined if we default to host local appdata paths on Windows])
141 # Tor2web mode flag
142 AC_ARG_ENABLE(tor2web-mode,
143      AS_HELP_STRING(--enable-tor2web-mode, support tor2web non-anonymous mode),
144 [if test x$enableval = xyes; then
145     CFLAGS="$CFLAGS -D ENABLE_TOR2WEB_MODE=1"
146 fi])
148 AC_ARG_ENABLE(bufferevents,
149      AS_HELP_STRING(--enable-bufferevents, use Libevent's buffered IO.))
151 dnl check for the correct "ar" when cross-compiling
152 AN_MAKEVAR([AR], [AC_PROG_AR])
153 AN_PROGRAM([ar], [AC_PROG_AR])
154 AC_DEFUN([AC_PROG_AR], [AC_CHECK_TOOL([AR], [ar], [ar])])
155 AC_PROG_AR
157 AC_PROG_CC
158 AC_PROG_CPP
159 AC_PROG_MAKE_SET
160 AC_PROG_RANLIB
162 dnl autoconf 2.59 appears not to support AC_PROG_SED
163 AC_CHECK_PROG([SED],[sed],[sed],[/bin/false])
165 dnl check for asciidoc and a2x
166 AC_PATH_PROG([ASCIIDOC], [asciidoc], none)
167 AC_PATH_PROG([A2X], [a2x], none)
169 AM_CONDITIONAL(USE_ASCIIDOC, test x$asciidoc = xtrue)
171 AM_CONDITIONAL(USE_FW_HELPER, test x$natpmp = xtrue || test x$upnp = xtrue)
172 AM_CONDITIONAL(NAT_PMP, test x$natpmp = xtrue)
173 AM_CONDITIONAL(MINIUPNPC, test x$upnp = xtrue)
174 AM_PROG_CC_C_O
176 ifdef([AC_C_FLEXIBLE_ARRAY_MEMBER], [
177 AC_C_FLEXIBLE_ARRAY_MEMBER
178 ], [
179  dnl Maybe we've got an old autoconf...
180  AC_CACHE_CHECK([for flexible array members],
181      tor_cv_c_flexarray,
182      [AC_COMPILE_IFELSE(
183        AC_LANG_PROGRAM([
184  struct abc { int a; char b[]; };
185 ], [
186  struct abc *def = malloc(sizeof(struct abc)+sizeof(char));
187  def->b[0] = 33;
189   [tor_cv_c_flexarray=yes],
190   [tor_cv_c_flexarray=no])])
191  if test $tor_cv_flexarray = yes ; then
192    AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [], [Define to nothing if C supports flexible array members, and to 1 if it does not.])
193  else
194    AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [1], [Define to nothing if C supports flexible array members, and to 1 if it does not.])
195  fi
198 AC_PATH_PROG([SHA1SUM], [sha1sum], none)
199 AC_PATH_PROG([OPENSSL], [openssl], none)
201 TORUSER=_tor
202 AC_ARG_WITH(tor-user,
203         [  --with-tor-user=NAME    Specify username for tor daemon ],
204         [
205            TORUSER=$withval
206         ]
208 AC_SUBST(TORUSER)
210 TORGROUP=_tor
211 AC_ARG_WITH(tor-group,
212         [  --with-tor-group=NAME   Specify group name for tor daemon ],
213         [
214            TORGROUP=$withval
215         ]
217 AC_SUBST(TORGROUP)
220 dnl If _WIN32 is defined and non-zero, we are building for win32
221 AC_MSG_CHECKING([for win32])
222 AC_RUN_IFELSE([AC_LANG_SOURCE([
223 int main(int c, char **v) {
224 #ifdef _WIN32
225 #if _WIN32
226   return 0;
227 #else
228   return 1;
229 #endif
230 #else
231   return 2;
232 #endif
233 }])],
234 bwin32=true; AC_MSG_RESULT([yes]),
235 bwin32=false; AC_MSG_RESULT([no]),
236 bwin32=cross; AC_MSG_RESULT([cross])
239 if test "$bwin32" = cross; then
240 AC_MSG_CHECKING([for win32 (cross)])
241 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
242 #ifdef _WIN32
243 int main(int c, char **v) {return 0;}
244 #else
245 #error
246 int main(int c, char **v) {return x(y);}
247 #endif
248 ])],
249 bwin32=true; AC_MSG_RESULT([yes]),
250 bwin32=false; AC_MSG_RESULT([no]))
253 AM_CONDITIONAL(BUILD_NT_SERVICES, test x$bwin32 = xtrue)
255 dnl Enable C99 when compiling with MIPSpro
256 AC_MSG_CHECKING([for MIPSpro compiler])
257 AC_COMPILE_IFELSE([AC_LANG_PROGRAM(, [
258 #if (defined(__sgi) && defined(_COMPILER_VERSION))
259 #error
260   return x(y);
261 #endif
262 ])],
263 bmipspro=false; AC_MSG_RESULT(no),
264 bmipspro=true; AC_MSG_RESULT(yes))
266 if test "$bmipspro" = true; then
267   CFLAGS="$CFLAGS -c99"
270 AC_C_BIGENDIAN
272 AC_SEARCH_LIBS(socket, [socket network])
273 AC_SEARCH_LIBS(gethostbyname, [nsl])
274 AC_SEARCH_LIBS(dlopen, [dl])
275 AC_SEARCH_LIBS(inet_aton, [resolv])
276 saved_LIBS="$LIBS"
277 AC_SEARCH_LIBS([clock_gettime], [rt])
278 if test "$LIBS" != "$saved_LIBS"; then
279    # Looks like we need -lrt for clock_gettime().
280    have_rt=yes
283 if test "$enable_threads" = "yes"; then
284   AC_SEARCH_LIBS(pthread_create, [pthread])
285   AC_SEARCH_LIBS(pthread_detach, [pthread])
288 dnl -------------------------------------------------------------------
289 dnl Check for functions before libevent, since libevent-1.2 apparently
290 dnl exports strlcpy without defining it in a header.
292 AC_CHECK_FUNCS(
293         _NSGetEnviron \
294         accept4 \
295         clock_gettime \
296         flock \
297         ftime \
298         getaddrinfo \
299         getifaddrs \
300         getrlimit \
301         gettimeofday \
302         gmtime_r \
303         inet_aton \
304         ioctl \
305         issetugid \
306         llround \
307         localtime_r \
308         lround \
309         memmem \
310         prctl \
311         rint \
312         socketpair \
313         strlcat \
314         strlcpy \
315         strptime \
316         strtok_r \
317         strtoull \
318         sysconf \
319         uname \
320         vasprintf \
321         _vscprintf
324 if test "$enable_threads" = "yes"; then
325   AC_CHECK_HEADERS(pthread.h)
326   AC_CHECK_FUNCS(pthread_create)
329 dnl ------------------------------------------------------
330 dnl Where do you live, libevent?  And how do we call you?
332 if test "$bwin32" = true; then
333   TOR_LIB_WS32=-lws2_32
334   TOR_LIB_IPHLPAPI=-liphlpapi
335   # Some of the cargo-cults recommend -lwsock32 as well, but I don't
336   # think it's actually necessary.
337   TOR_LIB_GDI=-lgdi32
338 else
339   TOR_LIB_WS32=
340   TOR_LIB_GDI=
342 AC_SUBST(TOR_LIB_WS32)
343 AC_SUBST(TOR_LIB_GDI)
344 AC_SUBST(TOR_LIB_IPHLPAPI)
346 dnl We need to do this before we try our disgusting hack below.
347 AC_CHECK_HEADERS([sys/types.h])
349 dnl This is a disgusting hack so we safely include older libevent headers.
350 AC_CHECK_TYPE(u_int64_t, unsigned long long)
351 AC_CHECK_TYPE(u_int32_t, unsigned long)
352 AC_CHECK_TYPE(u_int16_t, unsigned short)
353 AC_CHECK_TYPE(u_int8_t, unsigned char)
355 tor_libevent_pkg_redhat="libevent"
356 tor_libevent_pkg_debian="libevent-dev"
357 tor_libevent_devpkg_redhat="libevent-devel"
358 tor_libevent_devpkg_debian="libevent-dev"
360 dnl On Gnu/Linux or any place we require it, we'll add librt to the Libevent
361 dnl linking for static builds.
362 STATIC_LIBEVENT_FLAGS=""
363 if test "$enable_static_libevent" = "yes"; then
364     if test "$have_rt" = yes; then
365       STATIC_LIBEVENT_FLAGS=" -lrt "
366     fi
369 TOR_SEARCH_LIBRARY(libevent, $trylibeventdir, [-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32], [
370 #ifdef _WIN32
371 #include <winsock2.h>
372 #endif
373 #include <stdlib.h>
374 #include <sys/time.h>
375 #include <sys/types.h>
376 #include <event.h>], [
377 #ifdef _WIN32
378 #include <winsock2.h>
379 #endif
380 void exit(int); void *event_init(void);],
381     [
382 #ifdef _WIN32
383 {WSADATA d; WSAStartup(0x101,&d); }
384 #endif
385 event_init(); exit(0);
386 ], [--with-libevent-dir], [/opt/libevent])
388 dnl Now check for particular libevent functions.
389 save_LIBS="$LIBS"
390 save_LDFLAGS="$LDFLAGS"
391 save_CPPFLAGS="$CPPFLAGS"
392 LIBS="-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32 $LIBS"
393 LDFLAGS="$TOR_LDFLAGS_libevent $LDFLAGS"
394 CPPFLAGS="$TOR_CPPFLAGS_libevent $CPPFLAGS"
395 AC_CHECK_FUNCS(event_get_version event_get_version_number event_get_method event_set_log_callback evdns_set_outgoing_bind_address event_base_loopexit)
396 AC_CHECK_MEMBERS([struct event.min_heap_idx], , ,
397 [#include <event.h>
400 AC_CHECK_HEADERS(event2/event.h event2/dns.h event2/bufferevent_ssl.h)
402 LIBS="$save_LIBS"
403 LDFLAGS="$save_LDFLAGS"
404 CPPFLAGS="$save_CPPFLAGS"
407 AM_CONDITIONAL(USE_EXTERNAL_EVDNS, test x$ac_cv_header_event2_dns_h = xyes)
409 if test "$enable_static_libevent" = "yes"; then
410    if test "$tor_cv_library_libevent_dir" = "(system)"; then
411      AC_MSG_ERROR("You must specify an explicit --with-libevent-dir=x option when using --enable-static-libevent")
412    else
413      TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent.a $STATIC_LIBEVENT_FLAGS"
414    fi
415 else
416      TOR_LIBEVENT_LIBS="-levent"
419 dnl This isn't the best test for Libevent 2.0.3-alpha.  Once it's released,
420 dnl we can do much better.
421 if test "$enable_bufferevents" = "yes" ; then
422   if test "$ac_cv_header_event2_bufferevent_ssl_h" != "yes" ; then
423     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.])
424   else
426     CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent"
428     # Check for the right version.  First see if version detection works.
429     AC_MSG_CHECKING([whether we can detect the Libevent version])
430     AC_COMPILE_IFELSE([AC_LANG_SOURCE([
431 #include <event2/event.h>
432 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 10
433 #error
434 int x = y(zz);
435 #else
436 int x = 1;
437 #endif
438   ])], [event_version_number_works=yes; AC_MSG_RESULT([yes]) ],
439      [event_version_number_works=no;  AC_MSG_RESULT([no])])
440     if test "$event_version_number_works" != 'yes'; then
441       AC_MSG_WARN([Version detection on Libevent seems broken.  Your Libevent installation is probably screwed up or very old.])
442     else
443       AC_MSG_CHECKING([whether Libevent is new enough for bufferevents])
444       AC_COMPILE_IFELSE([AC_LANG_SOURCE([
445 #include <event2/event.h>
446 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 0x02000d00
447 #error
448 int x = y(zz);
449 #else
450 int x = 1;
451 #endif
452    ])], [ AC_MSG_RESULT([yes]) ],
453       [ AC_MSG_RESULT([no])
454         AC_MSG_ERROR([Libevent does not seem new enough to support bufferevents.  We require 2.0.13-stable or later]) ] )
455     fi
456   fi
459 LIBS="$save_LIBS"
460 LDFLAGS="$save_LDFLAGS"
461 CPPFLAGS="$save_CPPFLAGS"
463 AM_CONDITIONAL(USE_BUFFEREVENTS, test "$enable_bufferevents" = "yes")
464 if test "$enable_bufferevents" = "yes"; then
465   AC_DEFINE(USE_BUFFEREVENTS, 1, [Defined if we're going to use Libevent's buffered IO API])
466   if test "$enable_static_libevent" = "yes"; then
467     TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent_openssl.a $TOR_LIBEVENT_LIBS"
468   else
469     TOR_LIBEVENT_LIBS="-levent_openssl $TOR_LIBEVENT_LIBS"
470   fi
472 AC_SUBST(TOR_LIBEVENT_LIBS)
474 dnl ------------------------------------------------------
475 dnl Where do you live, libm?
477 dnl On some platforms (Haiku/BeOS) the math library is
478 dnl part of libroot. In which case don't link against lm
479 TOR_LIB_MATH=""
480 save_LIBS="$LIBS"
481 AC_SEARCH_LIBS(pow, [m], , AC_MSG_ERROR([Could not find pow in libm or libc.]))
482 if test "$ac_cv_search_pow" != "none required"; then
483     TOR_LIB_MATH="$ac_cv_search_pow"
485 LIBS="$save_LIBS"
486 AC_SUBST(TOR_LIB_MATH)
488 dnl ------------------------------------------------------
489 dnl Where do you live, openssl?  And how do we call you?
491 tor_openssl_pkg_redhat="openssl"
492 tor_openssl_pkg_debian="libssl"
493 tor_openssl_devpkg_redhat="openssl-devel"
494 tor_openssl_devpkg_debian="libssl-dev"
496 ALT_openssl_WITHVAL=""
497 AC_ARG_WITH(ssl-dir,
498   [  --with-ssl-dir=PATH    Obsolete alias for --with-openssl-dir ],
499   [
500       if test "x$withval" != xno && test "x$withval" != "x" ; then
501          ALT_openssl_WITHVAL="$withval"
502       fi
503   ])
505 TOR_SEARCH_LIBRARY(openssl, $tryssldir, [-lssl -lcrypto $TOR_LIB_GDI],
506     [#include <openssl/rand.h>],
507     [void RAND_add(const void *buf, int num, double entropy);],
508     [RAND_add((void*)0,0,0); exit(0);], [],
509     [/usr/local/openssl /usr/lib/openssl /usr/local/ssl /usr/lib/ssl /usr/local /usr/athena /opt/openssl])
511 dnl XXXX check for OPENSSL_VERSION_NUMBER == SSLeay()
513 if test "$enable_static_openssl" = "yes"; then
514    if test "$tor_cv_library_openssl_dir" = "(system)"; then
515      AC_MSG_ERROR("You must specify an explicit --with-openssl-dir=x option when using --enable-static-openssl")
516    else
517      TOR_OPENSSL_LIBS="$TOR_LIBDIR_openssl/libssl.a $TOR_LIBDIR_openssl/libcrypto.a"
518    fi
519 else
520      TOR_OPENSSL_LIBS="-lssl -lcrypto"
522 AC_SUBST(TOR_OPENSSL_LIBS)
524 dnl ------------------------------------------------------
525 dnl Where do you live, zlib?  And how do we call you?
527 tor_zlib_pkg_redhat="zlib"
528 tor_zlib_pkg_debian="zlib1g"
529 tor_zlib_devpkg_redhat="zlib-devel"
530 tor_zlib_devpkg_debian="zlib1g-dev"
532 TOR_SEARCH_LIBRARY(zlib, $tryzlibdir, [-lz],
533     [#include <zlib.h>],
534     [const char * zlibVersion(void);],
535     [zlibVersion(); exit(0);], [--with-zlib-dir],
536     [/opt/zlib])
538 if test "$enable_static_zlib" = "yes"; then
539    if test "$tor_cv_library_zlib_dir" = "(system)"; then
540      AC_MSG_ERROR("You must specify an explicit --with-zlib-dir=x option when
541  using --enable-static-zlib")
542    else
543      TOR_ZLIB_LIBS="$TOR_LIBDIR_zlib/libz.a"
544    fi
545 else
546      TOR_ZLIB_LIBS="-lz"
548 AC_SUBST(TOR_ZLIB_LIBS)
550 dnl ---------------------------------------------------------------------
551 dnl Now that we know about our major libraries, we can check for compiler
552 dnl and linker hardening options.  We need to do this with the libraries known,
553 dnl since sometimes the linker will like an option but not be willing to
554 dnl use it with a build of a library.
556 all_ldflags_for_check="$TOR_LDFLAGS_zlib $TOR_LDFLAGS_openssl $TOR_LDFLAGS_libevent"
557 all_libs_for_check="$TOR_ZLIB_LIBS $TOR_LIB_MATH $TOR_LIBEVENT_LIBS $TOR_OPENSSL_LIBS $TOR_LIB_WS32 $TOR_LIB_GDI"
559 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
560 #if !defined(__clang__)
561 #error
562 #endif])], have_clang=yes, have_clang=no)
564 if test x$enable_gcc_hardening != xno; then
565     CFLAGS="$CFLAGS -D_FORTIFY_SOURCE=2"
566     if test x$have_clang = xyes; then
567         TOR_CHECK_CFLAGS(-Qunused-arguments)
568     fi
569     TOR_CHECK_CFLAGS(-fstack-protector-all)
570     TOR_CHECK_CFLAGS(-Wstack-protector)
571     TOR_CHECK_CFLAGS(-fwrapv)
572     TOR_CHECK_CFLAGS(--param ssp-buffer-size=1)
573     if test "$bwin32" = "false"; then
574        TOR_CHECK_CFLAGS(-fPIE)
575        TOR_CHECK_LDFLAGS(-pie, "$all_ldflags_for_check", "$all_libs_for_check")
576     fi
579 if test x$enable_linker_hardening != xno; then
580     TOR_CHECK_LDFLAGS(-z relro -z now, "$all_ldflags_for_check", "$all_libs_for_check")
583 dnl ------------------------------------------------------
584 dnl Where do you live, libnatpmp?  And how do we call you?
585 dnl There are no packages for Debian or Redhat as of this patch
587 if test "$natpmp" = "true"; then
588     AC_DEFINE(NAT_PMP, 1, [Define to 1 if we are building with nat-pmp.])
589     TOR_SEARCH_LIBRARY(libnatpmp, $trylibnatpmpdir, [-lnatpmp $TOR_LIB_WS32 $TOR_LIB_IPHLPAPI],
590         [#include <natpmp.h>],
591         [#ifdef _WIN32
592          #define STATICLIB
593          #endif
594          #include <natpmp.h>],
595         [   int r;
596             natpmp_t natpmp;
597             natpmpresp_t response;
598             r = initnatpmp(&natpmp, 0, 0);],
599             [printf("initnatpmp() returned %d (%s)\n", r, r?"FAILED":"SUCCESS");
600             exit(0);],
601         [--with-libnatpmp-dir],
602         [/usr/lib/])
606 dnl ------------------------------------------------------
607 dnl Where do you live, libminiupnpc?  And how do we call you?
608 dnl There are no packages for Debian or Redhat as of this patch
610 if test "$upnp" = "true"; then
611     AC_DEFINE(MINIUPNPC, 1, [Define to 1 if we are building with UPnP.])
613     dnl Before we call TOR_SEARCH_LIBRARY we'll do a quick compile test
614     dnl to see if we have miniupnpc-1.5 or -1.6
615     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include <miniupnpc/miniupnpc.h>],
616         [upnpDiscover(1, 0, 0, 0);exit(0);])],[miniupnpc15="true"],[miniupnpc15="false"])
618     if test "$miniupnpc15" = "true" ; then
619         AC_DEFINE([MINIUPNPC15],[1],[libminiupnpc version 1.5 found])
620         TOR_SEARCH_LIBRARY(libminiupnpc, $trylibminiupnpcdir, [-lminiupnpc $TOR_LIB_WS32 $TOR_LIB_IPHLPAPI],
621             [#include <miniupnpc/miniwget.h>
622              #include <miniupnpc/miniupnpc.h>
623              #include <miniupnpc/upnpcommands.h>],
624             [void upnpDiscover(int delay, const char * multicastif,
625              const char * minissdpdsock, int sameport);],
626             [upnpDiscover(1, 0, 0, 0); exit(0);],
627             [--with-libminiupnpc-dir],
628             [/usr/lib/])
629     else
630         TOR_SEARCH_LIBRARY(libminiupnpc, $trylibminiupnpcdir, [-lminiupnpc $TOR_LIB_WS32 $TOR_LIB_IPHLPAPI],
631             [#include <miniupnpc/miniwget.h>
632              #include <miniupnpc/miniupnpc.h>
633              #include <miniupnpc/upnpcommands.h>],
634             [void upnpDiscover(int delay, const char * multicastif,
635              const char * minissdpdsock, int sameport, int ipv6, int * error);],
636             [upnpDiscover(1, 0, 0, 0, 0, 0); exit(0);],
637             [--with-libminiupnpc-dir],
638             [/usr/lib/])
639     fi
642 dnl Make sure to enable support for large off_t if available.
643 AC_SYS_LARGEFILE
645 AC_CHECK_HEADERS(
646         assert.h \
647         errno.h \
648         fcntl.h \
649         signal.h \
650         string.h \
651         sys/fcntl.h \
652         sys/stat.h \
653         sys/time.h \
654         sys/types.h \
655         time.h \
656         unistd.h
657  , , 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.))
659 dnl These headers are not essential
661 AC_CHECK_HEADERS(
662         arpa/inet.h \
663         crt_externs.h \
664         grp.h \
665         ifaddrs.h \
666         inttypes.h \
667         limits.h \
668         linux/types.h \
669         machine/limits.h \
670         malloc.h \
671         malloc/malloc.h \
672         malloc_np.h \
673         netdb.h \
674         netinet/in.h \
675         netinet/in6.h \
676         pwd.h \
677         stdint.h \
678         sys/file.h \
679         sys/ioctl.h \
680         sys/limits.h \
681         sys/mman.h \
682         sys/param.h \
683         sys/prctl.h \
684         sys/resource.h \
685         sys/socket.h \
686         sys/syslimits.h \
687         sys/time.h \
688         sys/types.h \
689         sys/un.h \
690         sys/utime.h \
691         sys/wait.h \
692         syslog.h \
693         utime.h
696 AC_CHECK_HEADERS(sys/param.h)
698 AC_CHECK_HEADERS(net/if.h, net_if_found=1, net_if_found=0,
699 [#ifdef HAVE_SYS_TYPES_H
700 #include <sys/types.h>
701 #endif
702 #ifdef HAVE_SYS_SOCKET_H
703 #include <sys/socket.h>
704 #endif])
705 AC_CHECK_HEADERS(net/pfvar.h, net_pfvar_found=1, net_pfvar_found=0,
706 [#ifdef HAVE_SYS_TYPES_H
707 #include <sys/types.h>
708 #endif
709 #ifdef HAVE_SYS_SOCKET_H
710 #include <sys/socket.h>
711 #endif
712 #ifdef HAVE_NET_IF_H
713 #include <net/if.h>
714 #endif])
715 AC_CHECK_HEADERS(linux/netfilter_ipv4.h,
716         linux_netfilter_ipv4=1, linux_netfilter_ipv4=0,
717 [#ifdef HAVE_SYS_TYPES_H
718 #include <sys/types.h>
719 #endif
720 #ifdef HAVE_SYS_SOCKET_H
721 #include <sys/socket.h>
722 #endif
723 #ifdef HAVE_LIMITS_H
724 #include <limits.h>
725 #endif
726 #ifdef HAVE_LINUX_TYPES_H
727 #include <linux/types.h>
728 #endif
729 #ifdef HAVE_NETINET_IN6_H
730 #include <netinet/in6.h>
731 #endif
732 #ifdef HAVE_NETINET_IN_H
733 #include <netinet/in.h>
734 #endif])
736 if test x$transparent = xtrue ; then
737    transparent_ok=0
738    if test x$net_if_found = x1 && test x$net_pfvar_found = x1 ; then
739      transparent_ok=1
740    fi
741    if test x$linux_netfilter_ipv4 = x1 ; then
742      transparent_ok=1
743    fi
744    if test x$transparent_ok = x1 ; then
745      AC_DEFINE(USE_TRANSPARENT, 1, "Define to enable transparent proxy support")
746      case $host in
747        *-*-openbsd* | *-*-bitrig*)
748          AC_DEFINE(OPENBSD, 1, "Define to handle pf on OpenBSD properly") ;;
749      esac
750    else
751      AC_MSG_NOTICE([Transparent proxy support enabled, but missing headers.])
752    fi
755 AC_CHECK_MEMBERS([struct timeval.tv_sec], , ,
756 [#ifdef HAVE_SYS_TYPES_H
757 #include <sys/types.h>
758 #endif
759 #ifdef HAVE_SYS_TIME_H
760 #include <sys/time.h>
761 #endif])
763 dnl In case we aren't given a working stdint.h, we'll need to grow our own.
764 dnl Watch out.
766 AC_CHECK_SIZEOF(int8_t)
767 AC_CHECK_SIZEOF(int16_t)
768 AC_CHECK_SIZEOF(int32_t)
769 AC_CHECK_SIZEOF(int64_t)
770 AC_CHECK_SIZEOF(uint8_t)
771 AC_CHECK_SIZEOF(uint16_t)
772 AC_CHECK_SIZEOF(uint32_t)
773 AC_CHECK_SIZEOF(uint64_t)
774 AC_CHECK_SIZEOF(intptr_t)
775 AC_CHECK_SIZEOF(uintptr_t)
777 dnl AC_CHECK_TYPES([int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t, uint64_t, intptr_t, uintptr_t])
779 AC_CHECK_SIZEOF(char)
780 AC_CHECK_SIZEOF(short)
781 AC_CHECK_SIZEOF(int)
782 AC_CHECK_SIZEOF(long)
783 AC_CHECK_SIZEOF(long long)
784 AC_CHECK_SIZEOF(__int64)
785 AC_CHECK_SIZEOF(void *)
786 AC_CHECK_SIZEOF(time_t)
787 AC_CHECK_SIZEOF(size_t)
788 AC_CHECK_SIZEOF(pid_t)
790 AC_CHECK_TYPES([uint, u_char, ssize_t])
792 dnl used to include sockaddr_storage, but everybody has that.
793 AC_CHECK_TYPES([struct in6_addr, struct sockaddr_in6, sa_family_t], , ,
794 [#ifdef HAVE_SYS_TYPES_H
795 #include <sys/types.h>
796 #endif
797 #ifdef HAVE_NETINET_IN_H
798 #include <netinet/in.h>
799 #endif
800 #ifdef HAVE_NETINET_IN6_H
801 #include <netinet/in6.h>
802 #endif
803 #ifdef HAVE_SYS_SOCKET_H
804 #include <sys/socket.h>
805 #endif
806 #ifdef _WIN32
807 #define _WIN32_WINNT 0x0501
808 #define WIN32_LEAN_AND_MEAN
809 #if defined(_MSC_VER) && (_MSC_VER < 1300)
810 #include <winsock.h>
811 #else
812 #include <winsock2.h>
813 #include <ws2tcpip.h>
814 #endif
815 #endif
817 AC_CHECK_MEMBERS([struct in6_addr.s6_addr32, struct in6_addr.s6_addr16, struct sockaddr_in.sin_len, struct sockaddr_in6.sin6_len], , ,
818 [#ifdef HAVE_SYS_TYPES_H
819 #include <sys/types.h>
820 #endif
821 #ifdef HAVE_NETINET_IN_H
822 #include <netinet/in.h>
823 #endif
824 #ifdef HAVE_NETINET_IN6_H
825 #include <netinet/in6.h>
826 #endif
827 #ifdef HAVE_SYS_SOCKET_H
828 #include <sys/socket.h>
829 #endif
830 #ifdef _WIN32
831 #define _WIN32_WINNT 0x0501
832 #define WIN32_LEAN_AND_MEAN
833 #if defined(_MSC_VER) && (_MSC_VER < 1300)
834 #include <winsock.h>
835 #else
836 #include <winsock2.h>
837 #include <ws2tcpip.h>
838 #endif
839 #endif
842 AC_CHECK_TYPES([rlim_t], , ,
843 [#ifdef HAVE_SYS_TYPES_H
844 #include <sys/types.h>
845 #endif
846 #ifdef HAVE_SYS_TIME_H
847 #include <sys/time.h>
848 #endif
849 #ifdef HAVE_SYS_RESOURCE_H
850 #include <sys/resource.h>
851 #endif
854 AC_CACHE_CHECK([whether time_t is signed], tor_cv_time_t_signed, [
855 AC_RUN_IFELSE([AC_LANG_SOURCE([
856 #ifdef HAVE_SYS_TYPES_H
857 #include <sys/types.h>
858 #endif
859 #ifdef HAVE_SYS_TIME_H
860 #include <sys/time.h>
861 #endif
862 #ifdef HAVE_TIME_H
863 #include <time.h>
864 #endif
865 int main(int c, char**v) { if (((time_t)-1)<0) return 1; else return 0; }])],
866   tor_cv_time_t_signed=no, tor_cv_time_t_signed=yes, tor_cv_time_t_signed=cross)
869 if test "$tor_cv_time_t_signed" = cross; then
870   AC_MSG_NOTICE([Cross compiling: assuming that time_t is signed.])
873 if test "$tor_cv_time_t_signed" != no; then
874   AC_DEFINE([TIME_T_IS_SIGNED], 1,
875             [Define to 1 iff time_t is signed])
878 AC_CACHE_CHECK([whether size_t is signed], tor_cv_size_t_signed, [
879 AC_RUN_IFELSE([AC_LANG_SOURCE([
880 #ifdef HAVE_SYS_TYPES_H
881 #include <sys/types.h>
882 #endif
883 int main(int c, char**v) { if (((size_t)-1)<0) return 1; else return 0; }])],
884   tor_cv_size_t_signed=no, tor_cv_size_t_signed=yes, tor_cv_size_t_signed=cross)
887 if test "$tor_cv_size_t_signed" = cross; then
888   AC_MSG_NOTICE([Cross compiling: assuming that size_t is not signed.])
891 if test "$tor_cv_size_t_signed" = yes; then
892   AC_MSG_ERROR([You have a signed size_t; that's grossly nonconformant.])
895 AC_CHECK_SIZEOF(socklen_t, , [AC_INCLUDES_DEFAULT()
896 #ifdef HAVE_SYS_SOCKET_H
897 #include <sys/socket.h>
898 #endif
901 # We want to make sure that we _don't_ have a cell_t defined, like IRIX does.
903 AC_CHECK_SIZEOF(cell_t)
905 # Now make sure that NULL can be represented as zero bytes.
906 AC_CACHE_CHECK([whether memset(0) sets pointers to NULL], tor_cv_null_is_zero,
907 [AC_RUN_IFELSE([AC_LANG_SOURCE(
908 [[#include <stdlib.h>
909 #include <string.h>
910 #include <stdio.h>
911 #ifdef HAVE_STDDEF_H
912 #include <stddef.h>
913 #endif
914 int main () { char *p1,*p2; p1=NULL; memset(&p2,0,sizeof(p2));
915 return memcmp(&p1,&p2,sizeof(char*))?1:0; }]])],
916        [tor_cv_null_is_zero=yes],
917        [tor_cv_null_is_zero=no],
918        [tor_cv_null_is_zero=cross])])
920 if test "$tor_cv_null_is_zero" = cross ; then
921   # Cross-compiling; let's hope that the target isn't raving mad.
922   AC_MSG_NOTICE([Cross-compiling: we'll assume that NULL is represented as a sequence of 0-valued bytes.])
925 if test "$tor_cv_null_is_zero" != no; then
926   AC_DEFINE([NULL_REP_IS_ZERO_BYTES], 1,
927             [Define to 1 iff memset(0) sets pointers to NULL])
930 # And what happens when we malloc zero?
931 AC_CACHE_CHECK([whether we can malloc(0) safely.], tor_cv_malloc_zero_works,
932 [AC_RUN_IFELSE([AC_LANG_SOURCE(
933 [[#include <stdlib.h>
934 #include <string.h>
935 #include <stdio.h>
936 #ifdef HAVE_STDDEF_H
937 #include <stddef.h>
938 #endif
939 int main () { return malloc(0)?0:1; }]])],
940        [tor_cv_malloc_zero_works=yes],
941        [tor_cv_malloc_zero_works=no],
942        [tor_cv_malloc_zero_works=cross])])
944 if test "$tor_cv_malloc_zero_works" = cross; then
945   # Cross-compiling; let's hope that the target isn't raving mad.
946   AC_MSG_NOTICE([Cross-compiling: we'll assume that we need to check malloc() arguments for 0.])
949 if test "$tor_cv_malloc_zero_works" = yes; then
950   AC_DEFINE([MALLOC_ZERO_WORKS], 1,
951             [Define to 1 iff malloc(0) returns a pointer])
954 # whether we seem to be in a 2s-complement world.
955 AC_CACHE_CHECK([whether we are using 2s-complement arithmetic], tor_cv_twos_complement,
956 [AC_RUN_IFELSE([AC_LANG_SOURCE(
957 [[int main () { int problem = ((-99) != (~99)+1);
958 return problem ? 1 : 0; }]])],
959        [tor_cv_twos_complement=yes],
960        [tor_cv_twos_complement=no],
961        [tor_cv_twos_complement=cross])])
963 if test "$tor_cv_twos_complement" = cross ; then
964   # Cross-compiling; let's hope that the target isn't raving mad.
965   AC_MSG_NOTICE([Cross-compiling: we'll assume that negative integers are represented with two's complement.])
968 if test "$tor_cv_twos_complement" != no ; then
969   AC_DEFINE([USING_TWOS_COMPLEMENT], 1,
970             [Define to 1 iff we represent negative integers with two's complement])
973 # What does shifting a negative value do?
974 AC_CACHE_CHECK([whether right-shift on negative values does sign-extension], tor_cv_sign_extend,
975 [AC_RUN_IFELSE([AC_LANG_SOURCE(
976 [[int main () { int okay = (-60 >> 8) == -1; return okay ? 0 : 1; }]])],
977        [tor_cv_sign_extend=yes],
978        [tor_cv_sign_extend=no],
979        [tor_cv_sign_extend=cross])])
981 if test "$tor_cv_sign_extend" = cross ; then
982   # Cross-compiling; let's hope that the target isn't raving mad.
983   AC_MSG_NOTICE([Cross-compiling: we'll assume that right-shifting negative integers causes sign-extension])
986 if test "$tor_cv_sign_extend" != no ; then
987   AC_DEFINE([RSHIFT_DOES_SIGN_EXTEND], 1,
988             [Define to 1 iff right-shifting a negative value performs sign-extension])
991 # Whether we should use the dmalloc memory allocation debugging library.
992 AC_MSG_CHECKING(whether to use dmalloc (debug memory allocation library))
993 AC_ARG_WITH(dmalloc,
994 [  --with-dmalloc          Use debug memory allocation library. ],
995 [if [[ "$withval" = "yes" ]]; then
996   dmalloc=1
997   AC_MSG_RESULT(yes)
998 else
999   dmalloc=1
1000   AC_MSG_RESULT(no)
1001 fi], [ dmalloc=0; AC_MSG_RESULT(no) ]
1004 if [[ $dmalloc -eq 1 ]]; then
1005   AC_CHECK_HEADERS(dmalloc.h, , AC_MSG_ERROR(dmalloc header file not found. Do you have the development files for dmalloc installed?))
1006   AC_SEARCH_LIBS(dmalloc_malloc, [dmallocth dmalloc], , AC_MSG_ERROR(Libdmalloc library not found. If you enable it you better have it installed.))
1007   AC_DEFINE(USE_DMALLOC, 1, [Debug memory allocation library])
1008   AC_DEFINE(DMALLOC_FUNC_CHECK, 1, [Enable dmalloc's malloc function check])
1009   AC_CHECK_FUNCS(dmalloc_strdup dmalloc_strndup)
1012 AC_ARG_WITH(tcmalloc,
1013 [  --with-tcmalloc         Use tcmalloc memory allocation library. ],
1014 [ tcmalloc=yes ], [ tcmalloc=no ])
1016 if test x$tcmalloc = xyes ; then
1017    LDFLAGS="-ltcmalloc $LDFLAGS"
1020 using_custom_malloc=no
1021 if test x$enable_openbsd_malloc = xyes ; then
1022    using_custom_malloc=yes
1024 if test x$tcmalloc = xyes ; then
1025    using_custom_malloc=yes
1027 if test $using_custom_malloc = no ; then
1028    AC_CHECK_FUNCS(mallinfo)
1031 # By default, we're going to assume we don't have mlockall()
1032 # bionic and other platforms have various broken mlockall subsystems.
1033 # Some systems don't have a working mlockall, some aren't linkable,
1034 # and some have it but don't declare it.
1035 AC_CHECK_FUNCS(mlockall)
1036 AC_CHECK_DECLS([mlockall], , , [
1037 #ifdef HAVE_SYS_MMAN_H
1038 #include <sys/mman.h>
1039 #endif])
1041 # Allow user to specify an alternate syslog facility
1042 AC_ARG_WITH(syslog-facility,
1043 [  --with-syslog-facility=LOG syslog facility to use (default=LOG_DAEMON)],
1044 syslog_facility="$withval", syslog_facility="LOG_DAEMON")
1045 AC_DEFINE_UNQUOTED(LOGFACILITY,$syslog_facility,[name of the syslog facility])
1046 AC_SUBST(LOGFACILITY)
1048 # Check if we have getresuid and getresgid
1049 AC_CHECK_FUNCS(getresuid getresgid)
1051 # Check for gethostbyname_r in all its glorious incompatible versions.
1052 #   (This logic is based on that in Python's configure.in)
1053 AH_TEMPLATE(HAVE_GETHOSTBYNAME_R,
1054   [Define this if you have any gethostbyname_r()])
1056 AC_CHECK_FUNC(gethostbyname_r, [
1057   AC_MSG_CHECKING([how many arguments gethostbyname_r() wants])
1058   OLD_CFLAGS=$CFLAGS
1059   CFLAGS="$CFLAGS $MY_CPPFLAGS $MY_THREAD_CPPFLAGS $MY_CFLAGS"
1060   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
1061 #include <netdb.h>
1062   ], [[
1063     char *cp1, *cp2;
1064     struct hostent *h1, *h2;
1065     int i1, i2;
1066     (void)gethostbyname_r(cp1,h1,cp2,i1,&h2,&i2);
1067   ]])],[
1068     AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1069     AC_DEFINE(HAVE_GETHOSTBYNAME_R_6_ARG, 1,
1070      [Define this if gethostbyname_r takes 6 arguments])
1071     AC_MSG_RESULT(6)
1072   ], [
1073     AC_TRY_COMPILE([
1074 #include <netdb.h>
1075     ], [
1076       char *cp1, *cp2;
1077       struct hostent *h1;
1078       int i1, i2;
1079       (void)gethostbyname_r(cp1,h1,cp2,i1,&i2);
1080     ], [
1081       AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1082       AC_DEFINE(HAVE_GETHOSTBYNAME_R_5_ARG, 1,
1083         [Define this if gethostbyname_r takes 5 arguments])
1084       AC_MSG_RESULT(5)
1085    ], [
1086       AC_TRY_COMPILE([
1087 #include <netdb.h>
1088      ], [
1089        char *cp1;
1090        struct hostent *h1;
1091        struct hostent_data hd;
1092        (void) gethostbyname_r(cp1,h1,&hd);
1093      ], [
1094        AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1095        AC_DEFINE(HAVE_GETHOSTBYNAME_R_3_ARG, 1,
1096          [Define this if gethostbyname_r takes 3 arguments])
1097        AC_MSG_RESULT(3)
1098      ], [
1099        AC_MSG_RESULT(0)
1100      ])
1101   ])
1102  ])
1103  CFLAGS=$OLD_CFLAGS
1106 AC_CACHE_CHECK([whether the C compiler supports __func__],
1107   tor_cv_have_func_macro,
1108   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1109 #include <stdio.h>
1110 int main(int c, char **v) { puts(__func__); }])],
1111   tor_cv_have_func_macro=yes,
1112   tor_cv_have_func_macro=no))
1114 AC_CACHE_CHECK([whether the C compiler supports __FUNC__],
1115   tor_cv_have_FUNC_macro,
1116   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1117 #include <stdio.h>
1118 int main(int c, char **v) { puts(__FUNC__); }])],
1119   tor_cv_have_FUNC_macro=yes,
1120   tor_cv_have_FUNC_macro=no))
1122 AC_CACHE_CHECK([whether the C compiler supports __FUNCTION__],
1123   tor_cv_have_FUNCTION_macro,
1124   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1125 #include <stdio.h>
1126 int main(int c, char **v) { puts(__FUNCTION__); }])],
1127   tor_cv_have_FUNCTION_macro=yes,
1128   tor_cv_have_FUNCTION_macro=no))
1130 AC_CACHE_CHECK([whether we have extern char **environ already declared],
1131   tor_cv_have_environ_declared,
1132   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1133 /* We define _GNU_SOURCE here because it is also defined in compat.c.
1134  * Without it environ doesn't get declared. */
1135 #define _GNU_SOURCE
1136 #ifdef HAVE_UNISTD_H
1137 #include <unistd.h>
1138 #endif
1139 #include <stdlib.h>
1140 int main(int c, char **v) { char **t = environ; }])],
1141   tor_cv_have_environ_declared=yes,
1142   tor_cv_have_environ_declared=no))
1144 if test "$tor_cv_have_func_macro" = 'yes'; then
1145   AC_DEFINE(HAVE_MACRO__func__, 1, [Defined if the compiler supports __func__])
1148 if test "$tor_cv_have_FUNC_macro" = 'yes'; then
1149   AC_DEFINE(HAVE_MACRO__FUNC__, 1, [Defined if the compiler supports __FUNC__])
1152 if test "$tor_cv_have_FUNCTION_macro" = 'yes'; then
1153   AC_DEFINE(HAVE_MACRO__FUNCTION__, 1,
1154            [Defined if the compiler supports __FUNCTION__])
1157 if test "$tor_cv_have_environ_declared" = 'yes'; then
1158   AC_DEFINE(HAVE_EXTERN_ENVIRON_DECLARED, 1,
1159            [Defined if we have extern char **environ already declared])
1162 # $prefix stores the value of the --prefix command line option, or
1163 # NONE if the option wasn't set.  In the case that it wasn't set, make
1164 # it be the default, so that we can use it to expand directories now.
1165 if test "x$prefix" = "xNONE"; then
1166   prefix=$ac_default_prefix
1169 # and similarly for $exec_prefix
1170 if test "x$exec_prefix" = "xNONE"; then
1171   exec_prefix=$prefix
1174 if test "x$BUILDDIR" = "x"; then
1175   BUILDDIR=`pwd`
1177 AC_SUBST(BUILDDIR)
1178 AH_TEMPLATE([BUILDDIR],[tor's build directory])
1179 AC_DEFINE_UNQUOTED(BUILDDIR,"$BUILDDIR")
1181 if test "x$CONFDIR" = "x"; then
1182   CONFDIR=`eval echo $sysconfdir/tor`
1184 AC_SUBST(CONFDIR)
1185 AH_TEMPLATE([CONFDIR],[tor's configuration directory])
1186 AC_DEFINE_UNQUOTED(CONFDIR,"$CONFDIR")
1188 BINDIR=`eval echo $bindir`
1189 AC_SUBST(BINDIR)
1190 LOCALSTATEDIR=`eval echo $localstatedir`
1191 AC_SUBST(LOCALSTATEDIR)
1193 if test "$bwin32" = true; then
1194   # Test if the linker supports the --nxcompat and --dynamicbase options
1195   # for Windows
1196   save_LDFLAGS="$LDFLAGS"
1197   LDFLAGS="-Wl,--nxcompat -Wl,--dynamicbase"
1198   AC_MSG_CHECKING([whether the linker supports DllCharacteristics])
1199   AC_LINK_IFELSE([AC_LANG_PROGRAM([])],
1200     [AC_MSG_RESULT([yes])]
1201     [save_LDFLAGS="$save_LDFLAGS $LDFLAGS"],
1202     [AC_MSG_RESULT([no])]
1203   )
1204   LDFLAGS="$save_LDFLAGS"
1207 # Set CFLAGS _after_ all the above checks, since our warnings are stricter
1208 # than autoconf's macros like.
1209 if test "$GCC" = yes; then
1210   # Disable GCC's strict aliasing checks.  They are an hours-to-debug
1211   # accident waiting to happen.
1212   CFLAGS="$CFLAGS -Wall -fno-strict-aliasing"
1213 else
1214   # Autoconf sets -g -O2 by default. Override optimization level
1215   # for non-gcc compilers
1216   CFLAGS="$CFLAGS -O"
1217   enable_gcc_warnings=no
1218   enable_gcc_warnings_advisory=no
1221 # OS X Lion started deprecating the system openssl. Let's just disable
1222 # all deprecation warnings on OS X. Also, to potentially make the binary
1223 # a little smaller, let's enable dead_strip.
1224 case "$host_os" in
1226  darwin*)
1227     CFLAGS="$CFLAGS -Wno-deprecated-declarations"
1228     LDFLAGS="$LDFLAGS -dead_strip" ;;
1229 esac
1231 # Add some more warnings which we use in development but not in the
1232 # released versions.  (Some relevant gcc versions can't handle these.)
1233 if test x$enable_gcc_warnings = xyes || test x$enable_gcc_warnings_advisory = xyes; then
1235   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1236 #if !defined(__GNUC__) || (__GNUC__ < 4)
1237 #error
1238 #endif])], have_gcc4=yes, have_gcc4=no)
1240   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1241 #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 2)
1242 #error
1243 #endif])], have_gcc42=yes, have_gcc42=no)
1245   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1246 #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 3)
1247 #error
1248 #endif])], have_gcc43=yes, have_gcc43=no)
1250   save_CFLAGS="$CFLAGS"
1251   CFLAGS="$CFLAGS -Wshorten-64-to-32"
1252   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], have_shorten64_flag=yes,
1253                     have_shorten64_flag=no)
1254   CFLAGS="$save_CFLAGS"
1256   case $host in
1257     *-*-openbsd* | *-*-bitrig*)
1258       # Some OpenBSD versions (like 4.8) have -Wsystem-headers by default.
1259       # That's fine, except that the headers don't pass -Wredundant-decls.
1260       # Therefore, let's disable -Wsystem-headers when we're building
1261       # with maximal warnings on OpenBSD.
1262       CFLAGS="$CFLAGS -Wno-system-headers" ;;
1263   esac
1265   CFLAGS="$CFLAGS -W -Wfloat-equal -Wundef -Wpointer-arith"
1266   CFLAGS="$CFLAGS -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings"
1267   CFLAGS="$CFLAGS -Wredundant-decls -Wchar-subscripts -Wcomment -Wformat=2"
1268   CFLAGS="$CFLAGS -Wwrite-strings -Wmissing-declarations -Wredundant-decls"
1269   CFLAGS="$CFLAGS -Wnested-externs -Wbad-function-cast -Wswitch-enum"
1271   if test x$enable_gcc_warnings = xyes; then
1272     CFLAGS="$CFLAGS -Werror"
1273   fi
1275   # Disabled, so we can use mallinfo(): -Waggregate-return
1277   if test x$have_gcc4 = xyes ; then
1278     # These warnings break gcc 3.3.5 and work on gcc 4.0.2
1279     CFLAGS="$CFLAGS -Winit-self -Wmissing-field-initializers -Wdeclaration-after-statement -Wold-style-definition"
1280   fi
1282   if test x$have_gcc42 = xyes ; then
1283     # These warnings break gcc 4.0.2 and work on gcc 4.2
1284     # XXXX020 See if any of these work with earlier versions.
1285     CFLAGS="$CFLAGS -Waddress -Wmissing-noreturn -Wstrict-overflow=1"
1287     # We used to use -Wstrict-overflow=5, but that breaks us heavily under 4.3.
1288   fi
1290   if test x$have_gcc42 = xyes && test x$have_clang = xno; then
1291     # These warnings break gcc 4.0.2 and clang, but work on gcc 4.2
1292     CFLAGS="$CFLAGS -Wnormalized=id -Woverride-init"
1293   fi
1295   if test x$have_gcc43 = xyes ; then
1296     # These warnings break gcc 4.2 and work on gcc 4.3
1297     # XXXX020 See if any of these work with earlier versions.
1298     CFLAGS="$CFLAGS -Wextra -Warray-bounds"
1299   fi
1301   if test x$have_shorten64_flag = xyes ; then
1302     CFLAGS="$CFLAGS -Wshorten-64-to-32"
1303   fi
1305 ##This will break the world on some 64-bit architectures
1306 # CFLAGS="$CFLAGS -Winline"
1311 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent $TOR_CPPFLAGS_openssl $TOR_CPPFLAGS_zlib"
1313 AC_CONFIG_FILES([
1314         Doxyfile
1315         Makefile
1316         contrib/suse/tor.sh
1317         contrib/tor.logrotate
1318         contrib/tor.sh
1319         contrib/torctl
1320         contrib/torify
1321         src/config/torrc.sample
1324 AC_OUTPUT
1326 if test -x /usr/bin/perl && test -x ./contrib/updateVersions.pl ; then
1327   ./contrib/updateVersions.pl