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 netinet/sctp.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_CHECK_TYPES([struct sockaddr_storage],[
176 rb_have_sockaddr_storage=yes
178 #include <sys/types.h>
179 #include <sys/socket.h>
183 dnl Check for stdarg.h - if we cant find it, halt configure
184 AC_CHECK_HEADER(stdarg.h, , [AC_MSG_ERROR([** stdarg.h could not be found - librb will not compile without it **])])
186 AC_CHECK_TYPE([sa_family_t], [],
187 [AC_DEFINE(sa_family_t, [u_int16_t], [If system does not define sa_family_t, define it here.])],
188 [[#include <sys/types.h>
189 #include <sys/socket.h>]])
192 dnl check for various functions...
193 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])
195 AC_SEARCH_LIBS(dlinfo, dl, AC_DEFINE(HAVE_DLINFO, 1, [Define if you have dlinfo]))
196 AC_SEARCH_LIBS(nanosleep, rt posix4, AC_DEFINE(HAVE_NANOSLEEP, 1, [Define if you have nanosleep]))
197 AC_SEARCH_LIBS(timer_create, rt, AC_DEFINE(HAVE_TIMER_CREATE, 1, [Define if you have timer_create]))
198 RB_CHECK_TIMER_CREATE
199 RB_CHECK_TIMERFD_CREATE
205 AC_MSG_CHECKING(for /dev/poll)
206 if test -c "/dev/poll"; then
208 AC_DEFINE(HAVE_DEVPOLL, [1], [Define to 1 if you have devpoll])
214 if test "$is_mingw" = "yes"; then
215 AC_DEFINE(HAVE_WIN32, [1], [Define to 1 if you are on windows])
220 AC_MSG_CHECKING(for OpenSSL)
221 AC_ARG_ENABLE(openssl,
222 [AC_HELP_STRING([--enable-openssl[=DIR]],[Enable OpenSSL support (DIR optional).])
223 AC_HELP_STRING([--disable-openssl],[Disable OpenSSL support.])],
224 [cf_enable_openssl=$enableval],
225 [cf_enable_openssl="auto"])
227 if test "$cf_enable_openssl" != "no" ; then
228 cf_openssl_basedir=""
229 if test "$cf_enable_openssl" != "auto" &&
230 test "$cf_enable_openssl" != "yes" ; then
231 dnl Support for --enable-openssl=/some/place
232 cf_openssl_basedir="`echo ${cf_enable_openssl} | sed 's/\/$//'`"
234 dnl Do the auto-probe here. Check some common directory paths.
235 for dirs in /usr/local/ssl /usr/pkg /usr/local \
236 /usr/local/openssl ; do
237 if test -f "${dirs}/include/openssl/opensslv.h" ; then
238 cf_openssl_basedir="${dirs}"
244 dnl Now check cf_openssl_found to see if we found anything.
245 if test ! -z "$cf_openssl_basedir"; then
246 if test -f "${cf_openssl_basedir}/include/openssl/opensslv.h" ; then
247 SSL_CFLAGS="-I${cf_openssl_basedir}/include"
248 SSL_LIBS="-L${cf_openssl_basedir}/lib"
250 dnl OpenSSL wasn't found in the directory specified. Naughty
252 cf_openssl_basedir=""
255 dnl Check for stock FreeBSD 4.x and 5.x systems, since their files
256 dnl are in /usr/include and /usr/lib. In this case, we don't want to
257 dnl change INCLUDES or LIBS, but still want to enable OpenSSL.
258 dnl We can't do this check above, because some people want two versions
259 dnl of OpenSSL installed (stock FreeBSD 4.x/5.x and /usr/local/ssl)
260 dnl and they want /usr/local/ssl to have preference.
261 if test -f "/usr/include/openssl/opensslv.h" ; then
262 cf_openssl_basedir="/usr"
266 dnl If we have a basedir defined, then everything is okay. Otherwise,
267 dnl we have a problem.
268 if test ! -z "$cf_openssl_basedir"; then
269 AC_MSG_RESULT($cf_openssl_basedir)
270 cf_enable_openssl="yes"
272 AC_MSG_RESULT([not found. Specify a correct path?])
273 cf_enable_openssl="no"
275 unset cf_openssl_basedir
277 dnl If --disable-openssl was specified
278 AC_MSG_RESULT(disabled)
281 save_CPPFLAGS="$CPPFLAGS"
282 CPPFLAGS="$CPPFLAGS $SSL_CFLAGS"
284 LIBS="$LIBS $SSL_LIBS"
285 if test "$cf_enable_openssl" != no; then
286 dnl Check OpenSSL version (must be 0.9.7 or above!)
287 AC_MSG_CHECKING(for OpenSSL 0.9.7 or above)
290 [#include <openssl/opensslv.h>
291 #include <stdlib.h>],
292 [[if (OPENSSL_VERSION_NUMBER >= 0x00907000)
293 exit(0); else exit(1);]])],
294 cf_enable_openssl=yes,
295 cf_enable_openssl=no,
296 cf_enable_openssl=no)
298 if test "$cf_enable_openssl" != no; then
301 AC_MSG_RESULT(no - OpenSSL support disabled)
307 if test "$cf_enable_openssl" != no; then
308 CPPFLAGS="$CPPFLAGS $SSL_LIBS"
309 AC_CHECK_LIB(crypto, RAND_status,
310 [cf_enable_openssl=yes],
311 [cf_enable_openssl=no])
314 if test "$cf_enable_openssl" != no; then
315 CPPFLAGS="$CPPFLAGS $SSL_LIBS"
316 AC_CHECK_LIB(ssl, SSL_read,
317 [SSL_LIBS="$SSL_LIBS -lssl -lcrypto"],
318 [cf_enable_openssl=no], [-lcrypto])
323 AC_ARG_ENABLE(mbedtls,
324 [AC_HELP_STRING([--enable-mbedtls], [Enable mbedTLS support.])
325 AC_HELP_STRING([--disable-mbedtls], [Disable mbedTLS support.])],
326 [cf_enable_mbedtls=$enableval],
327 [cf_enable_mbedtls="auto"])
329 if test "$cf_enable_mbedtls" != no; then
330 save_CPPFLAGS="$CPPFLAGS"
332 LIBS="$LIBS $MBEDTLS_LIBS"
333 AC_CHECK_LIB(mbedtls, mbedtls_ssl_init, [
334 MBEDTLS_LIBS="$MBEDTLS_LIBS -lmbedtls -lmbedx509 -lmbedcrypto"
335 cf_enable_mbedtls=yes
336 ], [cf_enable_mbedtls=no], [-lmbedx509 -lmbedcrypto])
340 AC_MSG_CHECKING(for GnuTLS)
341 AC_ARG_ENABLE(gnutls,
342 [AC_HELP_STRING([--enable-gnutls],[Enable GnuTLS support.])
343 AC_HELP_STRING([--disable-gnutls],[Disable GnuTLS support.])],
344 [cf_enable_gnutls=$enableval],
345 [cf_enable_gnutls="auto"])
347 if test "$cf_enable_gnutls" != no; then
348 PKG_CHECK_MODULES(GNUTLS, [gnutls], [
349 cf_enable_gnutls="yes"
350 ], [cf_enable_gnutls="no"])
353 dnl mbed TLS is given highest preference when no specified TLS library is provided
354 if test "$cf_enable_openssl" = "auto" -a "$cf_enable_mbedtls" = "yes"; then
355 cf_enable_openssl="no"
358 if test "$cf_enable_gnutls" = "auto" -a "$cf_enable_openssl" = "yes" -a "$cf_enable_mbedtls" = "yes"; then
359 cf_enable_gnutls="no"
362 if test x"$cf_enable_openssl" != xno; then
363 AC_DEFINE(HAVE_OPENSSL,1,[Has OpenSSL])
369 elif test x"$cf_enable_mbedtls" != xno; then
370 AC_DEFINE(HAVE_MBEDTLS, 1, [Has mbedTLS])
376 elif test x"$cf_enable_gnutls" != xno; then
377 AC_DEFINE(HAVE_GNUTLS, 1, [Has GnuTLS])
388 CPPFLAGS="$save_CPPFLAGS"
391 dnl End OpenSSL detection
395 AC_ARG_WITH(sctp-path,
396 AC_HELP_STRING([--with-sctp-path=DIR],[Path to libsctp.so for SCTP support.]),
397 [LIBS="$LIBS -L$withval"],)
400 AC_HELP_STRING([--disable-sctp],[Disable SCTP support]),
401 [sctp=$enableval],[sctp=yes])
403 if test "$sctp" = yes; then
405 AC_CHECK_HEADER(netinet/sctp.h, [
406 AC_CHECK_LIB(sctp, sctp_bindx,
408 AC_SUBST(LIBSCTP_LD, -lsctp)
409 AC_DEFINE(HAVE_LIBSCTP, 1, [Define to 1 if libsctp (-lsctp) is available.])
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 -Wno-unused-parameter"],[])
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_windows_h" = "xyes"; then
494 echo '#define WIN32_LEAN_AND_MEAN 1' >> $outfile
495 echo '#include <windows.h>' >> $outfile
496 echo '#include <winsock2.h>' >> $outfile
497 echo '#include <ws2tcpip.h>' >> $outfile
498 echo '#include <iphlpapi.h>' >> $outfile
501 if test "x$rb_alloca_h" = "xyes"; then
502 echo '#define RB_HAVE_ALLOCA_H 1' >> $outfile
505 if test "x$rb_header_stdc" = "xyes"; then
506 echo '#include <stdlib.h>' >> $outfile
507 echo '#include <stddef.h>' >> $outfile
508 elif test "x$rb_header_stdlib" = "xyes"; then
509 echo '#include <stdlib.h>' >> $outfile
512 if test "x$rb_header_string_h" = "xyes"; then
513 echo '#include <string.h>' >> $outfile
516 if test "x$rb_stdint_h" = "xyes"; then
517 echo '#include <stdint.h>' >> $outfile
520 if test "x$rb_inttypes_h" = "xyes"; then
521 echo '#include <inttypes.h>' >> $outfile
524 if test "x$rb_sys_types_h" = "xyes"; then
525 echo '#include <sys/types.h>' >> $outfile
527 if test "x$rb_sys_time_h" = "xyes"; then
528 echo '#include <sys/time.h>' >> $outfile
530 if test "x$rb_sys_stat_h" = "xyes"; then
531 echo '#include <sys/stat.h>' >> $outfile
533 if test "x$rb_time_h" = "xyes"; then
534 echo '#include <time.h>' >> $outfile
537 if test "x$rb_sys_socket_h" = "xyes"; then
538 echo '#include <sys/socket.h>' >> $outfile
541 if test "x$rb_netinet_in_h" = "xyes"; then
542 echo '#include <netinet/in.h>' >> $outfile
545 if test "x$rb_netinet_tcp_h" == "xyes"; then
546 echo '#include <netinet/tcp.h>' >> $outfile
549 if test "x$rb_netinet_sctp_h" == "xyes"; then
550 echo '#include <netinet/sctp.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
642 if test x$ac_cv_header_netinet_sctp_h = xyes; then
643 rb_netinet_sctp_h=yes
646 if test x$ac_cv_header_crypt_h = xyes; then
649 if test x$ac_cv_header_errno_h = xyes; then
652 if test x$ac_cv_header_unistd_h = xyes; then
655 if test x$ac_cv_header_windows_h = xyes; then
658 if test x$ac_cv_header_winsock2_h = xyes; then
662 rb_socklen_t=$rb_socklen_t
664 if test "x$rb_have_sockaddr_storage" = "xyes"; then
665 rb_sockaddr_storage="yes"
667 rb_sockaddr_storage="no"
687 dnl Make it look sexay!
690 echo "Compiling $PACKAGE_NAME $PACKAGE_VERSION"
693 echo "Installing into: $prefix"
695 echo "Assert debugging ............... $assert"
696 echo "SSL Type........................ $SSL_TYPE"
697 echo "SCTP............................ $sctp"