diff options
author | Peter Simons <simons@cryp.to> | 2007-02-18 23:43:16 +0100 |
---|---|---|
committer | Peter Simons <simons@cryp.to> | 2007-02-18 23:43:16 +0100 |
commit | 16aee45643e593e2833e4dff19df7b5f14267a79 (patch) | |
tree | ba40c1ee401bbbcec7dbee5e3bb51d21c70db130 /m4/ax_path_milter.m4 | |
download | autoconf-archive-16aee45643e593e2833e4dff19df7b5f14267a79.tar.gz |
Imported http://autoconf-archive.cryp.to/ release 2007-02-14.
Diffstat (limited to 'm4/ax_path_milter.m4')
-rw-r--r-- | m4/ax_path_milter.m4 | 358 |
1 files changed, 358 insertions, 0 deletions
diff --git a/m4/ax_path_milter.m4 b/m4/ax_path_milter.m4 new file mode 100644 index 0000000..c6695a0 --- /dev/null +++ b/m4/ax_path_milter.m4 @@ -0,0 +1,358 @@ +##### http://autoconf-archive.cryp.to/ax_path_milter.html +# +# SYNOPSIS +# +# AX_PATH_MILTER([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) +# +# DESCRIPTION +# +# This macro tries to automatically find the library libmilter.a and +# the header file "libmilter/mfapi.h", which are required when +# compiling a milter for Sendmail. When successful, it sets the +# output variable MILTER_LIBS to "-lmilter", MILTER_LDFLAGS to +# contain an -Lpathtolib option, and MILTER_CPPFLAGS to contain an +# -Ipathtoinclude option, if they are necessary. +# +# The easiest way to use this macro is something like: +# +# AX_PATH_MILTER([8.12],[ +# LIBS="$MILTER_LIBS $LIBS" +# LDFLAGS="$MILTER_LDFLAGS $LDFLAGS" +# CPPFLAGS="$CPPFLAGS $MILTER_CPPFLAGS" +# ],[ +# AC_MSG_ERROR([required milter library and header not found]) +# ]) +# +# If the macro is successful, it just adds any flags to the necessary +# environment. If it is not successful, it would likely be a fatal +# error, because if an application is linking with libmilter.a, it is +# probably because it is a milter. +# +# There are two optional "--with" options for configure which are +# added. If they are specified, they override any searching that is +# done. They are: +# +# --with-sendmail-base=<DIR> This option is used to explicitly +# specify the base of the sendmail distribution. +# +# --with-sendmail-obj=<DIR> The option is used to explicitly specify +# the "obj.*" subdirectory in the sendmail distribution +# that should be used. +# +# When sendmail-base is not specified, the current environment is +# first tested to see if the header and library are available, and if +# so MILTER_LDFLAGS and MILTER_CPPFLAGS are left empty. +# +# There are two places that are searched for the sendmail base +# directory. The first location is one directory down from the +# current directory. It checks if there is a directory of the form +# sendmail-8.1*, limited to version 8.12.x or higher, then chooses +# the directory with the highest version number. If that method does +# not succeed, it then looks in the file /etc/mail/sendmail.cf for +# the directory it was built from, and uses the base of that +# distribution. If neither of these methods work, then it fails. +# +# There are two methods for finding the "obj.*" directory when it is +# not specified. The first is to try to run sendmail's Build program +# with the -M option which will print out the name of the obj. +# directory for the tool in the directory where it is run from. If +# this does not work, is looks for the newest directory of the form +# "obj.*" in the sendmail base directory. +# +# Two addition output variables that are defined, whether or not the +# files are found are SENDMAIL_BASE_DIR and SENDMAIL_OBJ_DIR, which +# are the suspected location of the sendmail base directory and obj.* +# subdirectory. +# +# NOTE: POSIX threads MUST be configured BEFORE this function is +# called or it will not find libmilter.a even if it exists. The +# easiest way is to use the ACX_PTHREAD macro by Steven G. Johnson +# and Alejandro Forero Cuervo which is available from the Autoconf +# Macro Archive. +# +# LAST MODIFICATION +# +# 2004-02-21 +# +# COPYLEFT +# +# Copyright (c) 2004 Tim Toolan <toolan@ele.uri.edu> +# +# 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 2 of the +# License, 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. +# +# As a special exception, the respective Autoconf Macro's copyright +# owner gives unlimited permission to copy, distribute and modify the +# configure scripts that are the output of Autoconf when processing +# the Macro. You need not follow the terms of the GNU General Public +# License when using or distributing such scripts, even though +# portions of the text of the Macro appear in them. The GNU General +# Public License (GPL) does govern all other use of the material that +# constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the +# Autoconf Macro released by the Autoconf Macro Archive. When you +# make and distribute a modified version of the Autoconf Macro, you +# may extend this special exception to the GPL to apply to your +# modified version as well. + +############################################################################### +AC_DEFUN([AX_PATH_MILTER], [ + +# Used to indicate success or failure of this function. +ax_path_milter_ok=no + +# Convert sections of MINIMUM-VERSION to three digit numbers by adding zeros. +# For example 8.12.9 would become 008.012.009 +ac_milter_minimum_version=`echo "$1" | sed 's,\([[0-9]]*\),x\1x,g;s,x\([[0-9]]\)x,x0\1x,g;s,x\([[0-9]][[0-9]]\)x,x0\1x,g;s,x,,g'` + +# Add options --with-sendmail-base and --with-sendmail-obj to configure. +AC_ARG_WITH([sendmail-base], + [ --with-sendmail-base=<DIR> base directory of sendmail distribution]) +AC_ARG_WITH([sendmail-obj], + [ --with-sendmail-obj=<DIR> obj.* subdirectory in sendmail distribution]) + +# Check for functions required by libmilter. +AC_CHECK_FUNC(inet_aton, [], [AC_SEARCH_LIBS(inet_aton, [socket nsl resolv])]) +AC_CHECK_FUNC(socket, [], [AC_SEARCH_LIBS(socket, [socket nsl])]) +AC_CHECK_FUNC(gethostbyname, [], [AC_SEARCH_LIBS(gethostbyname, [socket nsl])]) + +############################################################################### +# +# If neither --with-sendmail-base or --with-sendmail-obj is specified +# check the existing environment first for mfapi.h and libmilter without +# modifying CPPFLAGS, LDFLAGS, and LIBS first. +# +if test "x$with_sendmail_base$with_sendmail_obj" = "x" ; then + AC_CHECK_HEADER([libmilter/mfapi.h],[ + AC_CHECK_LIB([milter],[smfi_main],[ + # both tests succeeded so indicate success + ax_path_milter_ok=yes + + # add -lmilter to the libraries to link + MILTER_LIBS="-lmilter" + ]) + ]) + + if test "$ax_path_milter_ok" = "no" ; then + # Unset the cached test results because we will be trying them again later. + ac_milter_tmp=abcdefg + if unset ac_milter_tmp 2> /dev/null ; then + unset ac_cv_header_libmilter_mfapi_h + unset ac_cv_lib_milter_smfi_main + else + AC_MSG_WARN( + [system doesn't have unset so either use --with-sendmail-base + or set LDFLAGS and CPPFLAGS with the necessary -L and -I options]) + fi + fi +fi + +############################################################################### +# +# If didn't already fine necessary files then search. +# +if test "$ax_path_milter_ok" = "no" ; then + ############################################################################# + # + # Determine the sendmail base directory and set SENDMAIL_BASE_DIR. + # + if test "x$with_sendmail_base" != "x" ; then + # set SENDMAIL_BASE_DIR to the one specified by--with-sendmail-base + SENDMAIL_BASE_DIR="$with_sendmail_base" + else + AC_MSG_CHECKING([for sendmail base directory in ../ ]) + # + # --with-sendmail-base is not used, so we will try to determine it + # + # 1) List all directories one level down that look like sendmail. + # 2) Select ones that are sendmail 8.12 or higher (including 8.13 + # versions when they come out). + # 3) Replace any single digit last version numbers with a two digit + # version number (ie. 8.12.9 becomes 8.12.09). + # 4) Sort all of the directories found in reverse order. + # 5) Take the first one (the highest version). + # 6) Restore the single digit version numbers. + # + ac_milter_tmp=`ls -d ../sendmail-8.1* 2> /dev/null | grep '../sendmail-8.1[[2-9]]' | sed 's,\.\([[0-9]]\)$,.0\1,' | sort -r | sed '1q' | sed 's,\.0\([[0-9]]\)$,.\1,'` + + # Convert found version sections to three digit numbers by adding zeros. + ac_milter_found_version=`echo "$ac_milter_tmp" | sed 's,.*/sendmail-,,;s,\([[0-9]]*\),x\1x,g;s,x\([[0-9]]\)x,x0\1x,g;s,x\([[0-9]][[0-9]]\)x,x0\1x,g;s,x,,g'` + + # If ac_milter_minimum_version is equal to ac_milter_lower_version, then + # the found version is greater than or equal to the minumum version. + # Pick the version string that is the lesser of the two. + # An empty string would be less than anything. + # In short, ac_milter_version_ok will equal yes if the version is ok, + # and no otherwise. + ac_milter_version_ok=`echo "x$ac_milter_minimum_version +x$ac_milter_found_version" | sort | sed '1q' | sed "s,x${ac_milter_minimum_version},yes,;s,x${ac_milter_found_version},no," ` + + # If we have something add the current directory to it. + if test "x$ac_milter_tmp" != "x" ; then + ac_milter_tmp="`pwd`/$ac_milter_tmp" + fi + + if test -r "${ac_milter_tmp}/include/libmilter/mfapi.h" && \ + test "$ac_milter_version_ok" = "yes" ; then + # The file mfapi.h exists so we will use this as SENDMAIL_BASE_DIR. + AC_MSG_RESULT([yes]) + SENDMAIL_BASE_DIR="$ac_milter_tmp" + else + AC_MSG_RESULT([no]) + AC_MSG_CHECKING([for sendmail base from /etc/mail/sendmail.cf]) + # + # The previous method to find SENDMAIL_BASE_DIR failed, so we will + # try this method. + # + # 1) Check for a line in /etc/mail/sendmail.cf of the form: + # ##### in /some/path/sendmail-8.x.x/more/path + # This is the directory that the sendmail.cf file was built in. + # 2) Take the first occurrence if there are more than one. + # 3) Remove the leading "##### in ". + # 4) Remove everything after the sendmail-8.x.x path component. + # +dnl # Note that the following expression only should not use double +dnl # square brackets because for some reason, possibly having to +dnl # do with the pound sign, m4 doesn't convert them to single brackets. +dnl # + ac_milter_tmp=`grep "^##### in /" /etc/mail/sendmail.cf 2> /dev/null | grep "/sendmail-8.1" | sed '1q' | sed 's,^##### in ,,' | sed 's,\(/sendmail-8\.[0-9.]*\).*,\1,'` + + # Convert found version sections to three digit numbers by adding zeros. + ac_milter_found_version=`echo "$ac_milter_tmp" | sed 's,.*/sendmail-,,;s,\([[0-9]]*\),x\1x,g;s,x\([[0-9]]\)x,x0\1x,g;s,x\([[0-9]][[0-9]]\)x,x0\1x,g;s,x,,g'` + + # ac_milter_version_ok will equal yes if the version is ok, otherwise no. + ac_milter_version_ok=`echo "x$ac_milter_minimum_version +x$ac_milter_found_version" | sort | sed '1q' | sed "s,x${ac_milter_minimum_version},yes,;s,x${ac_milter_found_version},no," ` + + if test -r "${ac_milter_tmp}/include/libmilter/mfapi.h" && \ + test "$ac_milter_version_ok" = "yes" ; then + # The file mfapi.h exists so we will use this as SENDMAIL_BASE_DIR. + AC_MSG_RESULT([yes]) + SENDMAIL_BASE_DIR="$ac_milter_tmp" + else + AC_MSG_RESULT([no]) + fi + fi + fi + + ############################################################################# + # + # Determine the sendmail obj.* directory and set SENDMAIL_OBJ_DIR. + # We can only do this if we found SENDMAIL_BASE_DIR. + # + if test "x$SENDMAIL_BASE_DIR" != "x" ; then + if test "x$with_sendmail_obj" != "x" ; then + # set SENDMAIL_OBJ_DIR to the one specified by--with-sendmail-obj + SENDMAIL_OBJ_DIR="$with_sendmail_obj" + else + AC_MSG_CHECKING([for sendmail obj.* subdirectory using Build -M]) + # + # --with-sendmail-obj is not used, so we will try to determine it + # + # Try to run sendmail's Build program with the -M option which will + # print out the name of the obj. directory for the tool in the + # directory where it is run from. + # + ac_milter_tmp=`(cd ${SENDMAIL_BASE_DIR}/libmilter 1> /dev/null ; ./Build -M ) 2> /dev/null` + + if test -f "${ac_milter_tmp}/libmilter.a" ; then + # libmilter.a exists so this is the one we will choose + AC_MSG_RESULT([yes]) + # Remove beginning and end of path from obj.* directory. + SENDMAIL_OBJ_DIR=`echo "$ac_milter_tmp" | sed 's,/libmilter$,,;s,.*/,,'` + else + AC_MSG_RESULT([no]) + AC_MSG_CHECKING([for sendmail obj.* subdirectory using ls]) + # + # List all directories of the form "obj." in the sendmail base + # directory, and choose the one with the latest modification date. + # + ac_milter_tmp=`ls -dt ${SENDMAIL_BASE_DIR}/obj.*/libmilter 2> /dev/null | sed '1q'` + + if test -f "${ac_milter_tmp}/libmilter.a" ; then + # libmilter.a exists so this is the one we will choose + AC_MSG_RESULT([yes]) + # Remove beginning and end of path from obj.* directory. + SENDMAIL_OBJ_DIR=`echo "$ac_milter_tmp" | sed 's,/libmilter$,,;s,.*/,,'` + else + AC_MSG_RESULT([no]) + fi + fi + fi + fi + + ############################################################################# + # + # If we have both SENDMAIL_BASE_DIR and SENDMAIL_OBJ_DIR we will check + # for the necessary files. + # + if test "x$SENDMAIL_BASE_DIR" != "x" && \ + test "x$SENDMAIL_OBJ_DIR" != "x" ; then + + # Save and modify CPPFLAGS. + ac_milter_save_CPPFLAGS="$CPPFLAGS" + MILTER_CPPFLAGS="-I$SENDMAIL_BASE_DIR/include" + CPPFLAGS="$CPPFLAGS $MILTER_CPPFLAGS" + + # Save and modify LDFLAGS. + ac_milter_save_LDFLAGS="$LDLFAGS" + MILTER_LDFLAGS="-L${SENDMAIL_BASE_DIR}/${SENDMAIL_OBJ_DIR}/libmilter" + LDFLAGS="$MILTER_LDFLAGS $LDFLAGS" + + AC_CHECK_HEADER([libmilter/mfapi.h],[ + AC_CHECK_LIB([milter],[smfi_main],[ + # both tests succeeded so add -lmilter to the libraries to link + MILTER_LIBS="-lmilter" + + # indicate success + ax_path_milter_ok=yes + ]) + ]) + + # Restore the modified environment + CPPFLAGS="$ac_milter_save_CPPFLAGS" + LDFLAGS="$ac_milter_save_LDFLAGS" + + fi +fi + +# If failure, clear MILTER_LIBS, MILTER_LDFLAGS and MILTER_CPPFLAGS. +if test "$ax_path_milter_ok" = "no" ; then + MILTER_CPPFLAGS="" + MILTER_LIBS="" + MILTER_LDFLAGS="" +fi + +# export these to the make environment +AC_SUBST([MILTER_LIBS]) +AC_SUBST([MILTER_CPPFLAGS]) +AC_SUBST([MILTER_LDFLAGS]) +AC_SUBST([SENDMAIL_BASE_DIR]) +AC_SUBST([SENDMAIL_OBJ_DIR]) + +# Indicate status of checking for libmilter stuff. +AC_MSG_CHECKING([if files required by libmilter are present]) + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND. +if test "$ax_path_milter_ok" = "yes" ; then + AC_MSG_RESULT([yes]) + $2 +else + AC_MSG_RESULT([no]) + $3 +fi + +])dnl |