On 29/04/2013 1:07 p.m., Amos Jeffries wrote:
One of the outstanding issues in ./configure has been the dependence
on standalone bash scripts for detecting whether a helper is able to
build or not.
The problem is that they are standalone so we cannot re-use test
results already existing in configure.ac in the scripts and vice-versa.
We also encounter some errors (as seen in the bugs about SASL
location) as a side effect of different tests being run.
To resolve this I propose changing the config.test files into small M4
scriptlets which can be included directly into configure at bootstrap
time.
Pros:
* we gain a huge amount of information from existing configure.ac tests
* we gain ability to run autoconf checks in the test scriptlets
* we can push test results back to the main configure.ac cache from
the scriptlets for faster overall process
The attached patch implements the above. I managed to avoid the expected
problem.
The nature of m4 macros however has added two smaller ones in its place.
Both well-known issues with m4_include() expansion:
* the macro is expanded in-place without scoping separation.
So any brokenness in the child scripts will be a little harder to
identify and may result in breakage of modues other than the one whose
child script was the cause.
* the macro takes literal arguments without variable expansion.
So a "full" path relative to the main configure.ac script is required
in every include. Meaning the modules.m4 file cannot simply sub-include
using the $helper script variable, but must be a full expansion of the
modules set.
I believe these are well outweighted by the Pros above however. Already
this patch is catching fails-to-build error in PAM, SASL, and LDAP far
better on several systems just by way of the macro usage in the
required.m4 files.
Amos
=== modified file 'acinclude/squid-util.m4'
--- acinclude/squid-util.m4 2012-10-11 21:14:50 +0000
+++ acinclude/squid-util.m4 2013-04-29 14:13:17 +0000
@@ -249,3 +249,30 @@
[$4])
AS_VAR_POPDEF([ac_Search])dnl
])
+
+dnl Check for Cyrus SASL
+AC_DEFUN([SQUID_CHECK_SASL],[
+ squid_sasl_present="auto"
+ AC_CHECK_HEADERS(sasl/sasl.h sasl.h)
+ AC_CHECK_LIB(sasl2,sasl_errstring,[LIBSASL="-lsasl2"],[
+ AC_CHECK_LIB(sasl,sasl_errstring,[LIBSASL="-lsasl"], [
+ squid_sasl_present="no"
+ ])
+ ])
+ case "$squid_host_os" in
+ Darwin)
+ if test "$ac_cv_lib_sasl2_sasl_errstring" = "yes" ; then
+ AC_DEFINE(HAVE_SASL_DARWIN,1,[Define to 1 if Mac Darwin without
sasl.h])
+ echo "checking for MAC Darwin without sasl.h ... yes"
+ squid_sasl_present="yes"
+ else
+ echo "checking for MAC Darwin without sasl.h ... no"
+ squid_sasl_present="no"
+ fi
+ ;;
+ esac
+ if test "x$squid_sasl_present" != "yes"; then
+ AC_MSG_WARN(Neither SASL nor SASL2 found)
+ fi
+ AC_SUBST(LIBSASL)
+])
=== modified file 'configure.ac'
--- configure.ac 2013-04-16 02:21:47 +0000
+++ configure.ac 2013-04-29 15:47:56 +0000
@@ -1726,45 +1726,7 @@
To see available helpers, see the helpers/basic_auth directory. ]),[
#nothing to do really
])
-#not specified. Inherit global
-if test "x$enable_auth_basic" = "x"; then
- enable_auth_basic=$enable_auth
-fi
-#conflicts with global
-if test "x$enable_auth_basic" != "xno" -a "x$enable_auth" = "xno" ; then
- AC_MSG_ERROR([Basic auth requested but auth disabled])
-fi
-#define list of modules to build
-if test "x$enable_auth_basic" = "xyes" ; then
- SQUID_LOOK_FOR_MODULES([$srcdir/helpers/basic_auth],[enable_auth_basic])
-fi
-#handle the "none" special case
-if test "x$enable_auth_basic" = "xnone" ; then
- enable_auth_basic=""
-fi
-BASIC_AUTH_HELPERS=""
-#enable_auth_basic contains either "no" or the list of modules to be built
-enable_auth_basic="`echo $enable_auth_basic| sed -e 's/,/ /g;s/ */ /g'`"
-if test "x$enable_auth_basic" != "xno" ; then
- AUTH_MODULES="$AUTH_MODULES basic"
- AC_DEFINE([HAVE_AUTH_MODULE_BASIC],1,[Basic auth module is built])
- for helper in $enable_auth_basic
- do
- dir="$srcdir/helpers/basic_auth/$helper"
- if test -f "$dir/config.test" && sh "$dir/config.test" "$squid_host_os";
then
- BASIC_AUTH_HELPERS="$BASIC_AUTH_HELPERS $helper"
- # special case
- if test "x$helper" = "xSASL" ; then
- squid_require_sasl=yes
- fi
- elif test -d "$srcdir/helpers/basic_auth/$helper" ; then
- AC_MSG_NOTICE([Basic auth helper $helper ... found but cannot be built])
- fi
- done
-fi
-AC_MSG_NOTICE([Basic auth helpers to be built: $BASIC_AUTH_HELPERS])
-AM_CONDITIONAL(ENABLE_AUTH_BASIC, test "x$enable_auth_basic" != "xno")
-AC_SUBST(BASIC_AUTH_HELPERS)
+m4_include([helpers/basic_auth/modules.m4])
AC_ARG_ENABLE(auth-ntlm,
AS_HELP_STRING([--enable-auth-ntlm="list of helpers"],
@@ -2096,7 +2058,7 @@
EXTERNAL_ACL_HELPERS="$EXTERNAL_ACL_HELPERS $helper"
# special case
if test "x$helper" = "xkerberos_ldap_group" ; then
- squid_require_sasl=yes
+ SQUID_CHECK_SASL
fi
else
AC_MSG_NOTICE([external acl helper $helper ... found but cannot be
built])
@@ -2184,27 +2146,6 @@
AC_MSG_NOTICE([MS Windows service mode enabled: $enable_win32_service])
-# Check for Cyrus SASL
-if test "x$squid_require_sasl" = "xyes"; then
- AC_CHECK_HEADERS(sasl/sasl.h sasl.h)
- AC_CHECK_LIB(sasl2,sasl_errstring,[LIBSASL="-lsasl2"],[
- AC_CHECK_LIB(sasl,sasl_errstring,[LIBSASL="-lsasl"], [
- AC_MSG_ERROR(Neither SASL nor SASL2 found)
- ])
- ])
- case "$squid_host_os" in
- Darwin)
- if test "$ac_cv_lib_sasl2_sasl_errstring" = "yes" ; then
- AC_DEFINE(HAVE_SASL_DARWIN,1,[Define to 1 if Mac Darwin without
sasl.h])
- echo "checking for MAC Darwin without sasl.h ... yes"
- else
- echo "checking for MAC Darwin without sasl.h ... no"
- fi
- ;;
- esac
- AC_SUBST(LIBSASL)
-fi
-
# Disable "unlinkd" code
AC_ARG_ENABLE(unlinkd,
AS_HELP_STRING([--disable-unlinkd],[Do not use unlinkd]), [
=== renamed file 'helpers/basic_auth/DB/config.test' =>
'helpers/basic_auth/DB/required.m4'
--- helpers/basic_auth/DB/config.test 2010-03-31 15:59:21 +0000
+++ helpers/basic_auth/DB/required.m4 2013-04-29 15:37:09 +0000
@@ -1,7 +1,3 @@
-#!/bin/sh
-
-## Test: do we have perl to build the helper scripts?
-## Test: do we have pod2man to build the manual?
-perl --version >/dev/null && echo | pod2man >/dev/null
-
-exit $?
+if test "x$PERL" != "x" -a "x$POD2MAN" != "x"; then
+ BUILD_HELPER="DB"
+fi
=== renamed file 'helpers/basic_auth/LDAP/config.test' =>
'helpers/basic_auth/LDAP/required.m4'
--- helpers/basic_auth/LDAP/config.test 2013-04-16 13:06:01 +0000
+++ helpers/basic_auth/LDAP/required.m4 2013-04-29 15:37:35 +0000
@@ -1,8 +1,1 @@
-#!/bin/sh
-if [ -f /usr/include/ldap.h -o -f /usr/local/include/ldap.h ]; then
- exit 0
-fi
-if [ -f /usr/include/winldap.h ]; then
- exit 0
-fi
-exit 1
+AC_CHECK_HEADERS([ldap.h winldap.h],[BUILD_HELPER="LDAP"])
=== renamed file 'helpers/basic_auth/MSNT-multi-domain/config.test' =>
'helpers/basic_auth/MSNT-multi-domain/required.m4'
--- helpers/basic_auth/MSNT-multi-domain/config.test 2005-12-29 09:15:21
+0000
+++ helpers/basic_auth/MSNT-multi-domain/required.m4 2013-04-30 03:07:06
+0000
@@ -1,2 +1,1 @@
-#!/bin/sh
-exit 0
+BUILD_HELPER="MSNT-multi-domain"
=== renamed file 'helpers/basic_auth/MSNT/config.test' =>
'helpers/basic_auth/MSNT/required.m4'
--- helpers/basic_auth/MSNT/config.test 2012-10-13 05:39:01 +0000
+++ helpers/basic_auth/MSNT/required.m4 2013-04-30 03:22:38 +0000
@@ -1,14 +1,8 @@
-#!/bin/sh
-#
-# Don't build this helper on Windows
-#
-if test "$1" = "mingw"; then
- exit 1
-fi
-if [ -f /usr/include/w32api/windows.h ]; then
- exit 1
-fi
-if [ -f /usr/include/windows.h ]; then
- exit 1
-fi
-exit 0
+#
+# DONT build this helper on Windows
+#
+# XXX: do we really need the mingw check?
+if test "$squid_host_os" != "mingw"; then
+ BUILD_HELPER="MSNT"
+ AC_CHECK_HEADERS([w32api/windows.h windows.h],[BUILD_HELPER=""])
+fi
=== renamed file 'helpers/basic_auth/NCSA/config.test' =>
'helpers/basic_auth/NCSA/required.m4'
--- helpers/basic_auth/NCSA/config.test 2005-12-29 09:15:21 +0000
+++ helpers/basic_auth/NCSA/required.m4 2013-04-30 02:52:32 +0000
@@ -1,2 +1,1 @@
-#!/bin/sh
-exit 0
+BUILD_HELPER="NCSA"
=== renamed file 'helpers/basic_auth/NIS/config.test' =>
'helpers/basic_auth/NIS/required.m4'
--- helpers/basic_auth/NIS/config.test 2005-12-29 09:15:21 +0000
+++ helpers/basic_auth/NIS/required.m4 2013-04-30 03:09:40 +0000
@@ -1,5 +1,1 @@
-#!/bin/sh
-if [ -f /usr/include/rpcsvc/yp_prot.h ]; then
- exit 0
-fi
-exit 1
+AC_CHECK_HEADERS([rpcsvc/yp_prot.h],[BUILD_HELPER="NIS"])
=== renamed file 'helpers/basic_auth/PAM/config.test' =>
'helpers/basic_auth/PAM/required.m4'
--- helpers/basic_auth/PAM/config.test 2005-12-29 09:15:21 +0000
+++ helpers/basic_auth/PAM/required.m4 2013-04-30 02:58:50 +0000
@@ -1,5 +1,1 @@
-#!/bin/sh
-if [ -f /usr/include/security/pam_appl.h ]; then
- exit 0
-fi
-exit 1
+AC_CHECK_HEADERS([security/pam_appl.h],[BUILD_HELPER="PAM"])
=== renamed file 'helpers/basic_auth/POP3/config.test' =>
'helpers/basic_auth/POP3/required.m4'
--- helpers/basic_auth/POP3/config.test 2006-12-24 21:00:32 +0000
+++ helpers/basic_auth/POP3/required.m4 2013-04-30 03:10:29 +0000
@@ -1,2 +1,1 @@
-#!/bin/sh
-exit 0
+BUILD_HELPER="POP3"
=== renamed file 'helpers/basic_auth/RADIUS/config.test' =>
'helpers/basic_auth/RADIUS/required.m4'
--- helpers/basic_auth/RADIUS/config.test 2010-03-23 15:45:39 +0000
+++ helpers/basic_auth/RADIUS/required.m4 2013-04-30 03:11:02 +0000
@@ -1,2 +1,1 @@
-#!/bin/sh
-exit 0
+BUILD_HELPER="RADIUS"
=== renamed file 'helpers/basic_auth/SASL/config.test' =>
'helpers/basic_auth/SASL/required.m4'
--- helpers/basic_auth/SASL/config.test 2013-04-16 13:06:01 +0000
+++ helpers/basic_auth/SASL/required.m4 2013-04-29 15:37:54 +0000
@@ -1,8 +1,6 @@
-#!/bin/sh
-if [ -f /usr/include/sasl.h -o -f /usr/local/include/sasl.h ]; then
- exit 0
-fi
-if [ -f /usr/include/sasl/sasl.h -o -f /usr/local/include/sasl/sasl.h ]; then
- exit 0
-fi
-exit 1
+SQUID_CHECK_SASL
+
+# on success, add to the built modules list
+if test "x$squid_check_sasl" = "xyes"; then
+ BUILD_HELPER="SASL"
+fi
=== renamed file 'helpers/basic_auth/SMB/config.test' =>
'helpers/basic_auth/SMB/required.m4'
--- helpers/basic_auth/SMB/config.test 2011-01-11 07:33:27 +0000
+++ helpers/basic_auth/SMB/required.m4 2013-04-30 03:15:18 +0000
@@ -1,10 +1,14 @@
-#!/bin/sh
+#
+## TODO: This can be done far better I'm sure
+#
for prefix in /usr/local /opt /opt/samba /usr/local/samba /usr
do
if [ -x ${prefix}/bin/smbclient ]; then
- exit 0
+ BUILD_HELPER="SMB"
fi
done
-echo "WARNING: Samba smbclient not found in default location. basic_smb_auth
may not work on this machine"
+if test "x$BUILD_HELPER" = "x"; then
+ AC_MSG_WARN([Samba smbclient not found in default location. basic_smb_auth
may not work on this machine])
+fi
# allow script install anyway.
-exit 0
+BUILD_HELPER="SMB"
=== renamed file 'helpers/basic_auth/SSPI/config.test' =>
'helpers/basic_auth/SSPI/required.m4'
--- helpers/basic_auth/SSPI/config.test 2012-10-13 05:39:01 +0000
+++ helpers/basic_auth/SSPI/required.m4 2013-04-30 03:18:14 +0000
@@ -1,14 +1,8 @@
-#!/bin/sh
#
# Only build this helper on Windows
#
-if test "$1" = "mingw"; then
- exit 0
-fi
-if [ -f /usr/include/w32api/windows.h ]; then
- exit 0
-fi
-if [ -f /usr/include/windows.h ]; then
- exit 0
-fi
-exit 1
+# FIXME: do we really need the mingw check anymore?
+if test "$squid_host_os" = "mingw"; then
+ BUILD_HELPER="SSPI"
+fi
+AC_CHECK_HEADERS([w32api/windows.h windows.h],[BUILD_HELPER="SSPI"])
=== renamed file 'helpers/basic_auth/fake/config.test' =>
'helpers/basic_auth/fake/required.m4'
--- helpers/basic_auth/fake/config.test 2010-07-12 14:45:17 +0000
+++ helpers/basic_auth/fake/required.m4 2013-04-29 15:42:52 +0000
@@ -1,2 +1,1 @@
-#!/bin/sh
-exit 0
+BUILD_HELPER="fake"
=== renamed file 'helpers/basic_auth/getpwnam/config.test' =>
'helpers/basic_auth/getpwnam/required.m4'
--- helpers/basic_auth/getpwnam/config.test 2005-12-29 09:15:21 +0000
+++ helpers/basic_auth/getpwnam/required.m4 2013-04-30 03:20:06 +0000
@@ -1,5 +1,1 @@
-#!/bin/sh
-if [ -f /usr/include/pwd.h ]; then
- exit 0
-fi
-exit 1
+AC_CHECK_HEADERS([pwd.h],[BUILD_HELPER="getpwnam"])
=== added file 'helpers/basic_auth/modules.m4'
--- helpers/basic_auth/modules.m4 1970-01-01 00:00:00 +0000
+++ helpers/basic_auth/modules.m4 2013-04-30 03:27:53 +0000
@@ -0,0 +1,93 @@
+# This file is supposed to run all the tests required to identify which
+# configured modules are able to be built in this environment
+
+# FIXME: de-duplicate $enable_auth_basic list containing double entries.
+
+#not specified. Inherit global
+if test "x$enable_auth_basic" = "x"; then
+ enable_auth_basic=$enable_auth
+fi
+#conflicts with global
+if test "x$enable_auth_basic" != "xno" -a "x$enable_auth" = "xno" ; then
+ AC_MSG_ERROR([Basic auth requested but auth disabled])
+fi
+#define list of modules to build
+if test "x$enable_auth_basic" = "xyes" ; then
+ SQUID_LOOK_FOR_MODULES([$srcdir/helpers/basic_auth],[enable_auth_basic])
+fi
+#handle the "none" special case
+if test "x$enable_auth_basic" = "xnone" ; then
+ enable_auth_basic=""
+fi
+
+BASIC_AUTH_HELPERS=""
+#enable_auth_basic contains either "no" or the list of modules to be built
+enable_auth_basic="`echo $enable_auth_basic| sed -e 's/,/ /g;s/ */ /g'`"
+if test "x$enable_auth_basic" != "xno" ; then
+ AUTH_MODULES="$AUTH_MODULES basic"
+ AC_DEFINE([HAVE_AUTH_MODULE_BASIC],1,[Basic auth module is built])
+ for helper in $enable_auth_basic
+ do
+ dir="$srcdir/helpers/basic_auth/$helper"
+
+ # modules converted to autoconf macros already
+ # NP: we only need this list because m4_include() does not accept
variables
+ if test "x$helper" = "xDB" ; then
+ m4_include([helpers/basic_auth/DB/required.m4])
+
+ elif test "x$helper" = "xLDAP" ; then
+ m4_include([helpers/basic_auth/LDAP/required.m4])
+
+ elif test "x$helper" = "xMSNT-multi-domain" ; then
+ m4_include([helpers/basic_auth/MSNT-multi-domain/required.m4])
+
+ elif test "x$helper" = "xMSNT" ; then
+ m4_include([helpers/basic_auth/MSNT/required.m4])
+
+ elif test "x$helper" = "xNCSA" ; then
+ m4_include([helpers/basic_auth/NCSA/required.m4])
+
+ elif test "x$helper" = "xNIS" ; then
+ m4_include([helpers/basic_auth/NIS/required.m4])
+
+ elif test "x$helper" = "xPOP3" ; then
+ m4_include([helpers/basic_auth/POP3/required.m4])
+
+ elif test "x$helper" = "xRADIUS" ; then
+ m4_include([helpers/basic_auth/RADIUS/required.m4])
+
+ elif test "x$helper" = "xSASL" ; then
+ m4_include([helpers/basic_auth/SASL/required.m4])
+
+ elif test "x$helper" = "xSMB" ; then
+ m4_include([helpers/basic_auth/SMB/required.m4])
+
+ elif test "x$helper" = "xSSPI" ; then
+ m4_include([helpers/basic_auth/SSPI/required.m4])
+
+ elif test "x$helper" = "xfake" ; then
+ m4_include([helpers/basic_auth/fake/required.m4])
+
+ elif test "x$helper" = "xgetpwnam" ; then
+ m4_include([helpers/basic_auth/getpwnam/required.m4])
+
+ # modules not yet converted to autoconf macros (or third party drop-in's)
+ elif test -f "$dir/config.test" && sh "$dir/config.test"
"$squid_host_os"; then
+ BUILD_HELPER="$helper"
+ fi
+
+ if test -d "$srcdir/helpers/basic_auth/$helper"; then
+ if test "$BUILD_HELPER" != "$helper"; then
+ AC_MSG_NOTICE([Basic auth helper $helper ... found but cannot be
built])
+ else
+ BASIC_AUTH_HELPERS="$BASIC_AUTH_HELPERS $BUILD_HELPER"
+ fi
+ else
+ AC_MSG_ERROR([Basic auth helper $helper ... not found])
+ fi
+ done
+fi
+
+AC_MSG_NOTICE([Basic auth helpers to be built: $BASIC_AUTH_HELPERS])
+AM_CONDITIONAL(ENABLE_AUTH_BASIC, test "x$enable_auth_basic" != "xno")
+AC_SUBST(BASIC_AUTH_HELPERS)