dnl Process this file with autoconf to produce a configure script. dnl $Id: configure.in 7811 2008-04-30 07:06:58Z iulius $ dnl dnl Please try to follow GNU conventions and autoconf manual conventions as dnl much as possible in this file so that any macros we develop can be easily dnl contributed to the macro archive and possibly rolled into future versions dnl of autoconf so that we can stop supporting them. This means, for example, dnl that code excerpts should probably follow the GNU coding standards rather dnl than INN's. dnl dnl The macro archive is at . Due to dnl the submission format and significant changes to autoconf's internal dnl architecture and building-block macros, I'm waiting until INN is switched dnl to autoconf 2.52 or later and we can convert this file into a bunch of dnl separate files before submitting macros to that archive. dnl dnl If a check is any way non-trivial, please package it up in a macro with dnl AC_DEFUN. This will allow us to easily break up this (far too long) file dnl into a directory full of .m4 files for particular checks once we switch to dnl autoconf 2.52 or later. Please also put any long code blocks into a dnl separate macro rather than in-line in the test macro; this will make dnl quoting issues much easier. See the existing tests for details on how to dnl do this. dnl dnl Try to do as much with AC_DEFINE and as little with AC_SUBST as is dnl reasonable; obviously, makefile things like library paths and so forth and dnl paths to programs have to use AC_SUBST, but any compile-time parameters dnl are easier to handle with AC_DEFINE. (And AC_SUBST is slower.) dnl dnl And remember: If you don't have any alternative available if your check dnl for something fails, and there's no purpose served in aborting configure dnl instead of the compile if what you're checking for is missing, don't dnl bother checking for it. Compile-time errors often produce a lot more dnl useful information for someone debugging a problem than configure-time dnl errors. AC_REVISION($Revision: 7811 $)dnl AC_PREREQ(2.13) AC_INIT(Makefile.global.in) AC_CONFIG_AUX_DIR(support) AC_PREFIX_DEFAULT(/usr/local/news) dnl Make sure $prefix is set so that we can use it internally. test x"$prefix" = xNONE && prefix="$ac_default_prefix" dnl Linking against in-tree libraries need to know the current directory (the dnl top of the build directory, not the source directory). builddir=`pwd` AC_SUBST(builddir) dnl Earlier versions of INN used --with-largefiles, which was the wrong flag dnl from the perspective of what --with and --enable are supposed to mean. dnl Catch the old usage and error out. if test x"$with_largefiles" != x ; then AC_MSG_ERROR([Use --enable-largefiles instead of --with-largefiles]) fi dnl Used to check whether -o can be provided with -c with the chosen dnl compiler. We need this if we're not using libtool so that object files dnl can be built in subdirectories. This macro is stolen shamelessly from dnl the libtool macros; there's a better version in Autoconf that we should dnl eventually use that tests twice. AC_DEFUN([INN_PROG_CC_C_O], [AC_REQUIRE([AC_OBJEXT]) AC_MSG_CHECKING([if $CC supports -c -o file.$ac_objext]) AC_CACHE_VAL([inn_cv_compiler_c_o], [rm -f -r conftest 2>/dev/null mkdir conftest cd conftest echo "int some_variable = 0;" > conftest.$ac_ext mkdir out # According to Tom Tromey, Ian Lance Taylor reported there are C compilers # that will create temporary files in the current directory regardless of # the output directory. Thus, making CWD read-only will cause this test # to fail, enabling locking or at least warning the user not to do parallel # builds. chmod -w . save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -o out/conftest2.$ac_objext" compiler_c_o=no if { (eval $ac_compile) 2> out/conftest.err; } \ && test -s out/conftest2.$ac_objext; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test -s out/conftest.err; then inn_cv_compiler_c_o=no else inn_cv_compiler_c_o=yes fi else # Append any errors to the config.log. cat out/conftest.err 1>&AC_FD_CC inn_cv_compiler_c_o=no fi CFLAGS="$save_CFLAGS" chmod u+w . rm -f conftest* out/* rmdir out cd .. rmdir conftest rm -f -r conftest 2>/dev/null]) compiler_c_o=$inn_cv_compiler_c_o AC_MSG_RESULT([$compiler_c_o])]) dnl A few tests need to happen before any of the libtool tests in order to dnl avoid error messages. We therefore lift them up to the top of the file. AC_PROG_CC AC_AIX AC_ISC_POSIX INN_PROG_CC_C_O dnl Check to see if the user wants to use libtool. We only invoke the libtool dnl setup macros if they do. Keep this call together with the libtool setup dnl so that the arguments to configure will be together in configure --help. inn_use_libtool=no AC_ARG_ENABLE(libtool, [ --enable-libtool Use libtool for lib generation [default=no]], if test "$enableval" = yes ; then inn_use_libtool=yes fi) if test x"$inn_use_libtool" = xyes ; then AC_PROG_LIBTOOL EXTLIB='la' EXTOBJ='lo' LIBTOOL='$(top)/libtool' LIBTOOLCC='$(top)/libtool --mode=compile' LIBTOOLLD='$(top)/libtool --mode=link' CCOUTPUT='-c -o $@ $<' else AC_CANONICAL_HOST EXTLIB='a' EXTOBJ='o' LIBTOOL='' LIBTOOLCC='' LIBTOOLLD='' if test x"$compiler_c_o" = xyes ; then CCOUTPUT='-c -o $@ $<' else CCOUTPUT='-c $< && if test x"$(@F)" != x"$@" ; then mv $(@F) $@ ; fi' fi AC_SUBST(LIBTOOL) fi AC_SUBST(EXTLIB) AC_SUBST(EXTOBJ) AC_SUBST(LIBTOOLCC) AC_SUBST(LIBTOOLLD) AC_SUBST(CCOUTPUT) dnl INN has quite a few more configurable paths than autoconf supports by dnl default. For right now, those additional paths are configured with dnl --with-*-dir options. This is the generic macro for those arguments; it dnl takes the name of the directory, the path relative to $prefix if none dnl given to configure, the variable to set, and the help string. AC_DEFUN([INN_ARG_DIR], [AC_ARG_WITH([$1-dir], [$4], [$3=$with_$1_dir], [$3=$prefix/$2]) AC_SUBST($3)]) dnl And here are all the paths. dnl dnl FIXME: We should honor bindir, libdir, includedir, and mandir at the dnl least, and we should use libdir over --with-lib-dir. INN_ARG_DIR(control, bin/control, CONTROLDIR, [ --with-control-dir=PATH Path for control programs [PREFIX/bin/control]]) INN_ARG_DIR(db, db, DBDIR, [ --with-db-dir=PATH Path for news database files [PREFIX/db]]) INN_ARG_DIR(doc, doc, DOCDIR, [ --with-doc-dir=PATH Path for news documentation [PREFIX/doc]]) INN_ARG_DIR(etc, etc, ETCDIR, [ --with-etc-dir=PATH Path for news config files [PREFIX/etc]]) INN_ARG_DIR(filter, bin/filter, FILTERDIR, [ --with-filter-dir=PATH Path for embedded filters [PREFIX/bin/filter]]) INN_ARG_DIR(lib, lib, LIBDIR, [ --with-lib-dir=PATH Path for news library files [PREFIX/lib]]) INN_ARG_DIR(log, log, LOGDIR, [ --with-log-dir=PATH Path for news logs [PREFIX/log]]) INN_ARG_DIR(run, run, RUNDIR, [ --with-run-dir=PATH Path for news PID/runtime files [PREFIX/run]]) INN_ARG_DIR(spool, spool, SPOOLDIR, [ --with-spool-dir=PATH Path for news storage [PREFIX/spool]]) INN_ARG_DIR(tmp, tmp, tmpdir, [ --with-tmp-dir=PATH Path for temporary files [PREFIX/tmp]]) dnl This is actually given to AC_SUBST later on when we check whether the dnl system has the LOG_NEWS facility. AC_ARG_WITH(syslog-facility, [ --with-syslog-facility=LOG_FAC Syslog facility [LOG_NEWS or LOG_LOCAL1]], SYSLOG_FACILITY=$with_syslog_facility, SYSLOG_FACILITY=none) dnl INN allows the user and group INN will run as to be specified, as well as dnl the user to receive nightly reports and the like. These are all fairly dnl similar, so factor the commonality into this macro. Takes the name of dnl what we're looking for, the default, the variable to set, the help string, dnl and the comment for config.h. AC_DEFUN([INN_ARG_USER], [AC_ARG_WITH([news-$1], [$4], [$3=$with_news_$1], [$3=$2]) AC_SUBST($3) AC_DEFINE_UNQUOTED($3, "$[$3]", [$5])]) dnl And here they are. INN_ARG_USER(user, news, NEWSUSER, [ --with-news-user=USER News user name [news]], [The user that INN should run as.]) INN_ARG_USER(group, news, NEWSGRP, [ --with-news-group=GROUP News group name [news]], [The group that INN should run as.]) INN_ARG_USER(master, usenet, NEWSMASTER, [ --with-news-master=USER News master (address for reports) [usenet]], [The user who gets all INN-related e-mail.]) dnl INN defaults to a umask of 002 with the corresponding directory and file dnl permissions, mostly for historical reasons. If the user sets the umask to dnl something else, change all of the permissions. NEWSUMASK=02 FILEMODE=0664 DIRMODE=0775 RUNDIRMODE=0770 AC_ARG_WITH(news-umask, [ --with-news-umask=UMASK umask for news files [002]], with_news_umask=`echo "$with_news_umask" | sed 's/^0*//'` if test "x$with_news_umask" = x22 ; then NEWSUMASK=022 FILEMODE=0644 DIRMODE=0755 RUNDIRMODE=0750 else if test "x$with_news_umask" != x2 ; then AC_MSG_ERROR(Valid umasks are 02 or 022) fi fi) AC_SUBST(NEWSUMASK) AC_SUBST(FILEMODE) AC_SUBST(DIRMODE) AC_SUBST(RUNDIRMODE) AC_DEFINE_UNQUOTED(ARTFILE_MODE, $FILEMODE, [Mode that incoming articles are created with.]) AC_DEFINE_UNQUOTED(BATCHFILE_MODE, $FILEMODE, [Mode that batch files are created with.]) AC_DEFINE_UNQUOTED(GROUPDIR_MODE, $DIRMODE, [Mode that directories are created with.]) AC_DEFINE_UNQUOTED(NEWSUMASK, $NEWSUMASK, [The umask used by all INN programs.]) dnl inews used to be installed setgid, but may not be secure. Only do this if dnl it's explicitly requested at configure time. INEWSMODE=0550 AC_ARG_ENABLE(setgid-inews, [ --enable-setgid-inews Install inews setgid], if test "x$enableval" = xyes ; then INEWSMODE=02555 fi) AC_SUBST(INEWSMODE) dnl rnews used to be installed setuid root so that it could be run by the uucp dnl user for incoming batches, but this isn't necessary unless you're using dnl UUCP (which most people aren't) and only setuid news is required. Only do dnl this if it's explicitly requested at configure time. RNEWSGRP=$NEWSGRP RNEWSMODE=0500 AC_ARG_ENABLE(uucp-rnews, [ --enable-uucp-rnews Install rnews setuid, group uucp], if test "x$enableval" = xyes ; then RNEWSGRP=uucp RNEWSMODE=04550 fi) AC_SUBST(RNEWSGRP) AC_SUBST(RNEWSMODE) dnl Choose the log compression method; the argument should not be a full path, dnl just the name of the compression type. AC_ARG_WITH(log-compress, [ --with-log-compress=METHOD Log compression method [gzip]], LOG_COMPRESS=$with_log_compress, LOG_COMPRESS=gzip) case "$LOG_COMPRESS" in bzip2) LOG_COMPRESSEXT=".bz2" ;; gzip) LOG_COMPRESSEXT=".gz" ;; *) LOG_COMPRESSEXT=".Z" ;; esac AC_SUBST(LOG_COMPRESS) AC_SUBST(LOG_COMPRESSEXT) dnl inndstart by default only allows ports 119 and 433 below 1024; if the user dnl wants to use some other port as well, they must use this option. AC_ARG_WITH(innd-port, [ --with-innd-port=PORT Additional low-numbered port for inndstart], AC_DEFINE_UNQUOTED(INND_PORT, $with_innd_port, [Additional valid low-numbered port for inndstart.])) dnl By default, we omit all IPv6 support. This option enables it. AC_ARG_ENABLE(ipv6, [ --enable-ipv6 Enable IPv6 support], if test "x$enableval" = xyes ; then inn_enable_ipv6_tests=yes AC_DEFINE(HAVE_INET6, 1, [Define to enable IPv6 support.]) fi) dnl Maximum number of sockets that can be listened on. AC_ARG_WITH(max-sockets, [ --with-max-sockets=N Maximum number of listening sockets in innd],, [with_max_sockets=15]) AC_DEFINE_UNQUOTED(MAX_SOCKETS, $with_max_sockets, [Maximum number of sockets that innd can listen on.]) dnl This will eventually be a runtime option rather than a compile-time dnl option. AC_ARG_ENABLE(tagged-hash, [ --enable-tagged-hash Use tagged hash table for history], if test "x$enableval" = xyes ; then DO_DBZ_TAGGED_HASH=DO AC_DEFINE(DO_TAGGED_HASH, 1, [Define to use tagged hash for the history file.]) else DO_DBZ_TAGGED_HASH=DONT fi) AC_SUBST(DO_DBZ_TAGGED_HASH) dnl Whether to enable the keyword generation code in innd. Use of this code dnl requires a regular expression library, which is checked for later on. inn_enable_keywords=0 AC_ARG_ENABLE(keywords, [ --enable-keywords Automatic keyword generation support], if test x"$enableval" = xyes ; then inn_enable_keywords=1 fi) AC_DEFINE_UNQUOTED(DO_KEYWORDS, $inn_enable_keywords, [Define to 1 to compile in support for keyword generation code.]) dnl Whether to use the OS flags to enable large file support. Ideally this dnl should just always be turned on if possible and the various parts of INN dnl that read off_t's from disk should adjust somehow to the size, but INN dnl isn't there yet. Currently tagged hash doesn't work with large file dnl support due to assumptions about the size of off_t. AC_ARG_ENABLE(largefiles, [ --enable-largefiles Support for files larger than 2GB [default=no]], [case "${enableval}" in yes) inn_enable_largefiles=yes if test x"$DO_DBZ_TAGGED_HASH" = xDO ; then AC_MSG_ERROR([--enable-tagged-hash conflicts with --enable-largefiles.]) fi ;; no) inn_enable_largefiles=no ;; *) AC_MSG_ERROR(invalid argument to --enable-largefiles) ;; esac]) dnl Override the automatically detected path to sendmail. Used later on. AC_ARG_WITH(sendmail, [ --with-sendmail=PATH Path to sendmail], SENDMAIL=$with_sendmail) dnl Specify the path to the Kerberos libraries if the user wants to build dnl auth_krb5. Note that we don't search far and wide for the libraries if dnl the user doesn't specify the path. AC_ARG_WITH(kerberos, [ --with-kerberos=PATH Path to Kerberos v5 (for auth_krb5)], [if test x"$with_kerberos" != xno ; then KRB5_LDFLAGS="-L$with_kerberos/lib" KRB5_INC="-I$with_kerberos/include" fi]) dnl Checks for embedded interpretors. dnl dnl FIXME: These should ideally be combined with the later logic to dnl determine the version, determine the compiler and linker flags, etc. AC_ARG_WITH(perl, [ --with-perl Embedded Perl script support [default=no]], [case "${withval}" in yes) DO_PERL=DO AC_DEFINE(DO_PERL, 1, [Define to compile in Perl script support.]) ;; no) DO_PERL=DONT ;; *) AC_MSG_ERROR(invalid argument to --with-perl) ;; esac], DO_PERL=DONT) AC_ARG_WITH(python, [ --with-python Embedded Python module support [default=no]], [case "${withval}" in yes) DO_PYTHON=define AC_DEFINE(DO_PYTHON, 1, [Define to compile in Python module support.]) ;; no) DO_PYTHON=DONT ;; *) AC_MSG_ERROR(invalid argument to --with-python) ;; esac], DO_PYTHON=DONT) dnl Set some configuration file defaults from the machine hostname. HOSTNAME=`hostname 2> /dev/null || uname -n` AC_SUBST(HOSTNAME) dnl Checks for programs. AC_PROG_GCC_TRADITIONAL AC_PROG_LEX AC_PROG_MAKE_SET AC_PROG_RANLIB AC_PROG_YACC dnl On MacOS X Server, -traditional-cpp is needed for gcc for compiling as dnl well as preprocessing according to Miro Jurisic . case "$CPP" in *-traditional-cpp*) CFLAGS="-traditional-cpp $CFLAGS" ;; esac case "$host" in dnl HP-UX's native compiler needs a special flag to turn on ANSI, and needs dnl -g on link as well as compile for debugging to work. *hpux*) if test x"$GCC" != xyes ; then dnl Need flag to turn on ANSI. CFLAGS="$CFLAGS -Ae" dnl Need -g on link command for debug to work properly. case "$CFLAGS" in *-g*) LDFLAGS="$LDFLAGS -g" ;; esac fi ;; dnl OSX needs '-multiply_defined suppress' *darwin*) LDFLAGS="$LDFLAGS -multiply_defined suppress" ;; dnl From Boyd Gerber , needed in some cases to compile dnl the bison-generated parser for innfeed.conf. *UnixWare*|*unixware*|*-sco3*) if test x"$GCC" != xyes ; then CFLAGS="$CFLAGS -Kalloca" fi esac dnl Checks for pathnames. dnl See if we have ctags; if so, set CTAGS to its full path plus the -t -w dnl options. Otherwise, set CTAGS to echo. AC_PATH_PROG(CTAGS, ctags, echo) if test x"$CTAGS" != xecho ; then CTAGS="$CTAGS -t -w" fi dnl Use INN_PATH_PROG if it's an error not to find a program. AC_DEFUN([INN_ENSURE_PATH_PROG], [AC_PATH_PROG($1, $2) if test -z "${$1}" ; then AC_MSG_ERROR($2 was not found in path and is required) fi]) INN_ENSURE_PATH_PROG(_PATH_AWK,awk) INN_ENSURE_PATH_PROG(_PATH_EGREP,egrep) INN_ENSURE_PATH_PROG(_PATH_PERL,perl) INN_ENSURE_PATH_PROG(_PATH_SH,sh) INN_ENSURE_PATH_PROG(_PATH_SED,sed) INN_ENSURE_PATH_PROG(_PATH_SORT,sort) AC_PATH_PROGS(_PATH_UUX,uux,uux) dnl Check for a required version of Perl. The separate shell variable and dnl the changequotes are necessary for autoconf 2.13; autoconf 2.50 will dnl provide a different interface that will allow this to work correctly. changequote(<<,>>)dnl inn_perl_command='print $]' changequote([,])dnl AC_DEFUN([INN_PERL_VERSION], [AC_CACHE_CHECK(for Perl version, inn_cv_perl_version, [if $_PATH_PERL -e 'require $1;' > /dev/null 2>&1 ; then inn_cv_perl_version=`$_PATH_PERL -e "$inn_perl_command"` else AC_MSG_ERROR(Perl $1 or greater is required) fi])]) dnl Embedded Perl requires 5.004. controlchan requires 5.004_03. Other dnl things may work with 5.003, but make 5.004_03 the minimum level; anyone dnl should really have at least that these days. INN_PERL_VERSION(5.004_03) dnl Look for PGP 5.0's pgpv, then pgp, then pgpgpg (not sure why anyone would dnl have pgpgpg and not gpgv, but it doesn't hurt). Separately look for dnl GnuPG (which we prefer). pgpverify=true AC_PATH_PROGS(PATH_GPGV, gpgv) AC_PATH_PROGS(_PATH_PGP, pgpv pgp pgpgpg) if test -z "$_PATH_PGP" && test -z "$PATH_GPGV" ; then pgpverify=false fi AC_SUBST(pgpverify) dnl Look for a program that takes an ftp URL as a command line argument and dnl retrieves the file to the current directory. Shame we can't also use dnl lynx -source; it only writes to stdout. ncftp as of version 3 doesn't dnl support this any more (it comes with ncftpget instead), but if someone dnl has ncftp and not ncftpget they have an earlier version. AC_PATH_PROGS(GETFTP, wget ncftpget ncftp, $prefix/bin/simpleftp) dnl Look for both compress and gzip, since the UUCP batching scripts require dnl both. If we're using a log compression method other than compress or dnl gzip, check for it too and make sure whatever log compressor we're using dnl exists. If we don't find compress or gzip for the UUCP scripts, just dnl use the bare program names in the hope that the path will be better at dnl the time the script runs (or that the script will never run). case "$LOG_COMPRESS" in compress|gzip) ;; *) INN_ENSURE_PATH_PROG(LOG_COMPRESS, "$LOG_COMPRESS") esac AC_PATH_PROG(COMPRESS, compress, compress) if test x"$LOG_COMPRESS" = xcompress ; then if test x"$COMPRESS" = xcompress ; then AC_MSG_ERROR(compress not found but specified for log compression) fi LOG_COMPRESS="$COMPRESS" fi AC_PATH_PROG(GZIP, gzip, gzip) if test x"$LOG_COMPRESS" = xgzip ; then if test x"$GZIP" = xgzip ; then AC_MSG_ERROR(gzip not found but specified for log compression) fi LOG_COMPRESS="$GZIP" fi dnl Figure out what program to use to uncompress .Z files. On systems that dnl have gzip but don't have compress, we can use gzip for this purpose and dnl should rather than hoping compres will be found at runtime. if test x"$COMPRESS" = xcompress && test x"$GZIP" != xgzip ; then UNCOMPRESS="$GZIP -d" else UNCOMPRESS="$COMPRESS -d" fi AC_SUBST(UNCOMPRESS) dnl Search for sendmail, checking the path first and then some common dnl locations. If --with-sendmail was given, that path overrides. if test "${with_sendmail+set}" = set ; then AC_MSG_CHECKING(for sendmail) AC_MSG_RESULT($SENDMAIL) else AC_PATH_PROG(SENDMAIL, sendmail, , "/usr/sbin:/usr/lib") if test -z "$SENDMAIL" ; then AC_MSG_ERROR(sendmail not found, re-run with --with-sendmail) fi fi dnl FIXME: innshellvars* wants to know if we have uustat, send-uucp expects dnl it to be in the old subst DO/DONT format. Should take a path. AC_CHECK_PROG(HAVE_UUSTAT, uustat, DO, DONT) AC_SUBST(HAVE_UUSTAT) dnl If we're compiling with Python support, make sure Python is available. if test x"$DO_PYTHON" = xdefine ; then INN_ENSURE_PATH_PROG(_PATH_PYTHON, python) fi dnl Search for a particular library, and if found, add that library to the dnl specified variable (the third argument) and run the commands given in the dnl fourth argument, if any. This is for libraries we don't want to pollute dnl LIBS with. AC_DEFUN([INN_SEARCH_AUX_LIBS], [inn_save_LIBS=$LIBS LIBS=${$3} AC_SEARCH_LIBS($1, $2, [$3=$LIBS $4], $5, $6) LIBS=$inn_save_LIBS AC_SUBST($3)]) dnl Checks for libraries. Use AC_SEARCH_LIBS where possible to avoid dnl adding libraries when the function is found in libc. In several dnl cases, we explicitly just add the library to LIBS on success rather dnl than using default actions so as not to clutter config.h with defines dnl we never use. dnl Check for setproctitle in libc first, then libutil if not found there. dnl We have a replacement function if we can't find it, and then we also need dnl to check for pstat. AC_SEARCH_LIBS(setproctitle, util, [AC_DEFINE(HAVE_SETPROCTITLE, 1, [Define if you have the setproctitle function.])], [LIBOBJS="$LIBOBJS setproctitle.o" AC_CHECK_FUNCS(pstat)]) dnl The rat's nest of networking libraries. The common cases are not to dnl need any extra libraries, or to need -lsocket -lnsl. We need to avoid dnl linking with libnsl unless we need it, though, since on some OSes where dnl it isn't necessary it will totally break networking. Unisys also dnl includes gethostbyname in libsocket but needs libnsl for socket(). AC_SEARCH_LIBS(gethostbyname, nsl) AC_SEARCH_LIBS(socket, socket, , [AC_CHECK_LIB(nsl, socket, LIBS="$LIBS -lsocket -lnsl", , -lsocket)]) dnl Check for inet_aton. We have our own, but on Solaris the version in dnl libresolv is more lenient in ways that Solaris's internal DNS resolution dnl code requires, so if we use our own *and* link with libresolv (which may dnl be forced by Perl) DNS resolution fails. AC_SEARCH_LIBS(inet_aton, resolv) dnl Search for various additional libraries used by portions of INN. INN_SEARCH_AUX_LIBS(crypt, crypt, CRYPT_LIB) INN_SEARCH_AUX_LIBS(getspnam, shadow, SHADOW_LIB) dnl IRIX has a PAM library with the right symbols but no header files suitable dnl for use with it, so we have to check the header files first and then only dnl if one is found do we check for the library. inn_check_pam=1 AC_CHECK_HEADERS([pam/pam_appl.h], , [AC_CHECK_HEADER([security/pam_appl.h], , [inn_check_pam=0])]) if test x"$inn_check_pam" = x1; then INN_SEARCH_AUX_LIBS([pam_start], [pam], [PAM_LIB], [AC_DEFINE([HAVE_PAM], 1, [Define if you have PAM.])]) fi dnl If keyword generation support was requested, check for the appropriate dnl libraries. if test x"$inn_enable_keywords" = x1 ; then INN_SEARCH_AUX_LIBS(regexec, regex, REGEX_LIB, , [AC_MSG_ERROR(no usable regular expression library found)]) fi dnl Check for whether the user wants to compile with BerkeleyDB, and if so dnl what the path to the various components of it is. AC_DEFUN([INN_LIB_BERKELEYDB], [AC_ARG_WITH(berkeleydb, [ --with-berkeleydb[=PATH] Enable BerkeleyDB (for ovdb overview method)], BERKELEY_DB_DIR=$with_berkeleydb, BERKELEY_DB_DIR=no) AC_MSG_CHECKING(if BerkeleyDB is desired) if test x"$BERKELEY_DB_DIR" = xno ; then AC_MSG_RESULT(no) BERKELEY_DB_LDFLAGS= BERKELEY_DB_CFLAGS= BERKELEY_DB_LIB= else AC_MSG_RESULT(yes) AC_MSG_CHECKING(for BerkeleyDB location) if test x"$BERKELEY_DB_DIR" = xyes ; then for v in BerkeleyDB BerkeleyDB.3.0 BerkeleyDB.3.1 BerkeleyDB.3.2 \ BerkeleyDB.3.3 BerkeleyDB.4.0 BerkeleyDB.4.1 BerkeleyDB.4.2 \ BerkeleyDB.4.3 BerkeleyDB.4.4 BerkeleyDB.4.5 BerkeleyDB.4.6; do for d in $prefix /usr/local /opt /usr ; do if test -d "$d/$v" ; then BERKELEY_DB_DIR="$d/$v" break fi done done fi if test x"$BERKELEY_DB_DIR" = xyes ; then for v in db46 db45 db44 db43 db42 db41 db4 db3 db2 ; do if test -d "/usr/local/include/$v" ; then BERKELEY_DB_LDFLAGS="-L/usr/local/lib" BERKELEY_DB_CFLAGS="-I/usr/local/include/$v" BERKELEY_DB_LIB="-l$v" AC_MSG_RESULT(FreeBSD locations) break fi done if test x"$BERKELEY_DB_LIB" = x ; then for v in db44 db43 db42 db41 db4 db3 db2 ; do if test -d "/usr/include/$v" ; then BERKELEY_DB_CFLAGS="-I/usr/include/$v" BERKELEY_DB_LIB="-l$v" AC_MSG_RESULT(Linux locations) break fi done if test x"$BERKELEY_DB_LIB" = x ; then BERKELEY_DB_LIB=-ldb AC_MSG_RESULT(trying -ldb) fi fi else BERKELEY_DB_LDFLAGS="-L$BERKELEY_DB_DIR/lib" BERKELEY_DB_CFLAGS="-I$BERKELEY_DB_DIR/include" BERKELEY_DB_LIB="-ldb" AC_MSG_RESULT($BERKELEY_DB_DIR) fi AC_DEFINE(USE_BERKELEY_DB, 1, [Define if BerkeleyDB is available.]) fi AC_SUBST(BERKELEY_DB_LDFLAGS) AC_SUBST(BERKELEY_DB_CFLAGS) AC_SUBST(BERKELEY_DB_LIB)]) INN_LIB_BERKELEYDB dnl The dbm libraries are a special case. If we're building with BerkeleyDB, dnl just use the ndbm support provided by it. if test x"$BERKELEY_DB_LIB" != x ; then DBM_INC="$BERKELEY_DB_CFLAGS" DBM_LIB="$BERKELEY_DB_LDFLAGS $BERKELEY_DB_LIB" AC_SUBST([DBM_LIB]) AC_DEFINE([HAVE_BDB_DBM], 1, [Define if the BerkeleyDB dbm compatibility layer is available.]) else INN_SEARCH_AUX_LIBS([dbm_open], [ndbm dbm], [DBM_LIB], [AC_DEFINE([HAVE_DBM], 1, [Define if you have a dbm library.])]) DBM_INC= fi AC_SUBST([DBM_INC]) dnl Check for whether the user wants to compile with OpenSSL, and if so what dnl the path to the various components of it is. AC_DEFUN([INN_LIB_OPENSSL], [AC_ARG_WITH(openssl, [ --with-openssl=PATH Enable OpenSSL (for NNTP over SSL support)], OPENSSL_DIR=$with_openssl, OPENSSL_DIR=no) AC_MSG_CHECKING(if OpenSSL is desired) if test x"$OPENSSL_DIR" = xno ; then AC_MSG_RESULT(no) SSL_BIN= SSL_INC= SSL_LIB= else AC_MSG_RESULT(yes) AC_MSG_CHECKING(for OpenSSL location) if test x"$OPENSSL_DIR" = xyes ; then for dir in $prefix /usr/local/ssl /usr/lib/ssl /usr/ssl /usr/pkg \ /usr/local /usr ; do if test -f "$dir/include/openssl/ssl.h" ; then OPENSSL_DIR=$dir break fi done fi if test x"$OPENSSL_DIR" = xyes ; then AC_MSG_ERROR(Can not find OpenSSL) else AC_MSG_RESULT($OPENSSL_DIR) SSL_BIN="${OPENSSL_DIR}/bin" SSL_INC="-I${OPENSSL_DIR}/include" # This is mildly tricky. In order to satisfy most linkers, libraries # have to be listed in the right order, which means that libraries # with dependencies on other libraries need to be listed first. But # the -L flag for the OpenSSL library directory needs to go first of # all. So put the -L flag into LIBS and accumulate actual libraries # into SSL_LIB, and then at the end, restore LIBS and move -L to the # beginning of SSL_LIB. inn_save_LIBS=$LIBS LIBS="$LIBS -L${OPENSSL_DIR}/lib" SSL_LIB='' AC_CHECK_LIB(rsaref, RSAPublicEncrypt, [AC_CHECK_LIB(RSAglue, RSAPublicEncrypt, [SSL_LIB="-lRSAglue -lrsaref"], , -lrsaref)]) AC_CHECK_LIB(crypto, BIO_new, [AC_CHECK_LIB(dl, DSO_load, SSL_LIB="-lcrypto -ldl $SSL_LIB", SSL_LIB="-lcrypto $SSL_LIB", -lcrypto -ldl $SSL_LIB)], [AC_MSG_ERROR(Can not find OpenSSL)], $SSL_LIB) AC_CHECK_LIB(ssl, SSL_library_init, [SSL_LIB="-lssl $SSL_LIB"], [AC_MSG_ERROR(Can not find OpenSSL)], $SSL_LIB) SSL_LIB="-L${OPENSSL_DIR}/lib $SSL_LIB" LIBS=$inn_save_LIBS AC_DEFINE(HAVE_SSL, 1, [Define if OpenSSL is available.]) fi fi AC_SUBST(SSL_BIN) AC_SUBST(SSL_INC) AC_SUBST(SSL_LIB)]) INN_LIB_OPENSSL dnl Check for whether the user wants to compile with SASL, and if so what dnl the path to the various components of it is. AC_DEFUN([INN_LIB_SASL], [AC_ARG_WITH(sasl, [ --with-sasl=PATH Enable SASL (for imapfeed authentication)], SASL_DIR=$with_sasl, SASL_DIR=no) AC_MSG_CHECKING(if SASL is desired) if test x"$SASL_DIR" = xno ; then AC_MSG_RESULT(no) SASL_INC= SASL_LIB= else AC_MSG_RESULT(yes) AC_MSG_CHECKING(for SASL location) if test x"$SASL_DIR" = xyes ; then for dir in $prefix /usr/local/sasl /usr/sasl /usr/pkg /usr/local ; do if test -f "$dir/include/sasl/sasl.h" ; then SASL_DIR=$dir break fi done fi if test x"$SASL_DIR" = xyes ; then if test -f "/usr/include/sasl/sasl.h" ; then SASL_INC=-I/usr/include/sasl SASL_DIR=/usr AC_MSG_RESULT($SASL_DIR) inn_save_LIBS=$LIBS AC_CHECK_LIB(sasl2, sasl_getprop, [SASL_LIB=-lsasl2], [AC_MSG_ERROR(Can not find SASL)]) LIBS=$inn_save_LIBS AC_DEFINE(HAVE_SASL, 1, [Define if SASL is available.]) else AC_MSG_ERROR(Can not find SASL) fi else AC_MSG_RESULT($SASL_DIR) SASL_INC="-I${SASL_DIR}/include" inn_save_LIBS=$LIBS LIBS="$LIBS -L${SASL_DIR}/lib" AC_CHECK_LIB(sasl2, sasl_getprop, [SASL_LIB="-L${SASL_DIR}/lib -lsasl2"], [AC_MSG_ERROR(Can not find SASL)],) LIBS=$inn_save_LIBS AC_DEFINE(HAVE_SASL, 1, [Define if SASL is available.]) fi fi AC_SUBST(SASL_INC) AC_SUBST(SASL_LIB)]) INN_LIB_SASL dnl Check for Kerberos libraries for auth_krb5, and if found define KRB5_AUTH dnl to the relevant object file, which will enable compilation of it. if test x"$KRB5_INC" != x ; then INN_SEARCH_AUX_LIBS(krb5_parse_name, krb5, KRB5_LIB, [KRB5_AUTH="auth_krb5" KRB5_LIB="$KRB5_LDFLAGS $KRB5_LIB -lk5crypto -lcom_err" AC_SUBST(KRB5_AUTH) AC_SUBST(KRB5_INC) AC_CHECK_HEADERS([et/com_err.h])], , [$LIBS -lk5crypto -lcom_err]) fi dnl Check for necessity of krb5_init_ets dnl OSX does not require this function if test x"$KRB5_INC" != x ; then inn_save_LIBS=$LIBS LIBS=$KRB5_LIB AC_CHECK_FUNCS(krb5_init_ets) LIBS=$inn_save_LIBS fi dnl Libraries and flags for embedded Perl. Some distributions of Linux have dnl Perl linked with gdbm but don't normally have gdbm installed, so on that dnl platform only strip -lgdbm out of the Perl libraries. Leave it in on dnl other platforms where it may be necessary (it isn't on Linux; Linux dnl shared libraries can manage their own dependencies). Strip -lc out, which dnl is added on some platforms, is unnecessary, and breaks compiles with dnl -pthread (which may be added by Python). dnl dnl If we aren't compiling with large-file support, strip out the large file dnl flags from inn_perl_core_flags; otherwise, innd/cc.c and lib/qio.c dnl disagree over the size of an off_t. Since none of our calls into Perl dnl use variables of type off_t, this should be harmless; in any event, it's dnl going to be better than the innd/cc.c breakage. if test x"$DO_PERL" = xDO ; then AC_MSG_CHECKING(for Perl linkage) inn_perl_core_path=`$_PATH_PERL -MConfig -e 'print $Config{archlibexp}'` inn_perl_core_flags=`$_PATH_PERL -MExtUtils::Embed -e ccopts` inn_perl_core_libs=`$_PATH_PERL -MExtUtils::Embed -e ldopts 2>&1 | tail -1` inn_perl_core_libs=" $inn_perl_core_libs " inn_perl_core_libs=`echo "$inn_perl_core_libs" | sed 's/ -lc / /'` for i in $LIBS ; do inn_perl_core_libs=`echo "$inn_perl_core_libs" | sed "s/ $i / /"` done case $host in *-linux*) inn_perl_core_libs=`echo "$inn_perl_core_libs" | sed 's/ -lgdbm / /'` ;; *-cygwin*) inn_perl_libname=`$_PATH_PERL -MConfig -e 'print $Config{libperl}'` inn_perl_libname=`echo "$inn_perl_libname" | sed 's/^lib//; s/\.a$//'` inn_perl_core_libs="${inn_perl_core_libs}-l$inn_perl_libname" ;; esac inn_perl_core_libs=`echo "$inn_perl_core_libs" | sed 's/^ *//'` inn_perl_core_libs=`echo "$inn_perl_core_libs" | sed 's/ *$//'` inn_perl_core_flags=" $inn_perl_core_flags " if test x"$inn_enable_largefiles" != xyes ; then for f in -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGE_FILES ; do inn_perl_core_flags=`echo "$inn_perl_core_flags" | sed "s/ $f / /"` done fi inn_perl_core_flags=`echo "$inn_perl_core_flags" | sed 's/^ *//'` inn_perl_core_flags=`echo "$inn_perl_core_flags" | sed 's/ *$//'` PERL_INC="$inn_perl_core_flags" PERL_LIB="$inn_perl_core_libs" AC_MSG_RESULT($inn_perl_core_path) else PERL_INC='' PERL_LIB='' fi AC_SUBST(PERL_INC) AC_SUBST(PERL_LIB) dnl Libraries and flags for embedded Python. dnl dnl FIXME: I wish there was a less icky way to get this. if test x"$DO_PYTHON" = xdefine ; then AC_MSG_CHECKING(for Python linkage) py_prefix=`$_PATH_PYTHON -c 'import sys; print sys.prefix'` py_ver=`$_PATH_PYTHON -c 'import sys; print sys.version[[:3]]'` py_libdir="${py_prefix}/lib/python${py_ver}" PYTHON_INC="-I${py_prefix}/include/python${py_ver}" py_linkage="" for py_linkpart in LIBS LIBC LIBM LOCALMODLIBS BASEMODLIBS \ LINKFORSHARED LDFLAGS ; do py_linkage="$py_linkage "`grep "^${py_linkpart}=" \ $py_libdir/config/Makefile \ | sed -e 's/^.*=//'` done PYTHON_LIB="-L$py_libdir/config -lpython$py_ver $py_linkage" PYTHON_LIB=`echo $PYTHON_LIB | sed -e 's/[ \\t]*/ /g'` AC_MSG_RESULT($py_libdir) else PYTHON_LIB="" PYTHON_INC="" fi AC_SUBST(PYTHON_LIB) AC_SUBST(PYTHON_INC) dnl If configuring with large file support, determine the right flags to dnl use based on the platform. This is the wrong approach; autoconf 2.50 dnl comes with a macro that takes the right approach. But this works well dnl enough until we switch to autoconf 2.50 or later. if test x"$inn_enable_largefiles" = xyes ; then AC_MSG_CHECKING(for largefile linkage) case "$host" in *-aix4.[01]*) AC_MSG_RESULT(no) AC_MSG_ERROR([AIX before 4.2 does not support large files]) ;; *-aix4*) AC_MSG_RESULT(ok) LFS_CFLAGS="-D_LARGE_FILES" LFS_LDFLAGS="" LFS_LIBS="" ;; *-hpux*) AC_MSG_RESULT(ok) LFS_CFLAGS="-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64" LFS_LDFLAGS="" LFS_LIBS="" ;; *-irix*) AC_MSG_RESULT(no) AC_MSG_ERROR([Large files not supported on this platform]) ;; *-linux*) AC_MSG_RESULT(maybe) LFS_CFLAGS="-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64" LFS_LDFLAGS="" LFS_LIBS="" AC_DEFINE([_GNU_SOURCE], 1, [Some versions of glibc need this defined for pread/pwrite.]) ;; *-solaris*) AC_MSG_RESULT(ok) AC_PATH_PROG(GETCONF, getconf) if test -z "$GETCONF" ; then AC_MSG_ERROR([getconf required to configure large file support]) fi LFS_CFLAGS=`$GETCONF LFS_CFLAGS` LFS_LDFLAGS=`$GETCONF LFS_LDFLAGS` LFS_LIBS=`$GETCONF LFS_LIBS` ;; *) AC_MSG_RESULT(maybe) LFS_CFLAGS="-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64" LFS_LDFLAGS="" LFS_LIBS="" ;; esac AC_SUBST(LFS_CFLAGS) AC_SUBST(LFS_LDFLAGS) AC_SUBST(LFS_LIBS) fi dnl Start by checking for standard C headers. AC_HEADER_STDC will set dnl STDC_HEADERS if stdlib.h, stdarg.h, string.h, and float.h all exist, if dnl memchr (and probably the other mem functions) is in string.h, if free (and dnl probably malloc and friends) are in stdlib.h, and if ctype.h will work on dnl high-bit characters. AC_HEADER_STDC dnl Only if that wasn't set do we need to go hunting for other headers to dnl include on non-ANSI systems and check for functions that all ANSI C dnl systems should have. if test x"$ac_cv_header_stdc" = xno ; then AC_CHECK_HEADERS(memory.h stdlib.h strings.h) AC_CHECK_FUNCS(memcpy strchr) fi dnl Special checks for header files. AC_HEADER_DIRENT AC_HEADER_TIME AC_HEADER_SYS_WAIT dnl Generic checks for header files. AC_CHECK_HEADERS(crypt.h inttypes.h limits.h ndbm.h pam/pam_appl.h stdbool.h \ stddef.h stdint.h string.h sys/bitypes.h sys/filio.h \ sys/loadavg.h sys/param.h sys/select.h sys/sysinfo.h \ sys/time.h unistd.h) dnl Some Linux systems have db1/ndbm.h instead of ndbm.h. Others have dnl gdbm-ndbm.h. if test x"$ac_cv_header_ndbm_h" = xno ; then AC_CHECK_HEADERS(db1/ndbm.h gdbm-ndbm.h) fi dnl Check to see if herrno is declared. AC_DEFUN([INN_NEED_HERRNO_DECLARATION], [AC_CACHE_CHECK([whether h_errno must be declared], inn_cv_herrno_need_decl, [AC_TRY_COMPILE([#include ], [h_errno = 0;], inn_cv_herrno_need_decl=no, inn_cv_herrno_need_decl=yes)]) if test "$inn_cv_herrno_need_decl" = yes ; then AC_DEFINE([NEED_HERRNO_DECLARATION], 1, [Define if does not declare h_errno.]) fi]) INN_NEED_HERRNO_DECLARATION dnl The set of standard includes, used for checking if functions need to be dnl declared and for tests that need to use standard functions. define([_INN_HEADER_SOURCE], [#include #include #if STDC_HEADERS # include # include #else # if HAVE_STDLIB_H # include # endif # if !HAVE_STRCHR # define strchr index # define strrchr rindex # endif #endif #if HAVE_STRING_H # if !STDC_HEADERS && HAVE_MEMORY_H # include # endif # include #else # if HAVE_STRINGS_H # include # endif #endif #if HAVE_UNISTD_H # include #endif]) dnl See if a given function needs a declaration by seeing if we can access a dnl function pointer for that function. This is done in a really ugly way dnl with hacks so that autoheader will pick up the defines properly; it's a dnl stop-gap solution until switching to autoconf 2.50. AC_DEFUN([INN_NEED_DECLARATION], [AC_MSG_CHECKING([whether $1 must be declared]) AC_CACHE_VAL([inn_cv_decl_needed_$1], [AC_TRY_COMPILE( _INN_HEADER_SOURCE() [$3], [char *(*pfn) = (char *(*)) $1], [inn_cv_decl_needed_$1=no], [inn_cv_decl_needed_$1=yes])]) if test $inn_cv_decl_needed_$1 = yes ; then AC_MSG_RESULT(yes) AC_DEFINE($2, 1, [Define if $1 isn't declared in the system headers.]) else AC_MSG_RESULT(no) fi]) INN_NEED_DECLARATION(inet_aton, [NEED_DECLARATION_INET_ATON], [#include #include ]) INN_NEED_DECLARATION(inet_ntoa, [NEED_DECLARATION_INET_NTOA], [#include #include ]) INN_NEED_DECLARATION(snprintf, [NEED_DECLARATION_SNPRINTF]) INN_NEED_DECLARATION(vsnprintf, [NEED_DECLARATION_VSNPRINTF]) dnl Checks for typedefs, structures, and compiler characteristics. AC_C_BIGENDIAN AC_C_CONST AC_STRUCT_ST_BLKSIZE AC_STRUCT_TM AC_TYPE_SIZE_T AC_TYPE_UID_T AC_TYPE_OFF_T AC_TYPE_PID_T AC_CHECK_TYPE(ptrdiff_t, long) AC_CHECK_TYPE(ssize_t, int) dnl Check for ISO C99 variadic macro support in the compiler. AC_DEFUN([INN_C_C99_VAMACROS], [AC_CACHE_CHECK(for C99 variadic macros, inn_cv_c_c99_vamacros, [AC_TRY_COMPILE( [#include #define error(...) fprintf(stderr, __VA_ARGS__)], [error("foo"); error("foo %d", 0); return 0;], [inn_cv_c_c99_vamacros=yes], [inn_cv_c_c99_vamacros=no])]) if test $inn_cv_c_c99_vamacros = yes ; then AC_DEFINE(HAVE_C99_VAMACROS, 1, [Define if the compiler supports C99 variadic macros.]) fi]) INN_C_C99_VAMACROS dnl Check for GNU-style variadic macro support in the compiler. AC_DEFUN([INN_C_GNU_VAMACROS], [AC_CACHE_CHECK(for GNU-style variadic macros, inn_cv_c_gnu_vamacros, [AC_TRY_COMPILE( [#include #define error(args...) fprintf(stderr, args)], [error("foo"); error("foo %d", 0); return 0;], [inn_cv_c_gnu_vamacros=yes], [inn_cv_c_gnu_vamacros=no])]) if test $inn_cv_c_gnu_vamacros = yes ; then AC_DEFINE(HAVE_GNU_VAMACROS, 1, [Define if the compiler supports GNU-style variadic macros.]) fi]) INN_C_GNU_VAMACROS dnl Check for long long int, and define HAVE_LONG_LONG if the compiler dnl supports it. AC_DEFUN([INN_C_LONG_LONG], [AC_CACHE_CHECK(for long long int, inn_cv_c_long_long, [AC_TRY_COMPILE(, [long long int i;], inn_cv_c_long_long=yes, inn_cv_c_long_long=no)]) if test $inn_cv_c_long_long = yes ; then AC_DEFINE(HAVE_LONG_LONG, 1, [Define if the compiler supports long long int.]) fi]) INN_C_LONG_LONG dnl From Paul D. Smith on the autoconf mailing list, dnl this is a version of AC_CHECK_TYPE that allows specification of additional dnl headers. It's a modified version of the standard autoconf macro. AC_DEFUN([INN_CHECK_TYPE], [AC_REQUIRE([AC_HEADER_STDC]) AC_MSG_CHECKING(for $1) AC_CACHE_VAL(ac_cv_type_$1, [AC_EGREP_CPP(dnl changequote(<<, >>)dnl <<(^|[^a-zA-Z_0-9])$1[^a-zA-Z_0-9]>>dnl changequote([, ]), [#include #ifdef STDC_HEADERS # include # include #endif $3], ac_cv_type_$1=yes, ac_cv_type_$1=no )]) AC_MSG_RESULT($ac_cv_type_$1) if test x"$ac_cv_type_$1" = xno ; then AC_DEFINE_UNQUOTED($1, $2) fi]) INN_CHECK_TYPE(sig_atomic_t, int, [#include ]) INN_CHECK_TYPE(socklen_t, int, [#include ]) dnl Source used by INN_MACRO_IOV_MAX. define([_INN_MACRO_IOV_MAX_SOURCE], [[#include #include #include #include #include #ifdef HAVE_UNISTD_H # include #endif #ifdef HAVE_LIMITS_H # include #endif int main () { int fd, size; struct iovec array[1024]; char data; FILE *f = fopen ("conftestval", "w"); if (!f) return 1; #ifdef IOV_MAX fprintf (f, "set in limits.h\n"); #else # ifdef UIO_MAXIOV fprintf (f, "%d\n", UIO_MAXIOV); # else fd = open ("/dev/null", O_WRONLY, 0666); if (fd < 0) return 1; for (size = 1; size <= 1024; size++) { array[size - 1].iov_base = &data; array[size - 1].iov_len = sizeof data; if (writev (fd, array, size) < 0) { if (errno != EINVAL) return 1; fprintf(f, "%d\n", size - 1); exit (0); } } fprintf (f, "1024\n"); # endif /* UIO_MAXIOV */ #endif /* IOV_MAX */ return 0; }]]) dnl Check for the number of elements in an iovec (IOV_MAX). SVr4 systems dnl appear to use that name for this limit (checked Solaris 2.6, IRIX 6.5, and dnl HP-UX 11.00). Linux doesn't have it, but instead has UIO_MAXIOV defined dnl in included from . The platforms that have IOV_MAX dnl appear to also offer it via sysconf(3), but it should be a constant for a dnl given implementation. Set IOV_MAX if it's not defined in or dnl . AC_DEFUN([INN_MACRO_IOV_MAX], [AC_CACHE_CHECK([value of IOV_MAX], [inn_cv_macro_iov_max], [AC_TRY_RUN(_INN_MACRO_IOV_MAX_SOURCE(), inn_cv_macro_iov_max=`cat conftestval`, inn_cv_macro_iov_max=error, 16) if test x"$inn_cv_macro_iov_max" = xerror ; then AC_MSG_WARN([probe failure, assuming 16]) inn_cv_macro_iov_max=16 fi]) if test x"$inn_cv_macro_iov_max" != x"set in limits.h" ; then AC_DEFINE_UNQUOTED(IOV_MAX, $inn_cv_macro_iov_max, [Define to the max vectors in an iovec.]) fi]) INN_MACRO_IOV_MAX dnl Check for SUN_LEN (size of a Unix domain socket struct, macro required dnl POSIX.1g but not that widespread yet). AC_DEFUN([INN_MACRO_SUN_LEN], [AC_CACHE_CHECK(for SUN_LEN, inn_cv_macro_sun_len, [AC_TRY_LINK( [#include #include ], [struct sockaddr_un sun; int i; i = SUN_LEN(&sun);], inn_cv_macro_sun_len=yes, inn_cv_macro_sun_len=no)]) if test x"$inn_cv_macro_sun_len" = xyes ; then AC_DEFINE(HAVE_SUN_LEN, 1, [Define if defines the SUN_LEN macro.]) fi]) INN_MACRO_SUN_LEN dnl BSD hosts have a tm_gmtoff element in struct tm containing the offset from dnl GMT/UTC for that time. This is the strongly preferred way of getting time dnl zone information. AC_DEFUN([INN_STRUCT_TM_GMTOFF], [AC_CACHE_CHECK(for tm_gmtoff in struct tm, inn_cv_struct_tm_gmtoff, [AC_TRY_LINK([#include ], [struct tm t; t.tm_gmtoff = 3600], inn_cv_struct_tm_gmtoff=yes, inn_cv_struct_tm_gmtoff=no)]) if test x"$inn_cv_struct_tm_gmtoff" = xyes ; then AC_DEFINE([HAVE_TM_GMTOFF], 1, [Define if your struct tm has a tm_gmtoff member.]) fi]) INN_STRUCT_TM_GMTOFF dnl BSD hosts have the name of the local time zone in struct tm, which is much dnl nicer to use than the tzname variable (and also potentially handles dnl renamings of the time zone in the past). AC_DEFUN([INN_STRUCT_TM_ZONE], [AC_CACHE_CHECK(for tm_zone in struct tm, inn_cv_struct_tm_zone, [AC_TRY_LINK([#include ], [struct tm t; t.tm_zone = "UTC"], inn_cv_struct_tm_zone=yes, inn_cv_struct_tm_zone=no)]) if test x"$inn_cv_struct_tm_zone" = xyes ; then AC_DEFINE([HAVE_TM_ZONE], 1, [Define if your struct tm has a tm_zone member.]) fi]) INN_STRUCT_TM_ZONE dnl Many System V hosts have an external variable timezone containing the dnl offset of local time from GMT/UTC. We can use this for the timezone dnl offset for current time, although it's not usable for anything else. dnl Unfortunately, some BSD varients have a function named timezone instead. dnl HP-UX has timezone but doesn't have altzone, which isn't good enough. AC_DEFUN([INN_VAR_TIMEZONE], [AC_CACHE_CHECK(for timezone variable, inn_cv_var_timezone, [AC_TRY_LINK([#include ], [timezone = 3600; altzone = 7200], inn_cv_var_timezone=yes, inn_cv_var_timezone=no)]) if test x"$inn_cv_var_timezone" = xyes ; then AC_DEFINE([HAVE_VAR_TIMEZONE], 1, [Define if timezone is an external variable in .]) fi]) INN_VAR_TIMEZONE dnl Many System V hosts and some BSD systems have an external variable tzname dnl containing the abbreviations of the main and alternate time zone. We can dnl use these as a reasonable approximation of the correct time zone names, dnl although they could be incorrect if the time zone name has changed in the dnl past. AC_DEFUN([INN_VAR_TZNAME], [AC_CACHE_CHECK(for tzname variable, inn_cv_var_tzname, [AC_TRY_LINK([#include ], [*tzname = "UTC"], inn_cv_var_tzname=yes, inn_cv_var_tzname=no)]) if test x"$inn_cv_var_tzname" = xyes ; then AC_DEFINE([HAVE_VAR_TZNAME], 1, [Define if tzname is an external variable in .]) fi]) INN_VAR_TZNAME dnl A modified version of AC_CHECK_SIZEOF that doesn't always AC_DEFINE, but dnl instead lets you execute shell code based on success or failure. This is dnl to avoid config.h clutter. AC_DEFUN(INN_IF_SIZEOF, [changequote(<<, >>)dnl dnl The name to #define. define(<>, translit(sizeof_$1, [a-z *], [A-Z_P]))dnl dnl The cache variable name. define(<>, translit(ac_cv_sizeof_$1, [ *], [_p]))dnl changequote([, ])dnl AC_MSG_CHECKING(size of $1) AC_CACHE_VAL(AC_CV_NAME, [AC_TRY_RUN([#include main() { FILE *f = fopen("conftestval", "w"); if (!f) exit(1); fprintf(f, "%d\n", sizeof($1)); exit(0); }], AC_CV_NAME=`cat conftestval`, AC_CV_NAME=0, ifelse([$2], , , AC_CV_NAME=$2)) ])dnl AC_MSG_RESULT($AC_CV_NAME) if test x"$AC_CV_NAME" = x"$3" ; then ifelse([$4], , :, [$4]) else ifelse([$5], , :, [$5]) fi undefine([AC_TYPE_NAME])dnl undefine([AC_CV_NAME])dnl ]) dnl Find a 32 bit type, by trying likely candidates. First, check for the C9X dnl int32_t, then look for something else with a size of four bytes. INN_IF_SIZEOF(int, 4, 4, INN_INT32=int, [INN_IF_SIZEOF(long, 4, 4, INN_INT32=long, [INN_IF_SIZEOF(short, 2, 4, INN_INT32=short)])]) INN_CHECK_TYPE(int32_t, $INN_INT32, [#ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_SYS_BITYPES_H # include #endif ]) dnl Figure out the unsigned version. INN_CHECK_TYPE(uint32_t, unsigned $INN_INT32, [#ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_SYS_BITYPES_H # include #endif ]) dnl Checks for library functions. AC_FUNC_MEMCMP AC_TYPE_SIGNAL dnl Source used by INN_FUNC_INET_NTOA define([_INN_FUNC_INET_NTOA_SOURCE], [#include #include #include #include #if STDC_HEADERS || HAVE_STRING_H # include #endif int main () { struct in_addr in; in.s_addr = htonl (0x7f000000L); return (!strcmp (inet_ntoa (in), "127.0.0.0") ? 0 : 1); }]) dnl Check whether inet_ntoa is present and working. Since calling inet_ntoa dnl involves passing small structs on the stack, present and working versions dnl may still not function with gcc on some platforms (such as IRIX). AC_DEFUN([INN_FUNC_INET_NTOA], [AC_CACHE_CHECK(for working inet_ntoa, inn_cv_func_inet_ntoa_works, [AC_TRY_RUN(_INN_FUNC_INET_NTOA_SOURCE(), [inn_cv_func_inet_ntoa_works=yes], [inn_cv_func_inet_ntoa_works=no], [inn_cv_func_inet_ntoa_works=no])]) if test "$inn_cv_func_inet_ntoa_works" = yes ; then AC_DEFINE([HAVE_INET_NTOA], 1, [Define if your system has a working inet_ntoa function.]) else LIBOBJS="$LIBOBJS inet_ntoa.${ac_objext}" fi]) INN_FUNC_INET_NTOA dnl Check whether sockaddr structs have sa_len fields AC_DEFUN([INN_SOCKADDR_SA_LEN], [AC_CACHE_CHECK(whether struct sockaddr has sa_len, inn_cv_struct_sockaddr_sa_len, [AC_TRY_COMPILE( [#include #include #include ], [struct sockaddr sa; int x = sa.sa_len;], [inn_cv_struct_sockaddr_sa_len=yes], [inn_cv_struct_sockaddr_sa_len=no])]) if test "$inn_cv_struct_sockaddr_sa_len" = yes ; then AC_DEFINE([HAVE_SOCKADDR_LEN],1, [Define if your system has a sa_len field in struct sockaddr]) fi]) INN_SOCKADDR_SA_LEN dnl Check whether we have an SA_LEN macro available to us AC_DEFUN([INN_SA_LEN_MACRO], [AC_CACHE_CHECK(for SA_LEN(s) macro, inn_cv_sa_len_macro, [AC_TRY_LINK( [#include #include #include ], [struct sockaddr sa; int x = SA_LEN(&sa);], [inn_cv_sa_len_macro=yes], [inn_cv_sa_len_macro=no])]) if test "$inn_cv_sa_len_macro" = yes ; then AC_DEFINE([HAVE_SA_LEN_MACRO],1, [Define if your system has a SA_LEN(s) macro]) fi]) INN_SA_LEN_MACRO dnl Check to see how struct sockaddr_storage members are named. dnl *** Called from INN_SOCKADDR_STORAGE AC_DEFUN([INN_2553_SS_FAMILY], [AC_CACHE_CHECK(for RFC 2553 style sockaddr_storage member names, inn_cv_2553_ss_family, [AC_TRY_COMPILE( [#include #include #include ], [struct sockaddr_storage ss; int x=ss.ss_family;], [inn_cv_2553_ss_family=no], [inn_cv_2553_ss_family=yes])]) if test "$inn_cv_2553_ss_family" = yes ; then AC_DEFINE([HAVE_2553_STYLE_SS_FAMILY],1, [Define if your system has sockaddr_storage.__ss_family]) fi]) dnl Check whether we have struct sockaddr_storage as defined by RFC 2553, dnl or whether we should define it ourselves. AC_DEFUN([INN_SOCKADDR_STORAGE], [AC_CACHE_CHECK(for struct sockaddr_storage, inn_cv_struct_sockaddr_storage, [AC_TRY_COMPILE( [#include #include #include ], [struct sockaddr_storage ss;], [inn_cv_struct_sockaddr_storage=yes], [inn_cv_struct_sockaddr_storage=no])]) if test "$inn_cv_struct_sockaddr_storage" = yes ; then AC_DEFINE([HAVE_SOCKADDR_STORAGE],1, [Define if your system has struct sockaddr_storage]) INN_2553_SS_FAMILY fi]) INN_SOCKADDR_STORAGE dnl Source used by INN_IN6_EQ_BROKEN dnl Test borrowed from a bug report by tmoestl@gmx.net for glibc define([_INN_IN6_EQ_BROKEN_SOURCE], [#include #include #include #include int main () { struct in6_addr a; struct in6_addr b; inet_pton(AF_INET6,"fe80::1234:5678:abcd",&a); inet_pton(AF_INET6,"fe80::1234:5678:abcd",&b); return IN6_ARE_ADDR_EQUAL(&a,&b) ? 0 : 1; }]) dnl Checks whether IN6_ARE_ADDR_EQUAL macro is broken (glibc 2.1.3 is) dnl *** only run if we're building for IPv6 (--enable-ipv6) AC_DEFUN([INN_IN6_EQ_BROKEN], [AC_CACHE_CHECK(whether IN6_ARE_ADDR_EQUAL macro is broken, inn_cv_in6_are_addr_equal_broken, [AC_TRY_RUN(_INN_IN6_EQ_BROKEN_SOURCE, inn_cv_in6_are_addr_equal_broken=no, inn_cv_in6_are_addr_equal_broken=yes, inn_cv_in6_are_addr_equal_broken=no)]) if test "$inn_cv_in6_are_addr_equal_broken" = yes ; then AC_DEFINE([HAVE_BROKEN_IN6_ARE_ADDR_EQUAL],1, [Define if your IN6_ARE_ADDR_EQUAL macro is broken]) fi]) if test "$inn_enable_ipv6_tests" = yes ; then INN_IN6_EQ_BROKEN fi dnl Source used by INN_FUNC_SNPRINTF. define([_INN_FUNC_SNPRINTF_SOURCE], [[#include #include char buf[2]; int test (char *format, ...) { va_list args; int count; va_start (args, format); count = vsnprintf (buf, sizeof buf, format, args); va_end (args); return count; } int main () { return ((test ("%s", "abcd") == 4 && buf[0] == 'a' && buf[1] == '\0' && snprintf(NULL, 0, "%s", "abcd") == 4) ? 0 : 1); }]]) dnl Check for a working snprintf. Some systems have snprintf, but it doesn't dnl null-terminate if the buffer isn't large enough or it returns -1 if the dnl string doesn't fit instead of returning the number of characters that dnl would have been formatted. AC_DEFUN([INN_FUNC_SNPRINTF], [AC_CACHE_CHECK(for working snprintf, inn_cv_func_snprintf_works, [AC_TRY_RUN(_INN_FUNC_SNPRINTF_SOURCE(), [inn_cv_func_snprintf_works=yes], [inn_cv_func_snprintf_works=no], [inn_cv_func_snprintf_works=no])]) if test "$inn_cv_func_snprintf_works" = yes ; then AC_DEFINE([HAVE_SNPRINTF], 1, [Define if your system has a working snprintf function.]) else LIBOBJS="$LIBOBJS snprintf.${ac_objext}" fi]) INN_FUNC_SNPRINTF dnl Check for various other functions. AC_CHECK_FUNCS(atexit getloadavg getrlimit getrusage getspnam setbuffer \ sigaction setgroups setrlimit setsid socketpair statvfs \ strncasecmp strtoul symlink sysconf) dnl Find a way to get the file descriptor limit. if test x"$ac_cv_func_getrlimit" = xno ; then AC_CHECK_FUNCS(getdtablesize ulimit, break) fi dnl If we don't have statvfs, gather some more information for inndf. if test x"$ac_cv_func_statvfs" = xno ; then AC_CHECK_FUNCS(statfs) AC_CHECK_HEADERS(sys/vfs.h sys/mount.h) fi dnl If we can't find any of the following, we have replacements for them. AC_REPLACE_FUNCS(fseeko ftello getpagesize hstrerror inet_aton mkstemp \ pread pwrite seteuid strcasecmp strerror strlcat strlcpy \ strspn setenv) dnl Source used by INN_TYPE_FPOS_T_LARGE. define([_INN_TYPE_FPOS_T_LARGE_SOURCE], [#include #include int main () { fpos_t fpos = 9223372036854775807ULL; off_t off; off = fpos; exit(off == (off_t) 9223372036854775807ULL ? 0 : 1); }]) dnl Check whether fpos_t is 64 bits and can be assigned to an off_t. If so, dnl sets HAVE_LARGE_FPOS_T; this means that a missing fseeko or ftello can be dnl emulated usint fgetpos and fsetpos. AC_DEFUN([INN_TYPE_FPOS_T_LARGE], [AC_CACHE_CHECK(for off_t-compatible fpos_t, inn_cv_type_fpos_t_large, [AC_TRY_RUN(_INN_TYPE_FPOS_T_LARGE_SOURCE(), [inn_cv_type_fpos_t_large=yes], [inn_cv_type_fpos_t_large=no], [inn_cv_type_fpos_t_large=no]) if test "$inn_cv_type_fpos_t_large" = yes ; then AC_DEFINE([HAVE_LARGE_FPOS_T], 1, [Define if fpos_t is at least 64 bits and compatible with off_t.]) fi])]) dnl If replacing fseeko or ftello, see if we can use fsetpos/fgetpos. if test "$ac_cv_func_fseeko" = no || test "$ac_cv_func_ftello" = no ; then INN_TYPE_FPOS_T_LARGE fi dnl Source used by INN_FUNC_MMAP. define([_INN_FUNC_MMAP_SOURCE], [_INN_HEADER_SOURCE()] [[#include #include int main() { int *data, *data2; int i, fd; /* First, make a file with some known garbage in it. Use something larger than one page but still an odd page size. */ data = malloc (20000); if (!data) return 1; for (i = 0; i < 20000 / sizeof (int); i++) data[i] = rand(); umask (0); fd = creat ("conftestmmaps", 0600); if (fd < 0) return 1; if (write (fd, data, 20000) != 20000) return 1; close (fd); /* Next, try to mmap the file and make sure we see the same garbage. */ fd = open ("conftestmmaps", O_RDWR); if (fd < 0) return 1; data2 = mmap (0, 20000, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (data2 == (int *) -1) return 1; for (i = 0; i < 20000 / sizeof (int); i++) if (data[i] != data2[i]) return 1; close (fd); unlink ("conftestmmaps"); return 0; }]]) dnl This portion is similar to what AC_FUNC_MMAP does, only it tests shared, dnl non-fixed mmaps. AC_DEFUN([INN_FUNC_MMAP], [AC_CACHE_CHECK(for working mmap, inn_cv_func_mmap, [AC_TRY_RUN(_INN_FUNC_MMAP_SOURCE(), inn_cv_func_mmap=yes, inn_cv_func_mmap=no, inn_cv_func_mmap=no)]) if test $inn_cv_func_mmap = yes ; then AC_DEFINE(HAVE_MMAP) fi]) dnl Source used by INN_FUNC_MMAP_NEEDS_MSYNC. define([_INN_FUNC_MMAP_NEEDS_MSYNC_SOURCE], [_INN_HEADER_SOURCE()] [[#include #include #include int main() { int *data, *data2; int i, fd; /* First, make a file with some known garbage in it. Use something larger than one page but still an odd page size. */ data = malloc (20000); if (!data) return 1; for (i = 0; i < 20000 / sizeof (int); i++) data[i] = rand(); umask (0); fd = creat ("conftestmmaps", 0600); if (fd < 0) return 1; if (write (fd, data, 20000) != 20000) return 1; close (fd); /* Next, try to mmap the file and make sure we see the same garbage. */ fd = open ("conftestmmaps", O_RDWR); if (fd < 0) return 1; data2 = mmap (0, 20000, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (data2 == (int *) -1) return 1; /* Finally, see if changes made to the mmaped region propagate back to the file as seen by read (meaning that msync isn't needed). */ for (i = 0; i < 20000 / sizeof (int); i++) data2[i]++; if (read (fd, data, 20000) != 20000) return 1; for (i = 0; i < 20000 / sizeof (int); i++) if (data[i] != data2[i]) return 1; close (fd); unlink ("conftestmmapm"); return 0; }]]) dnl Check whether the data read from an open file sees the changes made to an dnl mmaped region, or if msync has to be called for other applications to see dnl those changes. AC_DEFUN([INN_FUNC_MMAP_NEEDS_MSYNC], [AC_CACHE_CHECK(whether msync is needed, inn_cv_func_mmap_need_msync, [AC_TRY_RUN(_INN_FUNC_MMAP_NEEDS_MSYNC_SOURCE(), inn_cv_func_mmap_need_msync=no, inn_cv_func_mmap_need_msync=yes, inn_cv_func_mmap_need_msync=yes)]) if test $inn_cv_func_mmap_need_msync = yes ; then AC_DEFINE(MMAP_NEEDS_MSYNC, 1, [Define if you need to call msync for calls to read to see changes.]) fi]) dnl Source used by INN_FUNC_MMAP_SEES_WRITES. define([_INN_FUNC_MMAP_SEES_WRITES_SOURCE], [[#include #include #include #include #if HAVE_UNISTD_H # include #endif #include /* Fractional page is probably worst case. */ static char zbuff[1024]; static char fname[] = "conftestw"; int main () { char *map; int i, fd; fd = open (fname, O_RDWR | O_CREAT, 0660); if (fd < 0) return 1; unlink (fname); write (fd, zbuff, sizeof (zbuff)); lseek (fd, 0, SEEK_SET); map = mmap (0, sizeof (zbuff), PROT_READ, MAP_SHARED, fd, 0); if (map == (char *) -1) return 2; for (i = 0; fname[i]; i++) { if (write (fd, &fname[i], 1) != 1) return 3; if (map[i] != fname[i]) return 4; } return 0; }]]) dnl Check if an mmaped region will see writes made to the underlying file dnl without an intervening msync. AC_DEFUN([INN_FUNC_MMAP_SEES_WRITES], [AC_CACHE_CHECK(whether mmap sees writes, inn_cv_func_mmap_sees_writes, [AC_TRY_RUN(_INN_FUNC_MMAP_SEES_WRITES_SOURCE(), inn_cv_func_mmap_sees_writes=yes, inn_cv_func_mmap_sees_writes=no, inn_cv_func_mmap_sees_writes=no)]) if test $inn_cv_func_mmap_sees_writes = no ; then AC_DEFINE(MMAP_MISSES_WRITES, 1, [Define if you need to call msync after writes.]) fi]) dnl Check whether msync takes three arguments. (It takes three arguments on dnl Solaris and Linux, two arguments on BSDI.) AC_DEFUN([INN_FUNC_MSYNC_ARGS], [AC_CACHE_CHECK(how many arguments msync takes, inn_cv_func_msync_args, [AC_TRY_COMPILE( [#include #include ], [char *p; int psize; msync (p, psize, MS_ASYNC);], inn_cv_func_msync_args=3, inn_cv_func_msync_args=2)]) if test $inn_cv_func_msync_args = 3 ; then AC_DEFINE(HAVE_MSYNC_3_ARG, 1, [Define if your msync function takes three arguments.]) fi]) dnl Now that all the tests are set up, do the work of the mmap tests. INN_FUNC_MMAP if test x"$inn_cv_func_mmap" = xyes ; then AC_CHECK_FUNCS(madvise) INN_FUNC_MMAP_SEES_WRITES INN_FUNC_MMAP_NEEDS_MSYNC INN_FUNC_MSYNC_ARGS fi dnl If AF_UNIX is set in , assume we have Unix domain sockets. AC_DEFUN([INN_SYS_UNIX_SOCKETS], [AC_CACHE_CHECK([for Unix domain sockets], inn_cv_sys_unix_sockets, [AC_EGREP_CPP(yes, [#include #ifdef AF_UNIX yes #endif], inn_cv_sys_unix_sockets=yes, inn_cv_sys_unix_sockets=no)]) if test $inn_cv_sys_unix_sockets = yes ; then AC_DEFINE(HAVE_UNIX_DOMAIN_SOCKETS, 1, [Define if you have unix domain sockets.]) fi]) INN_SYS_UNIX_SOCKETS dnl Determine the facility for syslog messages. Default to LOG_NEWS for dnl syslog facility if it's available, but if it's not, fall back on dnl LOG_LOCAL1. --with-syslog-facility may have already set this. AC_DEFUN([INN_LOG_FACILITY], [AC_MSG_CHECKING(log facility for news) AC_CACHE_VAL(inn_cv_log_facility, [AC_EGREP_CPP(yes, [#include #ifdef LOG_NEWS yes #endif], inn_cv_log_facility=LOG_NEWS, inn_cv_log_facility=LOG_LOCAL1)]) if test x"$SYSLOG_FACILITY" = xnone ; then SYSLOG_FACILITY=$inn_cv_log_facility fi AC_MSG_RESULT($SYSLOG_FACILITY) AC_DEFINE_UNQUOTED(LOG_INN_SERVER, $SYSLOG_FACILITY, [Syslog facility to use for innd logs.]) AC_DEFINE_UNQUOTED(LOG_INN_PROG, $SYSLOG_FACILITY, [Syslog facility to use for INN program logs.]) AC_SUBST(SYSLOG_FACILITY)]) INN_LOG_FACILITY dnl Clean up our LIBS, just for grins. LIBS=`echo "$LIBS" | sed 's/^ *//' | sed 's/ */ /g' | sed 's/ *$//'` AC_CONFIG_HEADER(include/config.h) AC_OUTPUT( Makefile.global include/paths.h samples/inn.conf samples/innreport.conf samples/newsfeeds samples/sasl.conf scripts/inncheck scripts/innshellvars scripts/innshellvars.pl scripts/innshellvars.tcl scripts/news.daily support/fixscript , chmod +x support/fixscript ) dnl Print out some additional information on what to check. cat < /dev/null ; then : else cat <