1 dnl Process this file with autoconf to produce a configure script.
3 dnl TODO: clean up all the OpenSSL and shared module checking stuff;
4 dnl the most major changes have already been made and it looks like
5 dnl said functions need to be just about as complex as they already are.
8 AUTOMAKE_OPTIONS = 1.10
9 dnl Sneaky way to get an Id tag into the configure script
10 AC_INIT([librb],[devel])
11 AM_INIT_AUTOMAKE([subdir-objects])
12 AM_SILENT_RULES([yes])
14 AM_CONFIG_HEADER(include/librb_config.h)
16 AC_PREFIX_DEFAULT(/usr/local/librb)
19 dnl Checks for programs.
22 if test x"$ac_cv_prog_cc_c99" = "xno"; then
23 AC_ERROR([charybdis requires a C99 capable compiler])
45 AC_PATH_PROG(AUTOMAKE, automake)
46 AC_PATH_PROG(ACLOCAL, aclocal)
47 AC_PATH_PROG(AUTOHEADER, autoheader)
53 AC_PATH_PROG(TOUCH, touch)
58 LIBTOOL="$LIBTOOL --silent"
62 AC_DEFINE_UNQUOTED(CYGWIN,1,[This is a Cygwin system])
63 AC_DEFINE_UNQUOTED(WINDOWS,1,[This is a Windows system])
66 AC_DEFINE_UNQUOTED(MINGW,1,[This is a MinGW system])
67 AC_DEFINE_UNQUOTED(WINDOWS,1,[This is a Windows system])
68 AC_CHECK_HEADER(windows.h, , [AC_MSG_ERROR([** MinGW and no windows.h. I give up.])])
69 AC_CHECK_HEADER(winsock2.h, , [AC_MSG_ERROR([** MinGW and no winsock2.h. I give up.])])
70 AC_DEFINE_UNQUOTED(HAVE_WINSOCK2_H, 1, [Have WINSOCK2_H])
71 AC_DEFINE_UNQUOTED(HAVE_WINSOCK_H, 1, [Have WINSOCK_H])
72 LIBS="$LIBS -lws2_32 -liphlpapi"
76 CPPFLAGS="$CFLAGS -D_ALL_SOURCE -D_XOPEN_SOURCE=500"
79 CPPFLAGS="$CFLAGS -D_POSIX_PTHREAD_SEMANTICS -D_XPG4_2"
85 AM_CONDITIONAL([MINGW], [test "$is_mingw" = "yes"])
88 # backwards support for IRC_CFLAGS
89 CFLAGS="$IRC_CFLAGS $CFLAGS -Wall"
91 dnl use directory structure of cached as default (hack)
92 if test "$libexecdir" = '${exec_prefix}/libexec' &&
93 test "$localstatedir" = '${prefix}/var'; then
94 libexecdir='${bindir}'
95 localstatedir='${prefix}'
104 dnl Checks for header files.
107 AC_CHECK_HEADERS([crypt.h unistd.h sys/socket.h sys/stat.h sys/time.h time.h netinet/in.h arpa/inet.h errno.h sys/uio.h spawn.h sys/poll.h sys/epoll.h sys/select.h sys/devpoll.h sys/event.h port.h signal.h sys/signalfd.h sys/timerfd.h linux/tcp.h])
110 dnl Networking Functions
111 dnl ====================
113 AC_SEARCH_LIBS(socket, [socket],,)
116 AC_CHECK_MEMBER([struct sockaddr.sa_len], [AC_DEFINE(SOCKADDR_IN_HAS_LEN, 1, [Define to 1 if sockaddr has a 'sa_len'
118 #ifdef HAVE_SYS_TYPES_H
119 #include <sys/types.h>
121 #ifdef HAVE_SYS_SOCKET_H
122 #include <sys/socket.h>
124 #ifdef HAVE_WINSOCK2_H
125 #include <winsock2.h>
129 AC_CHECK_TYPE([socklen_t], rb_cv_socklen_t=socklen_t,[
130 AC_MSG_CHECKING([for socklen_t equivalent])
131 AC_CACHE_VAL([rb_cv_socklen_t],
133 # Systems have either "struct sockaddr *" or
134 # "void *" as the second argument to getpeername
136 for arg2 in "struct sockaddr" void; do
137 for t in int size_t unsigned long "unsigned long"; do
139 #ifdef HAVE_SYS_TYPES_H
140 #include <sys/types.h>
142 #ifdef HAVE_SYS_SOCKET_H
143 #include <sys/socket.h>
145 #ifdef HAVE_WINSOCK2_H
146 #include <winsock2.h>
148 int getpeername (int, $arg2 *, $t *);
151 getpeername(0,0,&len);
159 if test "x$rb_cv_socklen_t" = x; then
160 AC_MSG_WARN([Cannot find a type to use in place of socklen_t using int])
164 AC_MSG_RESULT($rb_cv_socklen_t)],
165 [#include <sys/types.h>
166 #include <sys/socket.h>])
168 rb_socklen_t=$rb_cv_socklen_t
174 AC_ARG_ENABLE(ipv6,AC_HELP_STRING([--disable-ipv6],[Disable IPv6 support]),[ipv6=$enableval],[ipv6=yes])
176 if test x$ipv6 != xyes; then
182 AC_MSG_NOTICE([Disabling IPv6 support: PF_INET6 not found])
186 if test "X$have_v6" = "Xyes"; then
187 RB_TYPE_STRUCT_SOCKADDR_IN6([], [
188 AC_MSG_NOTICE([Disabling IPv6 support: struct sockaddr_in6 not found])
195 AC_CHECK_TYPES([struct sockaddr_storage],[
196 rb_have_sockaddr_storage=yes
198 #include <sys/types.h>
199 #include <sys/socket.h>
203 dnl Check for stdarg.h - if we cant find it, halt configure
204 AC_CHECK_HEADER(stdarg.h, , [AC_MSG_ERROR([** stdarg.h could not be found - librb will not compile without it **])])
206 AC_CHECK_TYPE([sa_family_t], [],
207 [AC_DEFINE(sa_family_t, [u_int16_t], [If system does not define sa_family_t, define it here.])],
208 [[#include <sys/types.h>
209 #include <sys/socket.h>]])
212 dnl check for various functions...
213 AC_CHECK_FUNCS([snprintf vsnprintf socketpair gettimeofday writev sendmsg gmtime_r strtok_r usleep posix_spawn strlcpy strlcat strnlen fstat signalfd select poll kevent port_create epoll_ctl arc4random getrusage timerfd_create])
215 AC_SEARCH_LIBS(nanosleep, rt posix4, AC_DEFINE(HAVE_NANOSLEEP, 1, [Define if you have nanosleep]))
216 AC_SEARCH_LIBS(timer_create, rt, AC_DEFINE(HAVE_TIMER_CREATE, 1, [Define if you have timer_create]))
217 RB_CHECK_TIMER_CREATE
218 RB_CHECK_TIMERFD_CREATE
224 AC_MSG_CHECKING(for /dev/poll)
225 if test -c "/dev/poll"; then
227 AC_DEFINE(HAVE_DEVPOLL, [1], [Define to 1 if you have devpoll])
233 if test "$is_mingw" = "yes"; then
234 AC_DEFINE(HAVE_WIN32, [1], [Define to 1 if you are on windows])
239 AC_MSG_CHECKING(for OpenSSL)
240 AC_ARG_ENABLE(openssl,
241 [AC_HELP_STRING([--enable-openssl[=DIR]],[Enable OpenSSL support (DIR optional).])
242 AC_HELP_STRING([--disable-openssl],[Disable OpenSSL support.])],
243 [cf_enable_openssl=$enableval],
244 [cf_enable_openssl="auto"])
246 if test "$cf_enable_openssl" != "no" ; then
247 cf_openssl_basedir=""
248 if test "$cf_enable_openssl" != "auto" &&
249 test "$cf_enable_openssl" != "yes" ; then
250 dnl Support for --enable-openssl=/some/place
251 cf_openssl_basedir="`echo ${cf_enable_openssl} | sed 's/\/$//'`"
253 dnl Do the auto-probe here. Check some common directory paths.
254 for dirs in /usr/local/ssl /usr/pkg /usr/local \
255 /usr/local/openssl ; do
256 if test -f "${dirs}/include/openssl/opensslv.h" ; then
257 cf_openssl_basedir="${dirs}"
263 dnl Now check cf_openssl_found to see if we found anything.
264 if test ! -z "$cf_openssl_basedir"; then
265 if test -f "${cf_openssl_basedir}/include/openssl/opensslv.h" ; then
266 SSL_CFLAGS="-I${cf_openssl_basedir}/include"
267 SSL_LIBS="-L${cf_openssl_basedir}/lib"
269 dnl OpenSSL wasn't found in the directory specified. Naughty
271 cf_openssl_basedir=""
274 dnl Check for stock FreeBSD 4.x and 5.x systems, since their files
275 dnl are in /usr/include and /usr/lib. In this case, we don't want to
276 dnl change INCLUDES or LIBS, but still want to enable OpenSSL.
277 dnl We can't do this check above, because some people want two versions
278 dnl of OpenSSL installed (stock FreeBSD 4.x/5.x and /usr/local/ssl)
279 dnl and they want /usr/local/ssl to have preference.
280 if test -f "/usr/include/openssl/opensslv.h" ; then
281 cf_openssl_basedir="/usr"
285 dnl If we have a basedir defined, then everything is okay. Otherwise,
286 dnl we have a problem.
287 if test ! -z "$cf_openssl_basedir"; then
288 AC_MSG_RESULT($cf_openssl_basedir)
289 cf_enable_openssl="yes"
291 AC_MSG_RESULT([not found. Specify a correct path?])
292 cf_enable_openssl="no"
294 unset cf_openssl_basedir
296 dnl If --disable-openssl was specified
297 AC_MSG_RESULT(disabled)
300 save_CPPFLAGS="$CPPFLAGS"
301 CPPFLAGS="$CPPFLAGS $SSL_CFLAGS"
303 LIBS="$LIBS $SSL_LIBS"
304 if test "$cf_enable_openssl" != no; then
305 dnl Check OpenSSL version (must be 0.9.7 or above!)
306 AC_MSG_CHECKING(for OpenSSL 0.9.7 or above)
309 [#include <openssl/opensslv.h>
310 #include <stdlib.h>],
311 [[if (OPENSSL_VERSION_NUMBER >= 0x00907000)
312 exit(0); else exit(1);]])],
313 cf_enable_openssl=yes,
314 cf_enable_openssl=no,
315 cf_enable_openssl=no)
317 if test "$cf_enable_openssl" != no; then
320 AC_MSG_RESULT(no - OpenSSL support disabled)
326 if test "$cf_enable_openssl" != no; then
327 CPPFLAGS="$CPPFLAGS $SSL_LIBS"
328 AC_CHECK_LIB(crypto, RAND_status,
329 [cf_enable_openssl=yes],
330 [cf_enable_openssl=no])
333 if test "$cf_enable_openssl" != no; then
334 CPPFLAGS="$CPPFLAGS $SSL_LIBS"
335 AC_CHECK_LIB(ssl, SSL_read,
336 [SSL_LIBS="$SSL_LIBS -lssl -lcrypto"],
337 [cf_enable_openssl=no], [-lcrypto])
342 AC_ARG_ENABLE(mbedtls,
343 [AC_HELP_STRING([--enable-mbedtls], [Enable mbedTLS support.])
344 AC_HELP_STRING([--disable-mbedtls], [Disable mbedTLS support.])],
345 [cf_enable_mbedtls=$enableval],
346 [cf_enable_mbedtls="auto"])
348 if test "$cf_enable_mbedtls" != no; then
349 save_CPPFLAGS="$CPPFLAGS"
351 LIBS="$LIBS $MBEDTLS_LIBS"
352 AC_CHECK_LIB(mbedtls, mbedtls_ssl_init, [
353 MBEDTLS_LIBS="$MBEDTLS_LIBS -lmbedtls -lmbedcrypto -lmbedx509"
354 cf_enable_mbedtls=yes
355 ], [cf_enable_mbedtls=no], [-lmbedcrypto -lmbedx509])
359 AC_MSG_CHECKING(for GnuTLS)
360 AC_ARG_ENABLE(gnutls,
361 [AC_HELP_STRING([--enable-gnutls],[Enable GnuTLS support.])
362 AC_HELP_STRING([--disable-gnutls],[Disable GnuTLS support.])],
363 [cf_enable_gnutls=$enableval],
364 [cf_enable_gnutls="auto"])
366 if test "$cf_enable_gnutls" != no; then
367 PKG_CHECK_MODULES(GNUTLS, [gnutls], [
368 cf_enable_gnutls="yes"
369 ], [cf_enable_gnutls="no"])
372 dnl mbed TLS is given highest preference when no specified TLS library is provided
373 if test "$cf_enable_openssl" = "auto" -a "$cf_enable_mbedtls" = "yes"; then
374 cf_enable_openssl="no"
377 if test "$cf_enable_gnutls" = "auto" -a "$cf_enable_openssl" = "yes" -a "$cf_enable_mbedtls" = "yes"; then
378 cf_enable_gnutls="no"
381 if test x"$cf_enable_openssl" != xno; then
382 AC_DEFINE(HAVE_OPENSSL,1,[Has OpenSSL])
388 elif test x"$cf_enable_mbedtls" != xno; then
389 AC_DEFINE(HAVE_MBEDTLS, 1, [Has mbedTLS])
395 elif test x"$cf_enable_gnutls" != xno; then
396 AC_DEFINE(HAVE_GNUTLS, 1, [Has GnuTLS])
407 CPPFLAGS="$save_CPPFLAGS"
410 dnl End OpenSSL detection
415 dnl Debug-related options
416 dnl =====================
418 AC_ARG_ENABLE(assert,
419 AC_HELP_STRING([--enable-assert],[Enable assert(). Choose between soft(warnings) and hard(aborts the daemon)]),
420 [assert=$enableval], [assert=no])
422 if test "$assert" = no; then
423 AC_DEFINE(NDEBUG, 1, [Define this to disable debugging support.])
424 elif test "$assert" = soft; then
425 AC_DEFINE(SOFT_ASSERT, 1, [Define this to enable soft asserts.])
426 AC_DEFINE(NDEBUG, 1, [Define this to disable debugging support.])
427 elif test "$assert" = yes; then
431 AC_MSG_CHECKING(if you want to do a profile build)
432 AC_ARG_ENABLE(profile,
433 AC_HELP_STRING([--enable-profile],[Enable profiling]),
434 [profile=$enableval], [profile=no])
436 if test "$profile" = yes; then
437 if test "$ac_cv_c_compiler_gnu" = yes; then
438 CFLAGS="$CFLAGS -pg -static"
439 AC_MSG_RESULT([yes, adding -pg -static])
440 AC_DEFINE(RATBOX_PROFILE, 1, [Defined to mark profiling is enabled])
442 AC_MSG_RESULT([no, profile builds only work with gcc])
448 AC_ARG_ENABLE(warnings,
449 AC_HELP_STRING([--enable-warnings],[Enable all sorts of warnings for debugging.]),
450 [CFLAGS="$CFLAGS -Wall -Werror -Wcast-qual -Wmissing-declarations -Wmissing-prototypes -Wnested-externs -Wshadow -Wwrite-strings -W -Wno-unused -Wunused-function -Wunused-variable"],[])
458 AC_SUBST(GNUTLS_CFLAGS)
459 AC_SUBST(GNUTLS_LIBS)
460 AC_SUBST(MBEDTLS_CFLAGS)
461 AC_SUBST(MBEDTLS_LIBS)
463 if test "$prefix" = "NONE"; then
464 AC_DEFINE_UNQUOTED(RB_PREFIX, "$ac_default_prefix", [Prefix where librb is installed.])
468 dnl Don't get bitten by Cygwin's stupidity if the user specified
469 dnl a custom prefix with a trailing slash
471 prefix=`echo $prefix | sed 's/\/$//'`
472 AC_DEFINE_UNQUOTED(RB_PREFIX, "$prefix", [Prefix where librb is installed.])
478 AC_CONFIG_COMMANDS([include/librb-config.h],
480 outfile=include/librb-config.h.tmp
481 cat > $outfile <<\_______EOF
483 * librb-config.h: librb config file. Please modify configure.ac
486 #ifndef __LIBRB_CONFIG_H
487 #define __LIBRB_CONFIG_H
491 if test "x$rb_have_ipv6" = "xyes"; then
492 echo "#define RB_IPV6 1" >> $outfile
495 if test "x$rb_windows_h" = "xyes"; then
496 echo '#define WIN32_LEAN_AND_MEAN 1' >> $outfile
497 echo '#include <windows.h>' >> $outfile
498 echo '#include <winsock2.h>' >> $outfile
499 echo '#include <iphlpapi.h>' >> $outfile
502 if test "x$rb_alloca_h" = "xyes"; then
503 echo '#define RB_HAVE_ALLOCA_H 1' >> $outfile
506 if test "x$rb_header_stdc" = "xyes"; then
507 echo '#include <stdlib.h>' >> $outfile
508 echo '#include <stddef.h>' >> $outfile
509 elif test "x$rb_header_stdlib" = "xyes"; then
510 echo '#include <stdlib.h>' >> $outfile
513 if test "x$rb_header_string_h" = "xyes"; then
514 echo '#include <string.h>' >> $outfile
517 if test "x$rb_stdint_h" = "xyes"; then
518 echo '#include <stdint.h>' >> $outfile
521 if test "x$rb_inttypes_h" = "xyes"; then
522 echo '#include <inttypes.h>' >> $outfile
525 if test "x$rb_sys_types_h" = "xyes"; then
526 echo '#include <sys/types.h>' >> $outfile
528 if test "x$rb_sys_time_h" = "xyes"; then
529 echo '#include <sys/time.h>' >> $outfile
531 if test "x$rb_sys_stat_h" = "xyes"; then
532 echo '#include <sys/stat.h>' >> $outfile
534 if test "x$rb_time_h" = "xyes"; then
535 echo '#include <time.h>' >> $outfile
538 if test "x$rb_sys_socket_h" = "xyes"; then
539 echo '#include <sys/socket.h>' >> $outfile
542 if test "x$rb_netinet_in_h" = "xyes"; then
543 echo '#include <netinet/in.h>' >> $outfile
546 if test "x$rb_arpa_inet_h" = "xyes"; then
547 echo '#include <arpa/inet.h>' >> $outfile
550 if test "x$rb_unistd_h" = "xyes"; then
551 echo '#include <unistd.h>' >> $outfile
554 if test "x$rb_crypt_h" = "xyes"; then
555 echo '#include <crypt.h>' >> $outfile
558 if test "x$rb_errno_h" = "xyes"; then
559 echo '#include <errno.h>' >> $outfile
562 echo "typedef $rb_socklen_t rb_socklen_t;" >> $outfile
565 if test "x$rb_sockaddr_sa_len" = "xyes"; then
566 echo '#define RB_SOCKADDR_HAS_SA_LEN 1' >> $outfile
569 if test "x$rb_sockaddr_storage" = "xyes"; then
570 echo '#define rb_sockaddr_storage sockaddr_storage' >> $outfile
572 echo 'struct rb_sockaddr_storage { uint8_t _padding[[128]]; };' >> $outfile
575 cat >> $outfile <<\_______EOF
576 #endif /* __LIBRB_CONFIG_H */
579 if cmp -s $outfile include/librb-config.h; then
580 AC_MSG_NOTICE([include/librb-config.h is unchanged])
583 ${rb_mv} $outfile include/librb-config.h
587 if test x$ac_cv_header_stdc = xyes; then
590 if test x$ac_cv_header_stdlib_h = xyes; then
591 rb_header_stdlib_h=yes
593 if test x$ac_cv_header_string_h = xyes; then
594 rb_header_string_h=yes
596 if test x$ac_cv_header_memory_h = xyes; then
597 rb_header_memory_h=yes
599 if test "x${ac_cv_working_alloca_h+set}" = xset ; then
600 rb_alloca_h="$ac_cv_working_alloca_h"
602 rb_alloc_h="$ac_cv_header_alloca_h"
604 if test x$ac_cv_member_struct_sockaddr_sa_len = xyes; then
605 rb_sockaddr_sa_len=yes
607 if test x$ac_cv_header_sys_socket_h = xyes; then
610 if test x$ac_cv_header_sys_types_h = xyes; then
613 if test x$ac_cv_header_sys_stat_h = xyes; then
616 if test x$ac_cv_header_sys_time_h = xyes; then
619 if test x$ac_cv_header_time = xyes; then
623 if test x$ac_cv_header_stdint_h = xyes; then
626 if test x$ac_cv_header_inttypes_h = xyes; then
629 if test x$ac_cv_header_netinet_in_h = xyes; then
633 if test x$ac_cv_header_crypt_h = xyes; then
636 if test x$ac_cv_header_errno_h = xyes; then
639 if test x$ac_cv_header_unistd_h = xyes; then
642 if test x$ac_cv_header_windows_h = xyes; then
645 if test x$ac_cv_header_winsock2_h = xyes; then
649 rb_socklen_t=$rb_socklen_t
651 if test "x$rb_have_sockaddr_storage" = "xyes"; then
652 rb_sockaddr_storage="yes"
654 rb_sockaddr_storage="no"
657 rb_have_ipv6="$have_v6"
676 dnl Make it look sexay!
679 echo "Compiling $PACKAGE_NAME $PACKAGE_VERSION"
682 echo "Installing into: $prefix"
684 echo "IPv6 support ................... $have_v6"
685 echo "Assert debugging ............... $assert"
686 echo "SSL Type........................ $SSL_TYPE"