# This file is part of Mailfromd. -*- autoconf -*- # Copyright (C) 2005-2011 Sergey Poznyakoff # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . AC_PREREQ(2.63) m4_define([MF_VERSION_MAJOR], 7) m4_define([MF_VERSION_MINOR], 1) dnl m4_define([MF_VERSION_PATCH], 0) AC_INIT([mailfromd], MF_VERSION_MAJOR.MF_VERSION_MINOR[]m4_ifdef([MF_VERSION_PATCH],.MF_VERSION_PATCH), [bug-mailfromd@gnu.org.ua]) AC_CONFIG_SRCDIR([mfd/main.c]) AC_CONFIG_AUX_DIR([build-aux]) AC_CONFIG_HEADERS([config.h]) AM_INIT_AUTOMAKE([1.11 gnits tar-ustar dist-bzip2 dist-lzma dist-xz std-options silent-rules]) # Enable silent rules by default: AM_SILENT_RULES([yes]) # AC_DEFINE_UNQUOTED([MAILFROMD_VERSION_MAJOR], MF_VERSION_MAJOR, [Major version number]) AC_DEFINE_UNQUOTED([MAILFROMD_VERSION_MINOR], MF_VERSION_MINOR, [Minor version number]) AC_DEFINE_UNQUOTED([MAILFROMD_VERSION_PATCH], m4_ifdef([MF_VERSION_PATCH],MF_VERSION_PATCH,0), [Patchlevel number]) # Checks for programs. AC_PROG_CC gl_EARLY AC_PROG_RANLIB AC_PROG_YACC AC_PROG_LEX AC_PROG_LN_S # Debugging mode MU_DEBUG_MODE MF_GCC_QUIRKS # Checks for libraries. dnl Cannot use AC_CHECK_LIB to check for libresolv, because res_query dnl can be a macro, so resolv.h needs to be included. saved_LIBS=$LIBS LIBS="$LIBS -lresolv" AC_TRY_LINK([#include #include #include #include ], [res_query;], [:], [LIBS=$saved_LIBS]) AC_CHECK_LIB(socket, socket) AC_CHECK_LIB(nsl, gethostbyaddr) AC_CHECK_LIB(rt, nanosleep) # Checks for header files. AC_HEADER_STDC AC_CHECK_HEADERS([stdlib.h unistd.h sysexits.h paths.h]) # Checks for typedefs, structures, and compiler characteristics. AC_TYPE_SIGNAL AC_TYPE_SIZE_T AC_CHECK_SIZEOF(uint32_t) AC_CHECK_SIZEOF(unsigned long) AC_CHECK_SIZEOF(unsigned int) AH_TEMPLATE(GACOPYZ_UINT32_T, [32-bit unsigned data type]) if test "$ac_cv_sizeof_uint32_t" = 4 ; then AC_DEFINE_UNQUOTED(GACOPYZ_UINT32_T, uint32_t) elif test "$ac_cv_sizeof_unsigned_int" = 4 ; then AC_DEFINE_UNQUOTED(GACOPYZ_UINT32_T, unsigned int) elif test "$ac_cv_sizeof_unsigned_long" = 4 ; then AC_DEFINE_UNQUOTED(GACOPYZ_UINT32_T, unsigned long) else AC_MSG_ERROR([cannot determine 32-bit unsigned data type]) fi IU_CHECK_MEMBERS([struct msghdr.msg_control, struct msghdr.msg_accrights], , , [#include #include ]) # Checks for library functions. AC_CHECK_FUNCS([vsyslog setegid setregid setresgid seteuid setreuid \ res_ninit res_nclose res_nquery res_nquerydomain \ sysconf getdtablesize]) AC_REPLACE_FUNCS(daemon) gl_INIT AH_BOTTOM([ #if !HAVE_DECL_STRTOK_R extern char *strtok_r (char *s, const char *delim, char **save_ptr); #endif /* program_name is used by lib/error.c */ #define program_name program_invocation_name ]) # Check for GNU Mailutils AM_GNU_MAILUTILS([2.0], [all auth sieve cfg argp], [:]) AC_CHECK_TYPES([struct mu_argp_node_list],,,[#include ]) ### Check for Emacs site-lisp directory AM_PATH_LISPDIR if test "$EMACS" != "no"; then lisp_LISP='$(LISPSRC)' fi AC_SUBST(lisp_LISP) # Gettext. AM_GNU_GETTEXT([external], [need-formatstring-macros]) AM_GNU_GETTEXT_VERSION([0.16]) # Syslog AC_ARG_ENABLE([syslog-async], AC_HELP_STRING([--enable-syslog-async], [compile non-blocking version of syslog]), [case "${enableval}" in yes) syslog_async=yes ;; no) syslog_async=no ;; *) AC_MSG_ERROR([bad value ${enableval} for --enable-syslog-async]) ;; esac],[syslog_async=no]) if test $syslog_async = "yes"; then AC_ARG_VAR([DEFAULT_SYSLOG_ASYNC], [Define to 1 if syslog-async is being used by default]) if test -z "$DEFAULT_SYSLOG_ASYNC"; then DEFAULT_SYSLOG_ASYNC=0 fi AC_DEFINE_UNQUOTED([DEFAULT_SYSLOG_ASYNC],$DEFAULT_SYSLOG_ASYNC, [Define to 1 to use syslog_async by default]) AC_SUBST([BUILD_SYSLOG_ASYNC], '$(SYSLOG_ASYNC_O)') AC_DEFINE([USE_SYSLOG_ASYNC], [1], [Define if syslog-async is being used]) fi # Check for DBM flavor AH_TEMPLATE(BDB2_CURSOR_LASTARG, [Last argument to the cursor member of Berkeley 2 DB structure]) dnl The cursor member of DB structure used to take three arguments in older dnl implementations of Berkeley DB. Newer versions (>= 4.0) declare dnl it as taking four arguments. dnl This macro checks which of the variants we have. AC_DEFUN([MU_DB2_CURSOR], [AC_CACHE_CHECK([whether db->cursor takes 4 arguments], [mu_cv_bdb2_cursor_four_args], [AC_TRY_COMPILE([#include ], [ DB *db; db->cursor(NULL, NULL, NULL, 0) ], [mu_cv_bdb2_cursor_four_args=yes], [mu_cv_bdb2_cursor_four_args=no])]) if test $mu_cv_bdb2_cursor_four_args = yes; then AC_DEFINE(BDB2_CURSOR_LASTARG,[,0]) else AC_DEFINE(BDB2_CURSOR_LASTARG,[]) fi]) AH_TEMPLATE([WITH_BDB], [Define to the major version of Berkeley DB library to use]) use_dbm=no status_dbm=no AC_ARG_WITH([gdbm], AC_HELP_STRING([--with-gdbm], [use GNU DBM]), [ case "${withval}" in yes) use_dbm=GDBM ;; no) use_dbm=no ;; *) AC_MSG_ERROR(bad value ${withval} for --with-gdbm) ;; esac]) ## Support --with-db2 for backward compatibility if test "${with_db2+set}" = set; then case "${with_db2}" in yes) use_dbm=BDB2 ;; no) use_dbm=no ;; *) AC_MSG_ERROR(bad value ${with_db2} for --with-db2) ;; esac fi AC_ARG_WITH([berkeley-db], AC_HELP_STRING([--with-berkeley-db@<:@=version@:>@], [use Berkeley DB]), [ case "${withval}" in yes) use_dbm=BDB ;; no) use_dbm=no ;; *) use_dbm=BDB="${withval}";; esac]) ## Set the variable status_dbm to $1 if: ## ## 1. Function $3 is defined in the library $2 ## 2. Header file db.h is available ## ## Then check if the major version, minor version and patchlevel of the ## library matches those from the header. If so, define WITH_BDB ## to the version (i.e. $1 with all dots removed). Otherwise, report ## an error and stop. ## check_bdb() { ver=`echo $1 | tr -d '.'` major=`expr $ver : '\(.\).*'` AC_CHECK_LIB($2, $3, [AC_CHECK_HEADERS(db.h) if test $ac_cv_header_db_h = yes; then LIBS="$LIBS -l$2" MU_DB2_CURSOR status_dbm=$1 fi]) if test $status_dbm = no; then : else AC_RUN_IFELSE( [AC_LANG_PROGRAM([#include "db.h"], [int v_major, v_minor, v_patch; db_version(&v_major, &v_minor, &v_patch); return !(DB_VERSION_MAJOR == $major && v_major == DB_VERSION_MAJOR && v_minor == DB_VERSION_MINOR && v_patch == DB_VERSION_PATCH); ])], [AC_DEFINE_UNQUOTED(WITH_BDB,$ver)], [status_dbm=no]) fi } AC_SUBST(MU_COMMON_INCLUDES) ## Check for the Berkeley DB library version $1, assuming Slackware-like ## installation layout (header files in /usr/incude/db$vn and library named ## libdb-$version.so, where $version is the library version and $vn is ## $version with all dots removed. ## check_slackware_bdb() { dir=db`echo $1|tr -d '.'` save_CPPFLAGS=$CPPFLAGS while test -n "$dir" do if test -d /usr/include/$dir; then CPPFLAGS="$CPPFLAGS -I/usr/include/$dir" break elif test -d /usr/local/include/$dir; then CPPFLAGS="$CPPFLAGS -I/usr/local/include/$dir" break fi dir=`expr "$dir" : '\(.*\)[[0-9]]$'` done check_bdb $1 db-$1 db_create CPPFLAGS=$save_CPPFLAGS if test $status_dbm = "$1"; then MU_COMMON_INCLUDES="$MU_COMMON_INCLUDES -I/usr/include/$dir" fi } try_dbm() { case "$1" in GDBM) AC_CHECK_LIB(gdbm, gdbm_open, [AC_CHECK_HEADERS(gdbm.h, AC_DEFINE(WITH_GDBM,1, [Enable use of GNU DBM library])) LIBS="$LIBS -lgdbm" POPAUTH='popauth$(EXEEXT)' status_dbm=GDBM]);; BDB2) check_bdb 2 db db_open test "$status_dbm" != "no" && status_dbm="Berkeley DB v. $status_dbm";; BDB) for version in 4 3 2 do case $version in 4|3) func=db_create;; 2) func=db_open;; esac check_bdb $version db $func if test "$status_dbm" != no; then status_dbm="Berkeley DB v. $status_dbm" break; fi done;; BDB=*) name=`expr $1 : 'BDB=\(.*\)'` case $name in [[0-9]]*) check_slackware_bdb $name;; *) for version in 4 3 2 do case $version in 4|3) func=db_create;; 2) func=db_open;; esac check_bdb $version $name $func if test "$status_dbm" != no; then break; fi done ;; esac test "$status_dbm" != "no" && status_dbm="Berkeley DB v. $status_dbm" ;; esac } if test $use_dbm = no; then # Try all possible DBM values for use_dbm in BDB GDBM do try_dbm $use_dbm if test "$status_dbm" != no; then break fi done else try_dbm $use_dbm fi if test "$status_dbm" = "no"; then AC_MSG_ERROR([Cannot find DBM library to link with.]) fi AC_ARG_WITH([preprocessor], AC_HELP_STRING([--without-preprocessor], [do not use external preprocessor]), [ case "${withval}" in yes) use_ext_pp=yes ;; no) use_ext_pp=no ;; *) AC_MSG_ERROR(bad value ${withval} for --with-preprocessor) ;; esac],[use_ext_pp=yes]) AC_ARG_VAR([DEFAULT_PREPROCESSOR], [Set default preprocessor name]) if test -z "$DEFAULT_PREPROCESSOR" ; then DEFAULT_PREPROCESSOR="m4 -s" fi if test $use_ext_pp != no; then save_PATH=$PATH PREPROC_OPTIONS=`echo $DEFAULT_PREPROCESSOR | sed -n 's/[[^ ]][[^ ]]* //p'` case "$DEFAULT_PREPROCESSOR" in /*) PATH=`expr $DEFAULT_PREPROCESSOR : '\(.*\)/.*'`:$PATH DEFAULT_PREPROCESSOR=`expr $DEFAULT_PREPROCESSOR : '.*/\(.*\)'`;; esac AC_PATH_PROG(PPBIN, $DEFAULT_PREPROCESSOR) DEFAULT_PREPROCESSOR=$PPBIN if test -n "$DEFAULT_PREPROCESSOR"; then DEFAULT_PREPROCESSOR="$DEFAULT_PREPROCESSOR $PREPROC_OPTIONS" case $PPBIN in *m4) AC_SUBST(PP_SETUP_FILE,'pp-setup');; # Install default pp-setup esac fi PATH=$save_PATH fi AC_ARG_WITH([readline], AC_HELP_STRING([--without-readline], [do not use readline]), [ case "${withval}" in yes) usereadline=yes ;; no) usereadline=no ;; *) AC_MSG_ERROR(bad value ${withval} for --without-readline) ;; esac],[usereadline=maybe]) # Test for GNU Readline AC_SUBST(READLINE_LIBS) if test "$usereadline" != "no"; then dnl FIXME This should only link in the curses libraries if it's dnl really needed! dnl Check for Curses libs. CURSES_LIBS= for lib in ncurses curses termcap do AC_CHECK_LIB($lib, tputs, [CURSES_LIBS="-l$lib"; break]) done saved_LIBS=$LIBS LIBS="$LIBS $CURSES_LIBS" AC_CHECK_LIB(readline, readline, mf_have_readline=yes) LIBS=$saved_LIBS if test "$mf_have_readline" = "yes"; then AC_CHECK_HEADERS(readline/readline.h, AC_DEFINE(WITH_READLINE,1,[Enable use of readline])) READLINE_LIBS="-lreadline $CURSES_LIBS" saved_LIBS=$LIBS LIBS="$LIBS $READLINE_LIBS" AC_CHECK_FUNCS(rl_completion_matches) LIBS=$saved_LIBS usereadline="yes" else if test "$usereadline" = "yes"; then AC_MSG_WARN(readline requested but does not seem to be installed) fi usereadline="no" fi fi AH_BOTTOM([ /* Some older versions of readline have completion_matches */ #ifndef HAVE_RL_COMPLETION_MATCHES # define rl_completion_matches completion_matches #endif]) AC_SUBST(MILTER, '../gacopyz/libgacopyz.a') AC_SUBST(MILTER_INCLUDES, '-I$(top_srcdir)/gacopyz') # Set default state directory AC_SUBST(DEFAULT_STATE_DIR) AC_MSG_CHECKING(for default mfd state directory) AC_ARG_VAR([DEFAULT_STATE_DIR], [Set default mfd state directory]) if test -z "$DEFAULT_STATE_DIR"; then DEFAULT_STATE_DIR='$(localstatedir)/$(PACKAGE)' fi AC_MSG_RESULT($DEFAULT_STATE_DIR) # Prepare default socket spec AC_SUBST(DEFAULT_SOCKET) AC_MSG_CHECKING(for default communication socket) AC_ARG_VAR([DEFAULT_SOCKET], [Set default communication socket.]) if test -z "$DEFAULT_SOCKET"; then DEFAULT_SOCKET='mailfrom' fi AC_MSG_RESULT($DEFAULT_SOCKET) # Test for default user name AC_SUBST(DEFAULT_USER) AC_MSG_CHECKING(for default user name) AC_ARG_VAR([DEFAULT_USER], [Set default user name]) if test -z "$DEFAULT_USER"; then DEFAULT_USER=mail fi AC_MSG_RESULT($DEFAULT_USER) AC_DEFINE_UNQUOTED(DEFAULT_USER, "$DEFAULT_USER", [Default mfd user]) # Test for default expiration interval AC_SUBST(DEFAULT_EXPIRE_INTERVAL) AC_MSG_CHECKING(for default expiration interval) AC_ARG_VAR([DEFAULT_EXPIRE_INTERVAL], [Set default expiration interval]) if test -z "$DEFAULT_EXPIRE_INTERVAL"; then DEFAULT_EXPIRE_INTERVAL=86400 fi AC_MSG_RESULT($DEFAULT_EXPIRE_INTERVAL) AC_DEFINE_UNQUOTED(DEFAULT_EXPIRE_INTERVAL, $DEFAULT_EXPIRE_INTERVAL, [Default expiration interval]) # Test for default dns negative expiration interval AC_SUBST(DEFAULT_DNS_NEGATIVE_EXPIRE_INTERVAL) AC_MSG_CHECKING(for default dns negative expiration interval) AC_ARG_VAR([DEFAULT_DNS_NEGATIVE_EXPIRE_INTERVAL], [Set default expiration interval]) if test -z "$DEFAULT_DNS_NEGATIVE_EXPIRE_INTERVAL"; then DEFAULT_DNS_NEGATIVE_EXPIRE_INTERVAL=3600 fi AC_MSG_RESULT($DEFAULT_DNS_NEGATIVE_EXPIRE_INTERVAL) AC_DEFINE_UNQUOTED(DEFAULT_DNS_NEGATIVE_EXPIRE_INTERVAL, $DEFAULT_DNS_NEGATIVE_EXPIRE_INTERVAL, [Default expiration interval for negative DNS answers]) # Test for default rates expiration interval AC_SUBST(DEFAULT_EXPIRE_RATES_INTERVAL) AC_MSG_CHECKING(for default rates expiration interval) AC_ARG_VAR([DEFAULT_EXPIRE_RATES_INTERVAL], [Set default expiration interval]) if test -z "$DEFAULT_EXPIRE_RATES_INTERVAL"; then DEFAULT_EXPIRE_RATES_INTERVAL=300 fi AC_MSG_RESULT($DEFAULT_EXPIRE_RATES_INTERVAL) AC_DEFINE_UNQUOTED(DEFAULT_EXPIRE_RATES_INTERVAL, $DEFAULT_EXPIRE_RATES_INTERVAL, [Default expiration interval for the rates database]) # Test for default log facility AC_SUBST(DEFAULT_LOG_FACILITY) AC_MSG_CHECKING(for default log facility) AC_ARG_VAR([DEFAULT_LOG_FACILITY], [Set default log facility]) if test -z "$DEFAULT_LOG_FACILITY"; then DEFAULT_LOG_FACILITY=mail fi DEFAULT_LOG_FACILITY=`echo $DEFAULT_LOG_FACILITY | tr a-z A-Z` case $DEFAULT_LOG_FACILITY in LOG_*) ;; *) DEFAULT_LOG_FACILITY=LOG_$DEFAULT_LOG_FACILITY;; esac AC_TRY_COMPILE([#include ], [int lf = $DEFAULT_LOG_FACILITY], :, [AC_MSG_ERROR($DEFAULT_LOG_FACILITY: Unknown syslog facility)]) AC_MSG_RESULT($DEFAULT_LOG_FACILITY) AC_DEFINE_UNQUOTED(DEFAULT_LOG_FACILITY, $DEFAULT_LOG_FACILITY, [Default log facility]) # Test for setproctitle MF_PROCTITLE # Test for libpmilter AC_SUBST(META1_LIBS) AC_SUBST(META1_INCLUDES) AC_ARG_ENABLE([pmilter], AC_HELP_STRING([--enable-pmilter[[=PATH]]], [enable pmilter support]), [case "${enableval}" in yes) enable_pmilter=yes;; no) enable_pmilter=no;; /*) dir=$enableval/lib/meta1 if test -d $dir; then META1_LIBS="-L$dir" else AC_MSG_ERROR([$dir: No such directory]) fi dir=$enableval/include if test -d $dir/sm; then META1_INCLUDES="-I$dir" else AC_MSG_ERROR([$dir: No such directory]) fi enable_pmilter=yes ;; *) AC_MSG_ERROR([Bad argument to --enable-pmilter]) esac],[enable_pmilter=no]) if test "$enable_pmilter" = yes; then saved_LIBS=$LIBS AC_SUBST(PTHREAD_LIBRARIES) AC_CHECK_LIB(pthread, pthread_self, [ have_pthread=yes PTHREAD_LIBRARIES="-lpthread -lc" ], [ PTHREAD_LIBRARIES="-lpthread" AC_CHECK_FUNC(pthread_self, [HAVE_PTHREAD=yes]) ]) if test $have_pthread != yes; then AC_MSG_ERROR([POSIX threads library not found. Please install it and then reconfigure]) fi save_CPPFLAGS=$CPPFLAGS CPPFLAGS="$CPPFLAGS $META1_INCLUDES" AC_CHECK_HEADERS([sm/error.h sm/hdrmoddef.h sm/pmfapi.h sm/pmilter.h sm/smreplycodes.h sm/generic.h sm/mfapi.h sm/pmfdef.h sm/smmts.h], [], [AC_MSG_ERROR([Required header file $ac_header not found])], [ #ifdef HAVE_SM_ERROR_H # include #endif]) CFFPLAGS=$save_CPPFLAGS libs="pmilter pmutil evthr thr rcbcomm rcb mtar cstrr replr" save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $META1_LIBS" for file in $libs do AC_CHECK_LIB($file, main, [META1_LIBS="$META1_LIBS -l$file"], [AC_MSG_ERROR([Required library lib$file not found])]) done LDFLAGS=$save_LDFLAGS IU_CHECK_MEMBERS([struct pmilter_S.pmfi_thrmax_s, struct pmilter_S.pmfi_thrmax_h, struct pmilter_S.pmfi_fdmax], , , [#include "sm/error.h" #include "sm/smreplycodes.h" #include "sm/pmilter.h" #include "sm/pmfdef.h" #include "sm/pmfapi.h"]) LIBS="$LIBS $META1_LIBS" AC_CHECK_FUNCS([sm_pmfi_setmacs]) LIBS=$saved_LIBS fi AM_CONDITIONAL([PMULT_COND], [test "$enable_pmilter" = yes]) # GeoIP AC_ARG_WITH([geoip], AC_HELP_STRING([--with-geoip], [use GeoIP library]), [ case "${withval}" in yes) status_geoip=yes ;; no) status_geoip=no ;; *) AC_MSG_ERROR(bad value ${withval} for --with-geoip) ;; esac],[status_geoip=maybe]) AC_SUBST(GEOIP_LIBS) if test "$status_geoip" != "no"; then saved_LIBS=$LIBS AC_CHECK_LIB(GeoIP, GeoIP_new, [status_geoip="yes" GEOIP_LIBS="-lGeoIP"], [if test $status_geoip = "yes"; then AC_MSG_WARN(GeoIP requested but does not seem to be installed) fi status_geoip="no"]) LIBS=$saved_LIBS if test "$status_geoip" = "yes"; then AC_DEFINE([WITH_GEOIP], [1], [Enable use of GeoIP library]) fi fi # Doc hints. # Select a rendition level: # DISTRIB for stable releases (at most one dot in the version number) # and maintenance releases (two dots, patchlevel < 50) # PROOF for alpha releases. # PUBLISH can only be required manually when running make in doc/ AC_SUBST(RENDITION) case `echo $VERSION|sed 's/[[^.]]//g'` in ""|".") RENDITION=DISTRIB;; "..") if test `echo $VERSION | sed 's/.*\.//'` -lt 50; then RENDITION=DISTRIB else RENDITION=PROOF fi;; *) RENDITION=PROOF;; esac if test $RENDITION = "PROOF"; then if test -r $srcdir/git-describe; then GIT_DESCRIBE=`sed '2,$d' $srcdir/git-describe` AC_DEFINE_UNQUOTED([GIT_DESCRIBE], "$GIT_DESCRIBE", [The most recent git tag]) fi fi # Initialize the test suite. AC_CONFIG_TESTDIR(tests) AC_CONFIG_FILES([tests/Makefile tests/etc/Makefile tests/atlocal]) AM_MISSING_PROG([AUTOM4TE], [autom4te]) AC_CONFIG_COMMANDS([status],[ cat <