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 netinet/tcp.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])
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>
147 #include <ws2tcpip.h>
149 int getpeername (int, $arg2 *, $t *);
152 getpeername(0,0,&len);
160 if test "x$rb_cv_socklen_t" = x; then
161 AC_MSG_WARN([Cannot find a type to use in place of socklen_t using int])
165 AC_MSG_RESULT($rb_cv_socklen_t)],
166 [#include <sys/types.h>
167 #include <sys/socket.h>])
169 rb_socklen_t=$rb_cv_socklen_t
175 AC_ARG_ENABLE(ipv6,AC_HELP_STRING([--disable-ipv6],[Disable IPv6 support]),[ipv6=$enableval],[ipv6=yes])
177 if test x$ipv6 != xyes; then
183 AC_MSG_NOTICE([Disabling IPv6 support: PF_INET6 not found])
187 if test "X$have_v6" = "Xyes"; then
188 RB_TYPE_STRUCT_SOCKADDR_IN6([], [
189 AC_MSG_NOTICE([Disabling IPv6 support: struct sockaddr_in6 not found])
196 AC_CHECK_TYPES([struct sockaddr_storage],[
197 rb_have_sockaddr_storage=yes
199 #include <sys/types.h>
200 #include <sys/socket.h>
204 dnl Check for stdarg.h - if we cant find it, halt configure
205 AC_CHECK_HEADER(stdarg.h, , [AC_MSG_ERROR([** stdarg.h could not be found - librb will not compile without it **])])
207 AC_CHECK_TYPE([sa_family_t], [],
208 [AC_DEFINE(sa_family_t, [u_int16_t], [If system does not define sa_family_t, define it here.])],
209 [[#include <sys/types.h>
210 #include <sys/socket.h>]])
213 dnl check for various functions...
214 AC_CHECK_FUNCS([snprintf vsnprintf socketpair gettimeofday writev sendmsg gmtime_r strtok_r usleep posix_spawn getexecname strlcpy strlcat strnlen strcasestr strcasecmp strncasecmp fstat signalfd select poll kevent port_create epoll_ctl arc4random getrusage timerfd_create])
216 AC_SEARCH_LIBS(dlinfo, dl, AC_DEFINE(HAVE_DLINFO, 1, [Define if you have dlinfo]))
217 AC_SEARCH_LIBS(nanosleep, rt posix4, AC_DEFINE(HAVE_NANOSLEEP, 1, [Define if you have nanosleep]))
218 AC_SEARCH_LIBS(timer_create, rt, AC_DEFINE(HAVE_TIMER_CREATE, 1, [Define if you have timer_create]))
219 RB_CHECK_TIMER_CREATE
220 RB_CHECK_TIMERFD_CREATE
226 AC_MSG_CHECKING(for /dev/poll)
227 if test -c "/dev/poll"; then
229 AC_DEFINE(HAVE_DEVPOLL, [1], [Define to 1 if you have devpoll])
235 if test "$is_mingw" = "yes"; then
236 AC_DEFINE(HAVE_WIN32, [1], [Define to 1 if you are on windows])
241 AC_MSG_CHECKING(for OpenSSL)
242 AC_ARG_ENABLE(openssl,
243 [AC_HELP_STRING([--enable-openssl[=DIR]],[Enable OpenSSL support (DIR optional).])
244 AC_HELP_STRING([--disable-openssl],[Disable OpenSSL support.])],
245 [cf_enable_openssl=$enableval],
246 [cf_enable_openssl="auto"])
248 if test "$cf_enable_openssl" != "no" ; then
249 cf_openssl_basedir=""
250 if test "$cf_enable_openssl" != "auto" &&
251 test "$cf_enable_openssl" != "yes" ; then
252 dnl Support for --enable-openssl=/some/place
253 cf_openssl_basedir="`echo ${cf_enable_openssl} | sed 's/\/$//'`"
255 dnl Do the auto-probe here. Check some common directory paths.
256 for dirs in /usr/local/ssl /usr/pkg /usr/local \
257 /usr/local/openssl ; do
258 if test -f "${dirs}/include/openssl/opensslv.h" ; then
259 cf_openssl_basedir="${dirs}"
265 dnl Now check cf_openssl_found to see if we found anything.
266 if test ! -z "$cf_openssl_basedir"; then
267 if test -f "${cf_openssl_basedir}/include/openssl/opensslv.h" ; then
268 SSL_CFLAGS="-I${cf_openssl_basedir}/include"
269 SSL_LIBS="-L${cf_openssl_basedir}/lib"
271 dnl OpenSSL wasn't found in the directory specified. Naughty
273 cf_openssl_basedir=""
276 dnl Check for stock FreeBSD 4.x and 5.x systems, since their files
277 dnl are in /usr/include and /usr/lib. In this case, we don't want to
278 dnl change INCLUDES or LIBS, but still want to enable OpenSSL.
279 dnl We can't do this check above, because some people want two versions
280 dnl of OpenSSL installed (stock FreeBSD 4.x/5.x and /usr/local/ssl)
281 dnl and they want /usr/local/ssl to have preference.
282 if test -f "/usr/include/openssl/opensslv.h" ; then
283 cf_openssl_basedir="/usr"
287 dnl If we have a basedir defined, then everything is okay. Otherwise,
288 dnl we have a problem.
289 if test ! -z "$cf_openssl_basedir"; then
290 AC_MSG_RESULT($cf_openssl_basedir)
291 cf_enable_openssl="yes"
293 AC_MSG_RESULT([not found. Specify a correct path?])
294 cf_enable_openssl="no"
296 unset cf_openssl_basedir
298 dnl If --disable-openssl was specified
299 AC_MSG_RESULT(disabled)
302 save_CPPFLAGS="$CPPFLAGS"
303 CPPFLAGS="$CPPFLAGS $SSL_CFLAGS"
305 LIBS="$LIBS $SSL_LIBS"
306 if test "$cf_enable_openssl" != no; then
307 dnl Check OpenSSL version (must be 0.9.7 or above!)
308 AC_MSG_CHECKING(for OpenSSL 0.9.7 or above)
311 [#include <openssl/opensslv.h>
312 #include <stdlib.h>],
313 [[if (OPENSSL_VERSION_NUMBER >= 0x00907000)
314 exit(0); else exit(1);]])],
315 cf_enable_openssl=yes,
316 cf_enable_openssl=no,
317 cf_enable_openssl=no)
319 if test "$cf_enable_openssl" != no; then
322 AC_MSG_RESULT(no - OpenSSL support disabled)
328 if test "$cf_enable_openssl" != no; then
329 CPPFLAGS="$CPPFLAGS $SSL_LIBS"
330 AC_CHECK_LIB(crypto, RAND_status,
331 [cf_enable_openssl=yes],
332 [cf_enable_openssl=no])
335 if test "$cf_enable_openssl" != no; then
336 CPPFLAGS="$CPPFLAGS $SSL_LIBS"
337 AC_CHECK_LIB(ssl, SSL_read,
338 [SSL_LIBS="$SSL_LIBS -lssl -lcrypto"],
339 [cf_enable_openssl=no], [-lcrypto])
344 AC_ARG_ENABLE(mbedtls,
345 [AC_HELP_STRING([--enable-mbedtls], [Enable mbedTLS support.])
346 AC_HELP_STRING([--disable-mbedtls], [Disable mbedTLS support.])],
347 [cf_enable_mbedtls=$enableval],
348 [cf_enable_mbedtls="auto"])
350 if test "$cf_enable_mbedtls" != no; then
351 save_CPPFLAGS="$CPPFLAGS"
353 LIBS="$LIBS $MBEDTLS_LIBS"
354 AC_CHECK_LIB(mbedtls, mbedtls_ssl_init, [
355 MBEDTLS_LIBS="$MBEDTLS_LIBS -lmbedtls -lmbedcrypto -lmbedx509"
356 cf_enable_mbedtls=yes
357 ], [cf_enable_mbedtls=no], [-lmbedcrypto -lmbedx509])
361 AC_MSG_CHECKING(for GnuTLS)
362 AC_ARG_ENABLE(gnutls,
363 [AC_HELP_STRING([--enable-gnutls],[Enable GnuTLS support.])
364 AC_HELP_STRING([--disable-gnutls],[Disable GnuTLS support.])],
365 [cf_enable_gnutls=$enableval],
366 [cf_enable_gnutls="auto"])
368 if test "$cf_enable_gnutls" != no; then
369 PKG_CHECK_MODULES(GNUTLS, [gnutls], [
370 cf_enable_gnutls="yes"
371 ], [cf_enable_gnutls="no"])
374 dnl mbed TLS is given highest preference when no specified TLS library is provided
375 if test "$cf_enable_openssl" = "auto" -a "$cf_enable_mbedtls" = "yes"; then
376 cf_enable_openssl="no"
379 if test "$cf_enable_gnutls" = "auto" -a "$cf_enable_openssl" = "yes" -a "$cf_enable_mbedtls" = "yes"; then
380 cf_enable_gnutls="no"
383 if test x"$cf_enable_openssl" != xno; then
384 AC_DEFINE(HAVE_OPENSSL,1,[Has OpenSSL])
390 elif test x"$cf_enable_mbedtls" != xno; then
391 AC_DEFINE(HAVE_MBEDTLS, 1, [Has mbedTLS])
397 elif test x"$cf_enable_gnutls" != xno; then
398 AC_DEFINE(HAVE_GNUTLS, 1, [Has GnuTLS])
409 CPPFLAGS="$save_CPPFLAGS"
412 dnl End OpenSSL detection
417 dnl Debug-related options
418 dnl =====================
420 AC_ARG_ENABLE(assert,
421 AC_HELP_STRING([--enable-assert],[Enable assert(). Choose between soft(warnings) and hard(aborts the daemon)]),
422 [assert=$enableval], [assert=no])
424 if test "$assert" = no; then
425 AC_DEFINE(NDEBUG, 1, [Define this to disable debugging support.])
426 elif test "$assert" = soft; then
427 AC_DEFINE(SOFT_ASSERT, 1, [Define this to enable soft asserts.])
428 AC_DEFINE(NDEBUG, 1, [Define this to disable debugging support.])
429 elif test "$assert" = yes; then
433 AC_MSG_CHECKING(if you want to do a profile build)
434 AC_ARG_ENABLE(profile,
435 AC_HELP_STRING([--enable-profile],[Enable profiling]),
436 [profile=$enableval], [profile=no])
438 if test "$profile" = yes; then
439 if test "$ac_cv_c_compiler_gnu" = yes; then
440 CFLAGS="$CFLAGS -pg -static"
441 AC_MSG_RESULT([yes, adding -pg -static])
442 AC_DEFINE(RB_PROFILE, 1, [Defined to mark profiling is enabled])
444 AC_MSG_RESULT([no, profile builds only work with gcc])
450 AC_ARG_ENABLE(warnings,
451 AC_HELP_STRING([--enable-warnings],[Enable all sorts of warnings for debugging.]),
452 [CFLAGS="$CFLAGS -Wall -Werror -Wcast-qual -Wmissing-declarations -Wmissing-prototypes -Wnested-externs -Wshadow -Wwrite-strings -W -Wno-unused -Wunused-function -Wunused-variable"],[])
460 AC_SUBST(GNUTLS_CFLAGS)
461 AC_SUBST(GNUTLS_LIBS)
462 AC_SUBST(MBEDTLS_CFLAGS)
463 AC_SUBST(MBEDTLS_LIBS)
465 if test "$prefix" = "NONE"; then
466 AC_DEFINE_UNQUOTED(RB_PREFIX, "$ac_default_prefix", [Prefix where librb is installed.])
470 dnl Don't get bitten by Cygwin's stupidity if the user specified
471 dnl a custom prefix with a trailing slash
473 prefix=`echo $prefix | sed 's/\/$//'`
474 AC_DEFINE_UNQUOTED(RB_PREFIX, "$prefix", [Prefix where librb is installed.])
480 AC_CONFIG_COMMANDS([include/librb-config.h],
482 outfile=include/librb-config.h.tmp
483 cat > $outfile <<\_______EOF
485 * librb-config.h: librb config file. Please modify configure.ac
488 #ifndef __LIBRB_CONFIG_H
489 #define __LIBRB_CONFIG_H
493 if test "x$rb_have_ipv6" = "xyes"; then
494 echo "#define RB_IPV6 1" >> $outfile
497 if test "x$rb_windows_h" = "xyes"; then
498 echo '#define WIN32_LEAN_AND_MEAN 1' >> $outfile
499 echo '#include <windows.h>' >> $outfile
500 echo '#include <winsock2.h>' >> $outfile
501 echo '#include <ws2tcpip.h>' >> $outfile
502 echo '#include <iphlpapi.h>' >> $outfile
505 if test "x$rb_alloca_h" = "xyes"; then
506 echo '#define RB_HAVE_ALLOCA_H 1' >> $outfile
509 if test "x$rb_header_stdc" = "xyes"; then
510 echo '#include <stdlib.h>' >> $outfile
511 echo '#include <stddef.h>' >> $outfile
512 elif test "x$rb_header_stdlib" = "xyes"; then
513 echo '#include <stdlib.h>' >> $outfile
516 if test "x$rb_header_string_h" = "xyes"; then
517 echo '#include <string.h>' >> $outfile
520 if test "x$rb_stdint_h" = "xyes"; then
521 echo '#include <stdint.h>' >> $outfile
524 if test "x$rb_inttypes_h" = "xyes"; then
525 echo '#include <inttypes.h>' >> $outfile
528 if test "x$rb_sys_types_h" = "xyes"; then
529 echo '#include <sys/types.h>' >> $outfile
531 if test "x$rb_sys_time_h" = "xyes"; then
532 echo '#include <sys/time.h>' >> $outfile
534 if test "x$rb_sys_stat_h" = "xyes"; then
535 echo '#include <sys/stat.h>' >> $outfile
537 if test "x$rb_time_h" = "xyes"; then
538 echo '#include <time.h>' >> $outfile
541 if test "x$rb_sys_socket_h" = "xyes"; then
542 echo '#include <sys/socket.h>' >> $outfile
545 if test "x$rb_netinet_in_h" = "xyes"; then
546 echo '#include <netinet/in.h>' >> $outfile
549 if test "x$rb_netinet_tcp_h" == "xyes"; then
550 echo '#include <netinet/tcp.h>' >> $outfile
553 if test "x$rb_arpa_inet_h" = "xyes"; then
554 echo '#include <arpa/inet.h>' >> $outfile
557 if test "x$rb_unistd_h" = "xyes"; then
558 echo '#include <unistd.h>' >> $outfile
561 if test "x$rb_crypt_h" = "xyes"; then
562 echo '#include <crypt.h>' >> $outfile
565 if test "x$rb_errno_h" = "xyes"; then
566 echo '#include <errno.h>' >> $outfile
569 echo "typedef $rb_socklen_t rb_socklen_t;" >> $outfile
572 if test "x$rb_sockaddr_sa_len" = "xyes"; then
573 echo '#define RB_SOCKADDR_HAS_SA_LEN 1' >> $outfile
576 if test "x$rb_sockaddr_storage" = "xyes"; then
577 echo '#define rb_sockaddr_storage sockaddr_storage' >> $outfile
579 echo 'struct rb_sockaddr_storage { uint8_t _padding[[128]]; };' >> $outfile
582 cat >> $outfile <<\_______EOF
583 #endif /* __LIBRB_CONFIG_H */
586 if cmp -s $outfile include/librb-config.h; then
587 AC_MSG_NOTICE([include/librb-config.h is unchanged])
590 ${rb_mv} $outfile include/librb-config.h
594 if test x$ac_cv_header_stdc = xyes; then
597 if test x$ac_cv_header_stdlib_h = xyes; then
598 rb_header_stdlib_h=yes
600 if test x$ac_cv_header_string_h = xyes; then
601 rb_header_string_h=yes
603 if test x$ac_cv_header_memory_h = xyes; then
604 rb_header_memory_h=yes
606 if test "x${ac_cv_working_alloca_h+set}" = xset ; then
607 rb_alloca_h="$ac_cv_working_alloca_h"
609 rb_alloc_h="$ac_cv_header_alloca_h"
611 if test x$ac_cv_member_struct_sockaddr_sa_len = xyes; then
612 rb_sockaddr_sa_len=yes
614 if test x$ac_cv_header_sys_socket_h = xyes; then
617 if test x$ac_cv_header_sys_types_h = xyes; then
620 if test x$ac_cv_header_sys_stat_h = xyes; then
623 if test x$ac_cv_header_sys_time_h = xyes; then
626 if test x$ac_cv_header_time = xyes; then
630 if test x$ac_cv_header_stdint_h = xyes; then
633 if test x$ac_cv_header_inttypes_h = xyes; then
636 if test x$ac_cv_header_netinet_in_h = xyes; then
639 if test x$ac_cv_header_netinet_tcp_h = xyes; then
643 if test x$ac_cv_header_crypt_h = xyes; then
646 if test x$ac_cv_header_errno_h = xyes; then
649 if test x$ac_cv_header_unistd_h = xyes; then
652 if test x$ac_cv_header_windows_h = xyes; then
655 if test x$ac_cv_header_winsock2_h = xyes; then
659 rb_socklen_t=$rb_socklen_t
661 if test "x$rb_have_sockaddr_storage" = "xyes"; then
662 rb_sockaddr_storage="yes"
664 rb_sockaddr_storage="no"
667 rb_have_ipv6="$have_v6"
686 dnl Make it look sexay!
689 echo "Compiling $PACKAGE_NAME $PACKAGE_VERSION"
692 echo "Installing into: $prefix"
694 echo "IPv6 support ................... $have_v6"
695 echo "Assert debugging ............... $assert"
696 echo "SSL Type........................ $SSL_TYPE"