396 lines
9.6 KiB
Plaintext
396 lines
9.6 KiB
Plaintext
|
dnl configure.in for libevent
|
||
|
dnl Dug Song <dugsong@monkey.org>
|
||
|
AC_INIT(event.c)
|
||
|
|
||
|
AM_INIT_AUTOMAKE(libevent,1.4.13-stable)
|
||
|
AM_CONFIG_HEADER(config.h)
|
||
|
dnl AM_MAINTAINER_MODE
|
||
|
|
||
|
dnl Initialize prefix.
|
||
|
if test "$prefix" = "NONE"; then
|
||
|
prefix="/usr/local"
|
||
|
fi
|
||
|
|
||
|
dnl Checks for programs.
|
||
|
AC_PROG_CC
|
||
|
AC_PROG_INSTALL
|
||
|
AC_PROG_LN_S
|
||
|
|
||
|
AC_PROG_GCC_TRADITIONAL
|
||
|
if test "$GCC" = yes ; then
|
||
|
CFLAGS="$CFLAGS -Wall"
|
||
|
# And disable the strict-aliasing optimization, since it breaks
|
||
|
# our sockaddr-handling code in strange ways.
|
||
|
CFLAGS="$CFLAGS -fno-strict-aliasing"
|
||
|
fi
|
||
|
|
||
|
AC_ARG_ENABLE(gcc-warnings,
|
||
|
AS_HELP_STRING(--enable-gcc-warnings, enable verbose warnings with GCC))
|
||
|
|
||
|
AC_PROG_LIBTOOL
|
||
|
|
||
|
dnl Uncomment "AC_DISABLE_SHARED" to make shared librraries not get
|
||
|
dnl built by default. You can also turn shared libs on and off from
|
||
|
dnl the command line with --enable-shared and --disable-shared.
|
||
|
dnl AC_DISABLE_SHARED
|
||
|
AC_SUBST(LIBTOOL_DEPS)
|
||
|
|
||
|
dnl Checks for libraries.
|
||
|
AC_CHECK_LIB(socket, socket)
|
||
|
AC_CHECK_LIB(resolv, inet_aton)
|
||
|
AC_CHECK_LIB(rt, clock_gettime)
|
||
|
AC_CHECK_LIB(nsl, inet_ntoa)
|
||
|
|
||
|
dnl Checks for header files.
|
||
|
AC_HEADER_STDC
|
||
|
AC_CHECK_HEADERS(fcntl.h stdarg.h inttypes.h stdint.h poll.h signal.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/in6.h sys/socket.h)
|
||
|
if test "x$ac_cv_header_sys_queue_h" = "xyes"; then
|
||
|
AC_MSG_CHECKING(for TAILQ_FOREACH in sys/queue.h)
|
||
|
AC_EGREP_CPP(yes,
|
||
|
[
|
||
|
#include <sys/queue.h>
|
||
|
#ifdef TAILQ_FOREACH
|
||
|
yes
|
||
|
#endif
|
||
|
], [AC_MSG_RESULT(yes)
|
||
|
AC_DEFINE(HAVE_TAILQFOREACH, 1,
|
||
|
[Define if TAILQ_FOREACH is defined in <sys/queue.h>])],
|
||
|
AC_MSG_RESULT(no)
|
||
|
)
|
||
|
fi
|
||
|
|
||
|
if test "x$ac_cv_header_sys_time_h" = "xyes"; then
|
||
|
AC_MSG_CHECKING(for timeradd in sys/time.h)
|
||
|
AC_EGREP_CPP(yes,
|
||
|
[
|
||
|
#include <sys/time.h>
|
||
|
#ifdef timeradd
|
||
|
yes
|
||
|
#endif
|
||
|
], [ AC_DEFINE(HAVE_TIMERADD, 1,
|
||
|
[Define if timeradd is defined in <sys/time.h>])
|
||
|
AC_MSG_RESULT(yes)] ,AC_MSG_RESULT(no)
|
||
|
)
|
||
|
fi
|
||
|
|
||
|
if test "x$ac_cv_header_sys_time_h" = "xyes"; then
|
||
|
AC_MSG_CHECKING(for timercmp in sys/time.h)
|
||
|
AC_EGREP_CPP(yes,
|
||
|
[
|
||
|
#include <sys/time.h>
|
||
|
#ifdef timercmp
|
||
|
yes
|
||
|
#endif
|
||
|
], [ AC_DEFINE(HAVE_TIMERCMP, 1,
|
||
|
[Define if timercmp is defined in <sys/time.h>])
|
||
|
AC_MSG_RESULT(yes)] ,AC_MSG_RESULT(no)
|
||
|
)
|
||
|
fi
|
||
|
|
||
|
if test "x$ac_cv_header_sys_time_h" = "xyes"; then
|
||
|
AC_MSG_CHECKING(for timerclear in sys/time.h)
|
||
|
AC_EGREP_CPP(yes,
|
||
|
[
|
||
|
#include <sys/time.h>
|
||
|
#ifdef timerclear
|
||
|
yes
|
||
|
#endif
|
||
|
], [ AC_DEFINE(HAVE_TIMERCLEAR, 1,
|
||
|
[Define if timerclear is defined in <sys/time.h>])
|
||
|
AC_MSG_RESULT(yes)] ,AC_MSG_RESULT(no)
|
||
|
)
|
||
|
fi
|
||
|
|
||
|
if test "x$ac_cv_header_sys_time_h" = "xyes"; then
|
||
|
AC_MSG_CHECKING(for timerisset in sys/time.h)
|
||
|
AC_EGREP_CPP(yes,
|
||
|
[
|
||
|
#include <sys/time.h>
|
||
|
#ifdef timerisset
|
||
|
yes
|
||
|
#endif
|
||
|
], [ AC_DEFINE(HAVE_TIMERISSET, 1,
|
||
|
[Define if timerisset is defined in <sys/time.h>])
|
||
|
AC_MSG_RESULT(yes)] ,AC_MSG_RESULT(no)
|
||
|
)
|
||
|
fi
|
||
|
|
||
|
dnl - check if the macro WIN32 is defined on this compiler.
|
||
|
dnl - (this is how we check for a windows version of GCC)
|
||
|
AC_MSG_CHECKING(for WIN32)
|
||
|
AC_TRY_COMPILE(,
|
||
|
[
|
||
|
#ifndef WIN32
|
||
|
die horribly
|
||
|
#endif
|
||
|
],
|
||
|
bwin32=true; AC_MSG_RESULT(yes),
|
||
|
bwin32=false; AC_MSG_RESULT(no),
|
||
|
)
|
||
|
|
||
|
AM_CONDITIONAL(BUILD_WIN32, test x$bwin32 = xtrue)
|
||
|
|
||
|
dnl Checks for typedefs, structures, and compiler characteristics.
|
||
|
AC_C_CONST
|
||
|
AC_C_INLINE
|
||
|
AC_HEADER_TIME
|
||
|
|
||
|
dnl Checks for library functions.
|
||
|
AC_CHECK_FUNCS(gettimeofday vasprintf fcntl clock_gettime strtok_r strsep getaddrinfo getnameinfo strlcpy inet_ntop signal sigaction strtoll issetugid geteuid getegid)
|
||
|
|
||
|
AC_CHECK_SIZEOF(long)
|
||
|
|
||
|
if test "x$ac_cv_func_clock_gettime" = "xyes"; then
|
||
|
AC_DEFINE(DNS_USE_CPU_CLOCK_FOR_ID, 1, [Define if clock_gettime is available in libc])
|
||
|
else
|
||
|
AC_DEFINE(DNS_USE_GETTIMEOFDAY_FOR_ID, 1, [Define is no secure id variant is available])
|
||
|
fi
|
||
|
|
||
|
AC_MSG_CHECKING(for F_SETFD in fcntl.h)
|
||
|
AC_EGREP_CPP(yes,
|
||
|
[
|
||
|
#define _GNU_SOURCE
|
||
|
#include <fcntl.h>
|
||
|
#ifdef F_SETFD
|
||
|
yes
|
||
|
#endif
|
||
|
], [ AC_DEFINE(HAVE_SETFD, 1,
|
||
|
[Define if F_SETFD is defined in <fcntl.h>])
|
||
|
AC_MSG_RESULT(yes) ], AC_MSG_RESULT(no))
|
||
|
|
||
|
needsignal=no
|
||
|
haveselect=no
|
||
|
AC_CHECK_FUNCS(select, [haveselect=yes], )
|
||
|
if test "x$haveselect" = "xyes" ; then
|
||
|
AC_LIBOBJ(select)
|
||
|
needsignal=yes
|
||
|
fi
|
||
|
|
||
|
havepoll=no
|
||
|
AC_CHECK_FUNCS(poll, [havepoll=yes], )
|
||
|
if test "x$havepoll" = "xyes" ; then
|
||
|
AC_LIBOBJ(poll)
|
||
|
needsignal=yes
|
||
|
fi
|
||
|
|
||
|
haveepoll=no
|
||
|
AC_CHECK_FUNCS(epoll_ctl, [haveepoll=yes], )
|
||
|
if test "x$haveepoll" = "xyes" ; then
|
||
|
AC_DEFINE(HAVE_EPOLL, 1,
|
||
|
[Define if your system supports the epoll system calls])
|
||
|
AC_LIBOBJ(epoll)
|
||
|
needsignal=yes
|
||
|
fi
|
||
|
|
||
|
havedevpoll=no
|
||
|
if test "x$ac_cv_header_sys_devpoll_h" = "xyes"; then
|
||
|
AC_DEFINE(HAVE_DEVPOLL, 1,
|
||
|
[Define if /dev/poll is available])
|
||
|
AC_LIBOBJ(devpoll)
|
||
|
fi
|
||
|
|
||
|
havekqueue=no
|
||
|
if test "x$ac_cv_header_sys_event_h" = "xyes"; then
|
||
|
AC_CHECK_FUNCS(kqueue, [havekqueue=yes], )
|
||
|
if test "x$havekqueue" = "xyes" ; then
|
||
|
AC_MSG_CHECKING(for working kqueue)
|
||
|
AC_TRY_RUN(
|
||
|
#include <sys/types.h>
|
||
|
#include <sys/time.h>
|
||
|
#include <sys/event.h>
|
||
|
#include <stdio.h>
|
||
|
#include <unistd.h>
|
||
|
#include <fcntl.h>
|
||
|
|
||
|
int
|
||
|
main(int argc, char **argv)
|
||
|
{
|
||
|
int kq;
|
||
|
int n;
|
||
|
int fd[[2]];
|
||
|
struct kevent ev;
|
||
|
struct timespec ts;
|
||
|
char buf[[8000]];
|
||
|
|
||
|
if (pipe(fd) == -1)
|
||
|
exit(1);
|
||
|
if (fcntl(fd[[1]], F_SETFL, O_NONBLOCK) == -1)
|
||
|
exit(1);
|
||
|
|
||
|
while ((n = write(fd[[1]], buf, sizeof(buf))) == sizeof(buf))
|
||
|
;
|
||
|
|
||
|
if ((kq = kqueue()) == -1)
|
||
|
exit(1);
|
||
|
|
||
|
ev.ident = fd[[1]];
|
||
|
ev.filter = EVFILT_WRITE;
|
||
|
ev.flags = EV_ADD | EV_ENABLE;
|
||
|
n = kevent(kq, &ev, 1, NULL, 0, NULL);
|
||
|
if (n == -1)
|
||
|
exit(1);
|
||
|
|
||
|
read(fd[[0]], buf, sizeof(buf));
|
||
|
|
||
|
ts.tv_sec = 0;
|
||
|
ts.tv_nsec = 0;
|
||
|
n = kevent(kq, NULL, 0, &ev, 1, &ts);
|
||
|
if (n == -1 || n == 0)
|
||
|
exit(1);
|
||
|
|
||
|
exit(0);
|
||
|
}, [AC_MSG_RESULT(yes)
|
||
|
AC_DEFINE(HAVE_WORKING_KQUEUE, 1,
|
||
|
[Define if kqueue works correctly with pipes])
|
||
|
AC_LIBOBJ(kqueue)], AC_MSG_RESULT(no), AC_MSG_RESULT(no))
|
||
|
fi
|
||
|
fi
|
||
|
|
||
|
haveepollsyscall=no
|
||
|
if test "x$ac_cv_header_sys_epoll_h" = "xyes"; then
|
||
|
if test "x$haveepoll" = "xno" ; then
|
||
|
AC_MSG_CHECKING(for epoll system call)
|
||
|
AC_TRY_RUN(
|
||
|
#include <stdint.h>
|
||
|
#include <sys/param.h>
|
||
|
#include <sys/types.h>
|
||
|
#include <sys/syscall.h>
|
||
|
#include <sys/epoll.h>
|
||
|
#include <unistd.h>
|
||
|
|
||
|
int
|
||
|
epoll_create(int size)
|
||
|
{
|
||
|
return (syscall(__NR_epoll_create, size));
|
||
|
}
|
||
|
|
||
|
int
|
||
|
main(int argc, char **argv)
|
||
|
{
|
||
|
int epfd;
|
||
|
|
||
|
epfd = epoll_create(256);
|
||
|
exit (epfd == -1 ? 1 : 0);
|
||
|
}, [AC_MSG_RESULT(yes)
|
||
|
AC_DEFINE(HAVE_EPOLL, 1,
|
||
|
[Define if your system supports the epoll system calls])
|
||
|
needsignal=yes
|
||
|
AC_LIBOBJ(epoll_sub)
|
||
|
AC_LIBOBJ(epoll)], AC_MSG_RESULT(no), AC_MSG_RESULT(no))
|
||
|
fi
|
||
|
fi
|
||
|
|
||
|
haveeventports=no
|
||
|
AC_CHECK_FUNCS(port_create, [haveeventports=yes], )
|
||
|
if test "x$haveeventports" = "xyes" ; then
|
||
|
AC_DEFINE(HAVE_EVENT_PORTS, 1,
|
||
|
[Define if your system supports event ports])
|
||
|
AC_LIBOBJ(evport)
|
||
|
needsignal=yes
|
||
|
fi
|
||
|
if test "x$bwin32" = "xtrue"; then
|
||
|
needsignal=yes
|
||
|
fi
|
||
|
if test "x$bwin32" = "xtrue"; then
|
||
|
needsignal=yes
|
||
|
fi
|
||
|
if test "x$needsignal" = "xyes" ; then
|
||
|
AC_LIBOBJ(signal)
|
||
|
fi
|
||
|
|
||
|
AC_TYPE_PID_T
|
||
|
AC_TYPE_SIZE_T
|
||
|
AC_CHECK_TYPES([uint64_t, uint32_t, uint16_t, uint8_t], , ,
|
||
|
[#ifdef HAVE_STDINT_H
|
||
|
#include <stdint.h>
|
||
|
#elif defined(HAVE_INTTYPES_H)
|
||
|
#include <inttypes.h>
|
||
|
#endif
|
||
|
#ifdef HAVE_SYS_TYPES_H
|
||
|
#include <sys/types.h>
|
||
|
#endif])
|
||
|
AC_CHECK_TYPES([fd_mask], , ,
|
||
|
[#ifdef HAVE_SYS_TYPES_H
|
||
|
#include <sys/types.h>
|
||
|
#endif
|
||
|
#ifdef HAVE_SELECT_H
|
||
|
#include <select.h>
|
||
|
#endif])
|
||
|
|
||
|
AC_CHECK_SIZEOF(long long)
|
||
|
AC_CHECK_SIZEOF(int)
|
||
|
AC_CHECK_SIZEOF(short)
|
||
|
AC_CHECK_TYPES([struct in6_addr], , ,
|
||
|
[#ifdef WIN32
|
||
|
#include <winsock2.h>
|
||
|
#else
|
||
|
#include <sys/types.h>
|
||
|
#include <netinet/in.h>
|
||
|
#include <sys/socket.h>
|
||
|
#endif
|
||
|
#ifdef HAVE_NETINET_IN6_H
|
||
|
#include <netinet/in6.h>
|
||
|
#endif])
|
||
|
|
||
|
AC_MSG_CHECKING([for socklen_t])
|
||
|
AC_TRY_COMPILE([
|
||
|
#include <sys/types.h>
|
||
|
#include <sys/socket.h>],
|
||
|
[socklen_t x;],
|
||
|
AC_MSG_RESULT([yes]),
|
||
|
[AC_MSG_RESULT([no])
|
||
|
AC_DEFINE(socklen_t, unsigned int,
|
||
|
[Define to unsigned int if you dont have it])]
|
||
|
)
|
||
|
|
||
|
AC_MSG_CHECKING([whether our compiler supports __func__])
|
||
|
AC_TRY_COMPILE([],
|
||
|
[ const char *cp = __func__; ],
|
||
|
AC_MSG_RESULT([yes]),
|
||
|
AC_MSG_RESULT([no])
|
||
|
AC_MSG_CHECKING([whether our compiler supports __FUNCTION__])
|
||
|
AC_TRY_COMPILE([],
|
||
|
[ const char *cp = __FUNCTION__; ],
|
||
|
AC_MSG_RESULT([yes])
|
||
|
AC_DEFINE(__func__, __FUNCTION__,
|
||
|
[Define to appropriate substitue if compiler doesnt have __func__]),
|
||
|
AC_MSG_RESULT([no])
|
||
|
AC_DEFINE(__func__, __FILE__,
|
||
|
[Define to appropriate substitue if compiler doesnt have __func__])))
|
||
|
|
||
|
|
||
|
# Add some more warnings which we use in development but not in the
|
||
|
# released versions. (Some relevant gcc versions can't handle these.)
|
||
|
if test x$enable_gcc_warnings = xyes; then
|
||
|
|
||
|
AC_COMPILE_IFELSE(AC_LANG_PROGRAM([], [
|
||
|
#if !defined(__GNUC__) || (__GNUC__ < 4)
|
||
|
#error
|
||
|
#endif]), have_gcc4=yes, have_gcc4=no)
|
||
|
|
||
|
AC_COMPILE_IFELSE(AC_LANG_PROGRAM([], [
|
||
|
#if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 2)
|
||
|
#error
|
||
|
#endif]), have_gcc42=yes, have_gcc42=no)
|
||
|
|
||
|
CFLAGS="$CFLAGS -W -Wfloat-equal -Wundef -Wpointer-arith -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings -Wredundant-decls -Wchar-subscripts -Wcomment -Wformat=2 -Wwrite-strings -Wmissing-declarations -Wredundant-decls -Wnested-externs -Wbad-function-cast -Wswitch-enum -Werror"
|
||
|
CFLAGS="$CFLAGS -Wno-unused-parameter -Wno-sign-compare -Wstrict-aliasing"
|
||
|
|
||
|
if test x$have_gcc4 = xyes ; then
|
||
|
# These warnings break gcc 3.3.5 and work on gcc 4.0.2
|
||
|
CFLAGS="$CFLAGS -Winit-self -Wmissing-field-initializers -Wdeclaration-after-statement"
|
||
|
#CFLAGS="$CFLAGS -Wold-style-definition"
|
||
|
fi
|
||
|
|
||
|
if test x$have_gcc42 = xyes ; then
|
||
|
# These warnings break gcc 4.0.2 and work on gcc 4.2
|
||
|
CFLAGS="$CFLAGS -Waddress -Wnormalized=id -Woverride-init"
|
||
|
fi
|
||
|
|
||
|
##This will break the world on some 64-bit architectures
|
||
|
# CFLAGS="$CFLAGS -Winline"
|
||
|
|
||
|
fi
|
||
|
|
||
|
AC_OUTPUT(Makefile test/Makefile sample/Makefile)
|