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