blob: d42edd880ea4fcb763c78b4a67e398b42d913f8c [file] [log] [blame]
Christopher Wileye8679812015-07-01 13:36:18 -07001dnl configure.in for libevent
2dnl Copyright 2000-2007 Niels Provos
3dnl Copyright 2007-2012 Niels Provos and Nick Mathewson
4dnl
5dnl See LICENSE for copying information.
6dnl
7dnl Original version Dug Song <dugsong@monkey.org>
8
9AC_PREREQ(2.59)
10AC_INIT(event.c)
11
12AC_CONFIG_MACRO_DIR([m4])
13
14AM_INIT_AUTOMAKE(libevent,2.0.22-stable)
15AC_CONFIG_HEADERS(config.h)
16AC_DEFINE(NUMERIC_VERSION, 0x02001600, [Numeric representation of the version])
17
18dnl Initialize prefix.
19if test "$prefix" = "NONE"; then
20 prefix="/usr/local"
21fi
22
23AC_CANONICAL_BUILD
24AC_CANONICAL_HOST
25dnl the 'build' machine is where we run configure and compile
26dnl the 'host' machine is where the resulting stuff runs.
27
28case "$host_os" in
29
30 osf5*)
31 CFLAGS="$CFLAGS -D_OSF_SOURCE"
32 ;;
33esac
34
35dnl Checks for programs.
36AC_PROG_CC
37AM_PROG_CC_C_O
38AC_PROG_INSTALL
39AC_PROG_LN_S
40# AC_PROG_MKDIR_P - $(MKDIR_P) should be defined by AM_INIT_AUTOMAKE
41
42# AC_PROG_SED is only available in Autoconf >= 2.59b; workaround for older
43# versions
44ifdef([AC_PROG_SED], [AC_PROG_SED], [
45AC_CHECK_PROGS(SED, [gsed sed])
46])
47
48AC_PROG_GCC_TRADITIONAL
49
50# We need to test for at least gcc 2.95 here, because older versions don't
51# have -fno-strict-aliasing
52AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
53#if !defined(__GNUC__) || (__GNUC__ < 2) || (__GNUC__ == 2 && __GNUC_MINOR__ < 95)
54#error
55#endif])], have_gcc295=yes, have_gcc295=no)
56
57if test "$GCC" = "yes" ; then
58 # Enable many gcc warnings by default...
59 CFLAGS="$CFLAGS -Wall"
60 # And disable the strict-aliasing optimization, since it breaks
61 # our sockaddr-handling code in strange ways.
62 if test x$have_gcc295 = xyes; then
63 CFLAGS="$CFLAGS -fno-strict-aliasing"
64 fi
65fi
66
67# OS X Lion started deprecating the system openssl. Let's just disable
68# all deprecation warnings on OS X.
69case "$host_os" in
70
71 darwin*)
72 CFLAGS="$CFLAGS -Wno-deprecated-declarations"
73 ;;
74esac
75
76AC_ARG_ENABLE(gcc-warnings,
77 AS_HELP_STRING(--enable-gcc-warnings, enable verbose warnings with GCC))
78AC_ARG_ENABLE(thread-support,
79 AS_HELP_STRING(--disable-thread-support, disable support for threading),
80 [], [enable_thread_support=yes])
81AC_ARG_ENABLE(malloc-replacement,
82 AS_HELP_STRING(--disable-malloc-replacement, disable support for replacing the memory mgt functions),
83 [], [enable_malloc_replacement=yes])
84AC_ARG_ENABLE(openssl,
85 AS_HELP_STRING(--disable-openssl, disable support for openssl encryption),
86 [], [enable_openssl=yes])
87AC_ARG_ENABLE(debug-mode,
88 AS_HELP_STRING(--disable-debug-mode, disable support for running in debug mode),
89 [], [enable_debug_mode=yes])
90AC_ARG_ENABLE([libevent-install],
91 AS_HELP_STRING([--disable-libevent-install, disable installation of libevent]),
92 [], [enable_libevent_install=yes])
93AC_ARG_ENABLE([libevent-regress],
94 AS_HELP_STRING([--disable-libevent-regress, skip regress in make check]),
95 [], [enable_libevent_regress=yes])
96AC_ARG_ENABLE([function-sections],
97 AS_HELP_STRING([--enable-function-sections, make static library allow smaller binaries with --gc-sections]),
98 [], [enable_function_sections=no])
99
100
101AC_PROG_LIBTOOL
102
103dnl Uncomment "AC_DISABLE_SHARED" to make shared librraries not get
104dnl built by default. You can also turn shared libs on and off from
105dnl the command line with --enable-shared and --disable-shared.
106dnl AC_DISABLE_SHARED
107AC_SUBST(LIBTOOL_DEPS)
108
109AM_CONDITIONAL([BUILD_REGRESS], [test "$enable_libevent_regress" = "yes"])
110
111dnl Checks for libraries.
112AC_SEARCH_LIBS([inet_ntoa], [nsl])
113AC_SEARCH_LIBS([socket], [socket])
114AC_SEARCH_LIBS([inet_aton], [resolv])
115AC_SEARCH_LIBS([clock_gettime], [rt])
116AC_SEARCH_LIBS([sendfile], [sendfile])
117
118dnl - check if the macro WIN32 is defined on this compiler.
119dnl - (this is how we check for a windows version of GCC)
120AC_MSG_CHECKING(for WIN32)
121AC_TRY_COMPILE(,
122 [
123#ifndef WIN32
124die horribly
125#endif
126 ],
127 bwin32=true; AC_MSG_RESULT(yes),
128 bwin32=false; AC_MSG_RESULT(no),
129)
130
131dnl - check if the macro __CYGWIN__ is defined on this compiler.
132dnl - (this is how we check for a cygwin version of GCC)
133AC_MSG_CHECKING(for CYGWIN)
134AC_TRY_COMPILE(,
135 [
136#ifndef __CYGWIN__
137die horribly
138#endif
139 ],
140 cygwin=true; AC_MSG_RESULT(yes),
141 cygwin=false; AC_MSG_RESULT(no),
142)
143
144AC_CHECK_HEADERS([zlib.h])
145
146if test "x$ac_cv_header_zlib_h" = "xyes"; then
147dnl Determine if we have zlib for regression tests
148dnl Don't put this one in LIBS
149save_LIBS="$LIBS"
150LIBS=""
151ZLIB_LIBS=""
152have_zlib=no
153AC_SEARCH_LIBS([inflateEnd], [z],
154 [have_zlib=yes
155 ZLIB_LIBS="$LIBS"
156 AC_DEFINE(HAVE_LIBZ, 1, [Define if the system has zlib])])
157LIBS="$save_LIBS"
158AC_SUBST(ZLIB_LIBS)
159fi
160AM_CONDITIONAL(ZLIB_REGRESS, [test "$have_zlib" = "yes"])
161
162dnl See if we have openssl. This doesn't go in LIBS either.
163if test "$bwin32" = true; then
164 EV_LIB_WS32=-lws2_32
165 EV_LIB_GDI=-lgdi32
166else
167 EV_LIB_WS32=
168 EV_LIB_GDI=
169fi
170AC_SUBST(EV_LIB_WS32)
171AC_SUBST(EV_LIB_GDI)
172AC_SUBST(OPENSSL_LIBADD)
173
174AC_CHECK_HEADERS([openssl/bio.h])
175
176if test "$enable_openssl" = "yes"; then
177save_LIBS="$LIBS"
178LIBS=""
179OPENSSL_LIBS=""
180have_openssl=no
181AC_SEARCH_LIBS([SSL_new], [ssl],
182 [have_openssl=yes
183 OPENSSL_LIBS="$LIBS -lcrypto $EV_LIB_GDI $EV_LIB_WS32 $OPENSSL_LIBADD"
184 AC_DEFINE(HAVE_OPENSSL, 1, [Define if the system has openssl])],
185 [have_openssl=no],
186 [-lcrypto $EV_LIB_GDI $EV_LIB_WS32 $OPENSSL_LIBADD])
187LIBS="$save_LIBS"
188AC_SUBST(OPENSSL_LIBS)
189fi
190
191dnl Checks for header files.
192AC_HEADER_STDC
193AC_CHECK_HEADERS([fcntl.h stdarg.h inttypes.h stdint.h stddef.h poll.h unistd.h sys/epoll.h sys/time.h sys/queue.h sys/event.h sys/param.h sys/ioctl.h sys/select.h sys/devpoll.h port.h netinet/in.h netinet/in6.h sys/socket.h sys/uio.h arpa/inet.h sys/eventfd.h sys/mman.h sys/sendfile.h sys/wait.h netdb.h])
194AC_CHECK_HEADERS([sys/stat.h])
195AC_CHECK_HEADERS(sys/sysctl.h, [], [], [
196#ifdef HAVE_SYS_PARAM_H
197#include <sys/param.h>
198#endif
199])
200if test "x$ac_cv_header_sys_queue_h" = "xyes"; then
201 AC_MSG_CHECKING(for TAILQ_FOREACH in sys/queue.h)
202 AC_EGREP_CPP(yes,
203[
204#include <sys/queue.h>
205#ifdef TAILQ_FOREACH
206 yes
207#endif
208], [AC_MSG_RESULT(yes)
209 AC_DEFINE(HAVE_TAILQFOREACH, 1,
210 [Define if TAILQ_FOREACH is defined in <sys/queue.h>])],
211 AC_MSG_RESULT(no)
212 )
213fi
214
215if test "x$ac_cv_header_sys_time_h" = "xyes"; then
216 AC_MSG_CHECKING(for timeradd in sys/time.h)
217 AC_EGREP_CPP(yes,
218[
219#include <sys/time.h>
220#ifdef timeradd
221 yes
222#endif
223], [ AC_DEFINE(HAVE_TIMERADD, 1,
224 [Define if timeradd is defined in <sys/time.h>])
225 AC_MSG_RESULT(yes)] ,AC_MSG_RESULT(no)
226)
227fi
228
229if test "x$ac_cv_header_sys_time_h" = "xyes"; then
230 AC_MSG_CHECKING(for timercmp in sys/time.h)
231 AC_EGREP_CPP(yes,
232[
233#include <sys/time.h>
234#ifdef timercmp
235 yes
236#endif
237], [ AC_DEFINE(HAVE_TIMERCMP, 1,
238 [Define if timercmp is defined in <sys/time.h>])
239 AC_MSG_RESULT(yes)] ,AC_MSG_RESULT(no)
240)
241fi
242
243if test "x$ac_cv_header_sys_time_h" = "xyes"; then
244 AC_MSG_CHECKING(for timerclear in sys/time.h)
245 AC_EGREP_CPP(yes,
246[
247#include <sys/time.h>
248#ifdef timerclear
249 yes
250#endif
251], [ AC_DEFINE(HAVE_TIMERCLEAR, 1,
252 [Define if timerclear is defined in <sys/time.h>])
253 AC_MSG_RESULT(yes)] ,AC_MSG_RESULT(no)
254)
255fi
256
257if test "x$ac_cv_header_sys_time_h" = "xyes"; then
258 AC_MSG_CHECKING(for timerisset in sys/time.h)
259 AC_EGREP_CPP(yes,
260[
261#include <sys/time.h>
262#ifdef timerisset
263 yes
264#endif
265], [ AC_DEFINE(HAVE_TIMERISSET, 1,
266 [Define if timerisset is defined in <sys/time.h>])
267 AC_MSG_RESULT(yes)] ,AC_MSG_RESULT(no)
268)
269fi
270
271if test "x$ac_cv_header_sys_sysctl_h" = "xyes"; then
272 AC_CHECK_DECLS([CTL_KERN, KERN_RANDOM, RANDOM_UUID, KERN_ARND], [], [],
273 [[#include <sys/types.h>
274 #include <sys/sysctl.h>]]
275 )
276fi
277
278AM_CONDITIONAL(BUILD_WIN32, test x$bwin32 = xtrue)
279AM_CONDITIONAL(BUILD_CYGWIN, test x$cygwin = xtrue)
280AM_CONDITIONAL(BUILD_WITH_NO_UNDEFINED, test x$bwin32 = xtrue || test x$cygwin = xtrue)
281
282if test x$bwin32 = xtrue; then
283 AC_SEARCH_LIBS([getservbyname],[ws2_32])
284fi
285
286dnl Checks for typedefs, structures, and compiler characteristics.
287AC_C_CONST
288AC_C_INLINE
289AC_HEADER_TIME
290
291dnl Checks for library functions.
292AC_CHECK_FUNCS([gettimeofday vasprintf fcntl clock_gettime strtok_r strsep])
293AC_CHECK_FUNCS([getnameinfo strlcpy inet_ntop inet_pton signal sigaction strtoll inet_aton pipe eventfd sendfile mmap splice arc4random arc4random_buf issetugid geteuid getegid getprotobynumber setenv unsetenv putenv sysctl])
294AC_CHECK_FUNCS([umask])
295
296AC_CACHE_CHECK(
297 [for getaddrinfo],
298 [libevent_cv_getaddrinfo],
299 [AC_LINK_IFELSE(
300 [AC_LANG_PROGRAM(
301 [[
302 #ifdef HAVE_NETDB_H
303 #include <netdb.h>
304 #endif
305 ]],
306 [[
307 getaddrinfo;
308 ]]
309 )],
310 [libevent_cv_getaddrinfo=yes],
311 [libevent_cv_getaddrinfo=no]
312 )]
313)
314if test "$libevent_cv_getaddrinfo" = "yes" ; then
315 AC_DEFINE([HAVE_GETADDRINFO], [1], [Do we have getaddrinfo()?])
316else
317
318AC_CHECK_FUNCS([getservbyname])
319# Check for gethostbyname_r in all its glorious incompatible versions.
320# (This is cut-and-pasted from Tor, which based its logic on
321# Python's configure.in.)
322AH_TEMPLATE(HAVE_GETHOSTBYNAME_R,
323 [Define this if you have any gethostbyname_r()])
324
325AC_CHECK_FUNC(gethostbyname_r, [
326 AC_MSG_CHECKING([how many arguments gethostbyname_r() wants])
327 OLD_CFLAGS=$CFLAGS
328 CFLAGS="$CFLAGS $MY_CPPFLAGS $MY_THREAD_CPPFLAGS $MY_CFLAGS"
329 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
330#include <netdb.h>
331 ], [[
332 char *cp1, *cp2;
333 struct hostent *h1, *h2;
334 int i1, i2;
335 (void)gethostbyname_r(cp1,h1,cp2,i1,&h2,&i2);
336 ]])],[
337 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
338 AC_DEFINE(HAVE_GETHOSTBYNAME_R_6_ARG, 1,
339 [Define this if gethostbyname_r takes 6 arguments])
340 AC_MSG_RESULT(6)
341 ], [
342 AC_TRY_COMPILE([
343#include <netdb.h>
344 ], [
345 char *cp1, *cp2;
346 struct hostent *h1;
347 int i1, i2;
348 (void)gethostbyname_r(cp1,h1,cp2,i1,&i2);
349 ], [
350 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
351 AC_DEFINE(HAVE_GETHOSTBYNAME_R_5_ARG, 1,
352 [Define this if gethostbyname_r takes 5 arguments])
353 AC_MSG_RESULT(5)
354 ], [
355 AC_TRY_COMPILE([
356#include <netdb.h>
357 ], [
358 char *cp1;
359 struct hostent *h1;
360 struct hostent_data hd;
361 (void) gethostbyname_r(cp1,h1,&hd);
362 ], [
363 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
364 AC_DEFINE(HAVE_GETHOSTBYNAME_R_3_ARG, 1,
365 [Define this if gethostbyname_r takes 3 arguments])
366 AC_MSG_RESULT(3)
367 ], [
368 AC_MSG_RESULT(0)
369 ])
370 ])
371 ])
372 CFLAGS=$OLD_CFLAGS
373])
374
375fi
376
377AC_CHECK_SIZEOF(long)
378
379AC_MSG_CHECKING(for F_SETFD in fcntl.h)
380AC_EGREP_CPP(yes,
381[
382#define _GNU_SOURCE
383#include <fcntl.h>
384#ifdef F_SETFD
385yes
386#endif
387], [ AC_DEFINE(HAVE_SETFD, 1,
388 [Define if F_SETFD is defined in <fcntl.h>])
389 AC_MSG_RESULT(yes) ], AC_MSG_RESULT(no))
390
391needsignal=no
392haveselect=no
393if test x$bwin32 != xtrue; then
394 AC_CHECK_FUNCS(select, [haveselect=yes], )
395 if test "x$haveselect" = "xyes" ; then
396 needsignal=yes
397 fi
398fi
399AM_CONDITIONAL(SELECT_BACKEND, [test "x$haveselect" = "xyes"])
400
401havepoll=no
402AC_CHECK_FUNCS(poll, [havepoll=yes], )
403if test "x$havepoll" = "xyes" ; then
404 needsignal=yes
405fi
406AM_CONDITIONAL(POLL_BACKEND, [test "x$havepoll" = "xyes"])
407
408havedevpoll=no
409if test "x$ac_cv_header_sys_devpoll_h" = "xyes"; then
410 AC_DEFINE(HAVE_DEVPOLL, 1,
411 [Define if /dev/poll is available])
412fi
413AM_CONDITIONAL(DEVPOLL_BACKEND, [test "x$ac_cv_header_sys_devpoll_h" = "xyes"])
414
415havekqueue=no
416if test "x$ac_cv_header_sys_event_h" = "xyes"; then
417 AC_CHECK_FUNCS(kqueue, [havekqueue=yes], )
418 if test "x$havekqueue" = "xyes" ; then
419 AC_MSG_CHECKING(for working kqueue)
420 AC_TRY_RUN(
421#include <sys/types.h>
422#include <sys/time.h>
423#include <sys/event.h>
424#include <stdio.h>
425#include <unistd.h>
426#include <fcntl.h>
427
428int
429main(int argc, char **argv)
430{
431 int kq;
432 int n;
433 int fd[[2]];
434 struct kevent ev;
435 struct timespec ts;
436 char buf[[8000]];
437
438 if (pipe(fd) == -1)
439 exit(1);
440 if (fcntl(fd[[1]], F_SETFL, O_NONBLOCK) == -1)
441 exit(1);
442
443 while ((n = write(fd[[1]], buf, sizeof(buf))) == sizeof(buf))
444 ;
445
446 if ((kq = kqueue()) == -1)
447 exit(1);
448
449 memset(&ev, 0, sizeof(ev));
450 ev.ident = fd[[1]];
451 ev.filter = EVFILT_WRITE;
452 ev.flags = EV_ADD | EV_ENABLE;
453 n = kevent(kq, &ev, 1, NULL, 0, NULL);
454 if (n == -1)
455 exit(1);
456
457 read(fd[[0]], buf, sizeof(buf));
458
459 ts.tv_sec = 0;
460 ts.tv_nsec = 0;
461 n = kevent(kq, NULL, 0, &ev, 1, &ts);
462 if (n == -1 || n == 0)
463 exit(1);
464
465 exit(0);
466}, [AC_MSG_RESULT(yes)
467 AC_DEFINE(HAVE_WORKING_KQUEUE, 1,
468 [Define if kqueue works correctly with pipes])
469 havekqueue=yes
470 ], AC_MSG_RESULT(no), AC_MSG_RESULT(no))
471 fi
472fi
473AM_CONDITIONAL(KQUEUE_BACKEND, [test "x$havekqueue" = "xyes"])
474
475haveepollsyscall=no
476haveepoll=no
477AC_CHECK_FUNCS(epoll_ctl, [haveepoll=yes], )
478if test "x$haveepoll" = "xyes" ; then
479 AC_DEFINE(HAVE_EPOLL, 1,
480 [Define if your system supports the epoll system calls])
481 needsignal=yes
482fi
483if test "x$ac_cv_header_sys_epoll_h" = "xyes"; then
484 if test "x$haveepoll" = "xno" ; then
485 AC_MSG_CHECKING(for epoll system call)
486 AC_TRY_RUN(
487#include <stdint.h>
488#include <sys/param.h>
489#include <sys/types.h>
490#include <sys/syscall.h>
491#include <sys/epoll.h>
492#include <unistd.h>
493
494int
495epoll_create(int size)
496{
497 return (syscall(__NR_epoll_create, size));
498}
499
500int
501main(int argc, char **argv)
502{
503 int epfd;
504
505 epfd = epoll_create(256);
506 exit (epfd == -1 ? 1 : 0);
507}, [AC_MSG_RESULT(yes)
508 AC_DEFINE(HAVE_EPOLL, 1,
509 [Define if your system supports the epoll system calls])
510 needsignal=yes
511 have_epoll=yes
512 AC_LIBOBJ(epoll_sub)
513 ], AC_MSG_RESULT(no), AC_MSG_RESULT(no))
514 fi
515fi
516AM_CONDITIONAL(EPOLL_BACKEND, [test "x$haveepoll" = "xyes"])
517
518haveeventports=no
519AC_CHECK_FUNCS(port_create, [haveeventports=yes], )
520if test "x$haveeventports" = "xyes" ; then
521 AC_DEFINE(HAVE_EVENT_PORTS, 1,
522 [Define if your system supports event ports])
523 needsignal=yes
524fi
525AM_CONDITIONAL(EVPORT_BACKEND, [test "x$haveeventports" = "xyes"])
526
527if test "x$bwin32" = "xtrue"; then
528 needsignal=yes
529fi
530
531AM_CONDITIONAL(SIGNAL_SUPPORT, [test "x$needsignal" = "xyes"])
532
533AC_TYPE_PID_T
534AC_TYPE_SIZE_T
535AC_TYPE_SSIZE_T
536
537AC_CHECK_TYPES([uint64_t, uint32_t, uint16_t, uint8_t, uintptr_t], , ,
538[#ifdef HAVE_STDINT_H
539#include <stdint.h>
540#elif defined(HAVE_INTTYPES_H)
541#include <inttypes.h>
542#endif
543#ifdef HAVE_SYS_TYPES_H
544#include <sys/types.h>
545#endif])
546
547AC_CHECK_TYPES([fd_mask], , ,
548[#ifdef HAVE_SYS_TYPES_H
549#include <sys/types.h>
550#endif
551#ifdef HAVE_SYS_SELECT_H
552#include <sys/select.h>
553#endif])
554
555AC_CHECK_SIZEOF(long long)
556AC_CHECK_SIZEOF(long)
557AC_CHECK_SIZEOF(int)
558AC_CHECK_SIZEOF(short)
559AC_CHECK_SIZEOF(size_t)
560AC_CHECK_SIZEOF(void *)
561AC_CHECK_SIZEOF(off_t)
562
563AC_CHECK_TYPES([struct in6_addr, struct sockaddr_in6, sa_family_t, struct addrinfo, struct sockaddr_storage], , ,
564[#define _GNU_SOURCE
565#include <sys/types.h>
566#ifdef HAVE_NETINET_IN_H
567#include <netinet/in.h>
568#endif
569#ifdef HAVE_NETINET_IN6_H
570#include <netinet/in6.h>
571#endif
572#ifdef HAVE_SYS_SOCKET_H
573#include <sys/socket.h>
574#endif
575#ifdef HAVE_NETDB_H
576#include <netdb.h>
577#endif
578#ifdef WIN32
579#define WIN32_WINNT 0x400
580#define _WIN32_WINNT 0x400
581#define WIN32_LEAN_AND_MEAN
582#if defined(_MSC_VER) && (_MSC_VER < 1300)
583#include <winsock.h>
584#else
585#include <winsock2.h>
586#include <ws2tcpip.h>
587#endif
588#endif
589])
590AC_CHECK_MEMBERS([struct in6_addr.s6_addr32, struct in6_addr.s6_addr16, struct sockaddr_in.sin_len, struct sockaddr_in6.sin6_len, struct sockaddr_storage.ss_family, struct sockaddr_storage.__ss_family], , ,
591[#include <sys/types.h>
592#ifdef HAVE_NETINET_IN_H
593#include <netinet/in.h>
594#endif
595#ifdef HAVE_NETINET_IN6_H
596#include <netinet/in6.h>
597#endif
598#ifdef HAVE_SYS_SOCKET_H
599#include <sys/socket.h>
600#endif
601#ifdef WIN32
602#define WIN32_WINNT 0x400
603#define _WIN32_WINNT 0x400
604#define WIN32_LEAN_AND_MEAN
605#if defined(_MSC_VER) && (_MSC_VER < 1300)
606#include <winsock.h>
607#else
608#include <winsock2.h>
609#include <ws2tcpip.h>
610#endif
611#endif
612])
613
614AC_MSG_CHECKING([for socklen_t])
615AC_TRY_COMPILE([
616 #include <sys/types.h>
617 #include <sys/socket.h>],
618 [socklen_t x;],
619 AC_MSG_RESULT([yes]),
620 [AC_MSG_RESULT([no])
621 AC_DEFINE(socklen_t, unsigned int,
622 [Define to unsigned int if you dont have it])]
623)
624
625AC_MSG_CHECKING([whether our compiler supports __func__])
626AC_TRY_COMPILE([],
627 [ const char *cp = __func__; ],
628 AC_MSG_RESULT([yes]),
629 AC_MSG_RESULT([no])
630 AC_MSG_CHECKING([whether our compiler supports __FUNCTION__])
631 AC_TRY_COMPILE([],
632 [ const char *cp = __FUNCTION__; ],
633 AC_MSG_RESULT([yes])
634 AC_DEFINE(__func__, __FUNCTION__,
635 [Define to appropriate substitue if compiler doesnt have __func__]),
636 AC_MSG_RESULT([no])
637 AC_DEFINE(__func__, __FILE__,
638 [Define to appropriate substitue if compiler doesnt have __func__])))
639
640
641# check if we can compile with pthreads
642have_pthreads=no
643if test x$bwin32 != xtrue && test "$enable_thread_support" != "no"; then
644 ACX_PTHREAD([
645 AC_DEFINE(HAVE_PTHREADS, 1,
646 [Define if we have pthreads on this system])
647 have_pthreads=yes])
648 CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
649 AC_CHECK_SIZEOF(pthread_t, ,
650 [AC_INCLUDES_DEFAULT()
651 #include <pthread.h> ]
652 )
653fi
654AM_CONDITIONAL(PTHREADS, [test "$have_pthreads" != "no" && test "$enable_thread_support" != "no"])
655
656# check if we should compile locking into the library
657if test x$enable_thread_support = xno; then
658 AC_DEFINE(DISABLE_THREAD_SUPPORT, 1,
659 [Define if libevent should not be compiled with thread support])
660fi
661
662# check if we should hard-code the mm functions.
663if test x$enable_malloc_replacement = xno; then
664 AC_DEFINE(DISABLE_MM_REPLACEMENT, 1,
665 [Define if libevent should not allow replacing the mm functions])
666fi
667
668# check if we should hard-code debugging out
669if test x$enable_debug_mode = xno; then
670 AC_DEFINE(DISABLE_DEBUG_MODE, 1,
671 [Define if libevent should build without support for a debug mode])
672fi
673
674# check if we have and should use openssl
675AM_CONDITIONAL(OPENSSL, [test "$enable_openssl" != "no" && test "$have_openssl" = "yes"])
676
677# Add some more warnings which we use in development but not in the
678# released versions. (Some relevant gcc versions can't handle these.)
679if test x$enable_gcc_warnings = xyes && test "$GCC" = "yes"; then
680
681 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
682#if !defined(__GNUC__) || (__GNUC__ < 4)
683#error
684#endif])], have_gcc4=yes, have_gcc4=no)
685
686 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
687#if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 2)
688#error
689#endif])], have_gcc42=yes, have_gcc42=no)
690
691 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
692#if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 5)
693#error
694#endif])], have_gcc45=yes, have_gcc45=no)
695
696 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
697#if !defined(__clang__)
698#error
699#endif])], have_clang=yes, have_clang=no)
700
701 CFLAGS="$CFLAGS -W -Wfloat-equal -Wundef -Wpointer-arith -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings -Wredundant-decls -Wchar-subscripts -Wcomment -Wformat -Wwrite-strings -Wmissing-declarations -Wredundant-decls -Wnested-externs -Wbad-function-cast -Wswitch-enum -Werror"
702 CFLAGS="$CFLAGS -Wno-unused-parameter -Wstrict-aliasing"
703
704 if test x$have_gcc4 = xyes ; then
705 # These warnings break gcc 3.3.5 and work on gcc 4.0.2
706 CFLAGS="$CFLAGS -Winit-self -Wmissing-field-initializers -Wdeclaration-after-statement"
707 #CFLAGS="$CFLAGS -Wold-style-definition"
708 fi
709
710 if test x$have_gcc42 = xyes ; then
711 # These warnings break gcc 4.0.2 and work on gcc 4.2
712 CFLAGS="$CFLAGS -Waddress"
713 fi
714
715 if test x$have_gcc42 = xyes && test x$have_clang = xno; then
716 # These warnings break gcc 4.0.2 and clang, but work on gcc 4.2
717 CFLAGS="$CFLAGS -Wnormalized=id -Woverride-init"
718 fi
719
720 if test x$have_gcc45 = xyes ; then
721 # These warnings work on gcc 4.5
722 CFLAGS="$CFLAGS -Wlogical-op"
723 fi
724
725 if test x$have_clang = xyes; then
726 # Disable the unused-function warnings, because these trigger
727 # for minheap-internal.h related code.
728 CFLAGS="$CFLAGS -Wno-unused-function"
729
730 # clang on macosx emits warnigns for each directory specified which
731 # isn't "used" generating a lot of build noise (typically 3 warnings
732 # per file
733 case "$host_os" in
734 darwin*)
735 CFLAGS="$CFLAGS -Qunused-arguments"
736 ;;
737 esac
738 fi
739
740##This will break the world on some 64-bit architectures
741# CFLAGS="$CFLAGS -Winline"
742
743fi
744
745LIBEVENT_GC_SECTIONS=
746if test "$GCC" = yes && test "$enable_function_sections" = yes ; then
747 AC_CACHE_CHECK(
748 [if linker supports omitting unused code and data],
749 [libevent_cv_gc_sections_runs],
750 [
751 dnl NetBSD will link but likely not run with --gc-sections
752 dnl http://bugs.ntp.org/1844
753 dnl http://gnats.netbsd.org/40401
754 dnl --gc-sections causes attempt to load as linux elf, with
755 dnl wrong syscalls in place. Test a little gauntlet of
756 dnl simple stdio read code checking for errors, expecting
757 dnl enough syscall differences that the NetBSD code will
758 dnl fail even with Linux emulation working as designed.
759 dnl A shorter test could be refined by someone with access
760 dnl to a NetBSD host with Linux emulation working.
761 origCFLAGS="$CFLAGS"
762 CFLAGS="$CFLAGS -Wl,--gc-sections"
763 AC_LINK_IFELSE(
764 [AC_LANG_PROGRAM(
765 [[
766 #include <stdlib.h>
767 #include <stdio.h>
768 ]],
769 [[
770 FILE * fpC;
771 char buf[32];
772 size_t cch;
773 int read_success_once;
774
775 fpC = fopen("conftest.c", "r");
776 if (NULL == fpC)
777 exit(1);
778 do {
779 cch = fread(buf, sizeof(buf), 1, fpC);
780 read_success_once |= (0 != cch);
781 } while (0 != cch);
782 if (!read_success_once)
783 exit(2);
784 if (!feof(fpC))
785 exit(3);
786 if (0 != fclose(fpC))
787 exit(4);
788
789 exit(EXIT_SUCCESS);
790 ]]
791 )],
792 [
793 dnl We have to do this invocation manually so that we can
794 dnl get the output of conftest.err to make sure it doesn't
795 dnl mention gc-sections.
796 if test "X$cross_compiling" = "Xyes" || grep gc-sections conftest.err ; then
797 libevent_cv_gc_sections_runs=no
798 else
799 libevent_cv_gc_sections_runs=no
800 ./conftest >/dev/null 2>&1 && libevent_cv_gc_sections_runs=yes
801 fi
802 ],
803 [libevent_cv_gc_sections_runs=no]
804 )
805 CFLAGS="$origCFLAGS"
806 AS_UNSET([origCFLAGS])
807 ]
808 )
809 case "$libevent_cv_gc_sections_runs" in
810 yes)
811 CFLAGS="-ffunction-sections -fdata-sections $CFLAGS"
812 LIBEVENT_GC_SECTIONS="-Wl,--gc-sections"
813 ;;
814 esac
815fi
816AC_SUBST([LIBEVENT_GC_SECTIONS])
817
818AM_CONDITIONAL([INSTALL_LIBEVENT], [test "$enable_libevent_install" = "yes"])
819
820AC_CONFIG_FILES( [libevent.pc libevent_openssl.pc libevent_pthreads.pc] )
821AC_OUTPUT(Makefile include/Makefile test/Makefile sample/Makefile)