When some macro expanded in configure.ac calls AC_REQUIRE on another
macro that is defined in one of the local m4 macro dirs specified
with AC_CONFIG_MACRO_DIRS, aclocal prints spurious warnings like:

    configure.ac:4: warning: MY_BAR is m4_require'd but not m4_defun'd
    configure.ac:3: MY_FOO is expanded from...

Such warnings come from autom4te, and are due to the fact that the
*first* autom4te invocation issued by aclocal is not yet able to
"see" the m4 macro definitions in the local m4 dirs (because they
can be looked for only after the AC_CONFIG_MACRO_DIRS call has been
traced, and tracing it requires running autom4te).

To allow us to work around this issue, autom4te has introduced a new
"singleton" warning category, 'm4require-without-m4defun', that allow
us to silence that particular kind of warnings (and only it).

Reported by Nick Bowler; see point (4) of:
<http://lists.gnu.org/archive/html/autoconf-patches/2012-11/msg00000.html>

* configure.ac: Check whether autoconf/autom4te supports the
'm4require-without-m4defun' warning category.
* aclocal.in (trace_used_macros): If that's the case, use it when
invoking autom4te.
* t/aclocal-macrodirs.tap ("AC_CONFIG_MACRO_DIR interaction with
AC_REQUIRE"): This test passes now: remove the "TODO" directive.
* t/aclocal-macrodir.tap ("AC_CONFIG_MACRO_DIRS interaction with
AC_REQUIRE"): Likewise; but skip the test if autoconf is too old
and doesn't support the 'm4require-without-m4defun' directive.
* t/acloca17.sh: Remove.
* t/list-of-tests.mk: Adjust.

Signed-off-by: Stefano Lattarini <stefano.lattar...@gmail.com>
---
 aclocal.in              | 11 +++++++++++
 configure.ac            | 15 +++++++++++++++
 t/acloca17.sh           | 41 -----------------------------------------
 t/aclocal-macrodir.tap  | 14 +++++++++++++-
 t/aclocal-macrodirs.tap |  2 +-
 t/list-of-tests.mk      |  1 -
 6 files changed, 40 insertions(+), 44 deletions(-)
 delete mode 100755 t/acloca17.sh

diff --git a/aclocal.in b/aclocal.in
index 0220a7d..020c901 100644
--- a/aclocal.in
+++ b/aclocal.in
@@ -718,6 +718,17 @@ sub trace_used_macros ()
 
   my $traces = ($ENV{AUTOM4TE} || '@am_AUTOM4TE@');
   $traces .= " --language Autoconf-without-aclocal-m4 ";
+  # When AC_CONFIG_MACRO_DIRS is used, avoid possible spurious
+  # warnings from autom4te about macros being "m4_require'd but
+  # not m4_defun'd"; for more background, see:
+  # http://lists.gnu.org/archive/html/autoconf-patches/2012-11/msg00004.html
+  # Only modern-enough versions of autom4te allow us to silence
+  # this warning, so the conditional below (set at configure time)
+  # is actually needed.
+  if ('@am_cv_autoconf_has_warning_for_aclocal@' eq "yes")
+  {
+    $traces .= "-Wno-m4require-without-m4defun ";
+  }
   # All candidate files.
   $traces .= join (' ',
                   (map { "'$_'" }
diff --git a/configure.ac b/configure.ac
index 90985da..6eb4300 100644
--- a/configure.ac
+++ b/configure.ac
@@ -184,6 +184,21 @@ if test "$am_cv_autoconf_version" = no; then
   AC_MSG_ERROR([Autoconf $required_autoconf_version or better is required.])
 fi
 
+wcat=m4require-without-m4defun
+AC_CACHE_CHECK([whether autoconf supports the '$wcat' warning category],
+               [am_cv_autoconf_has_warning_for_aclocal],
+[mkdir conftest
+dnl Creative quoting required to avoid spurious expansion of AC_PREREQ macro
+echo 'AC''_INIT' > conftest/conftest.ac
+if AM_RUN_LOG([cd confetest && $am_AUTOCONF -Werror -W"$wcat" -o/dev/null]);
+then
+  am_cv_autoconf_has_warning_for_aclocal=yes
+else
+  am_cv_autoconf_has_warning_for_aclocal=no
+fi
+rm -rf conftest])
+AC_SUBST([am_cv_autoconf_has_warning_for_aclocal])
+
 # Test for ln.  We need use it to install the versioned binaries.
 AC_MSG_CHECKING([whether ln works])
 AC_CACHE_VAL([am_cv_prog_ln], [
diff --git a/t/acloca17.sh b/t/acloca17.sh
deleted file mode 100755
index ed8fc32..0000000
--- a/t/acloca17.sh
+++ /dev/null
@@ -1,41 +0,0 @@
-#! /bin/sh
-# Copyright (C) 2004-2012 Free Software Foundation, Inc.
-#
-# 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, 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 <http://www.gnu.org/licenses/>.
-
-# Make sure aclocal report unused required macros.
-
-am_create_testdir=empty
-. test-init.sh
-
-cat > configure.ac << 'END'
-AC_INIT
-SOME_DEFS
-END
-
-mkdir m4
-cat >m4/somedefs.m4 <<EOF
-AC_DEFUN([SOME_DEFS], [
-  AC_REQUIRE([UNDEFINED_MACRO])
-])
-EOF
-
-# FIXME: We want autom4te's 'undefined required macro' warning to be fatal,
-# but have no means to say so to aclocal.  We use WARNINGS=error instead.
-
-WARNINGS=error $ACLOCAL -I m4 2>stderr && { cat stderr >&2; exit 1; }
-cat stderr >&2
-grep '^configure\.ac:2:.*UNDEFINED_MACRO' stderr
-
-:
diff --git a/t/aclocal-macrodir.tap b/t/aclocal-macrodir.tap
index c48b31f..c2cbb0a 100755
--- a/t/aclocal-macrodir.tap
+++ b/t/aclocal-macrodir.tap
@@ -173,7 +173,13 @@ test_end
 
 #---------------------------------------------------------------------------
 
-test_begin "AC_CONFIG_MACRO_DIR interaction with AC_REQUIRE" TODO
+wcat=m4require-without-m4defun
+
+if echo AC_INIT | $AUTOCONF -Werror -W$wcat -o/dev/null -; then
+
+# FIXME: re-indent properly
+
+test_begin "AC_CONFIG_MACRO_DIR interaction with AC_REQUIRE"
 
 cat > configure.ac <<'END'
 AC_INIT([req], [1.0])
@@ -198,4 +204,10 @@ test $st -eq 0 \
 
 test_end
 
+else
+
+  skip_ -r "autom4te warning category '$wcat' unsupported"
+
+fi
+
 :
diff --git a/t/aclocal-macrodirs.tap b/t/aclocal-macrodirs.tap
index 3007ed4..a443e50 100755
--- a/t/aclocal-macrodirs.tap
+++ b/t/aclocal-macrodirs.tap
@@ -341,7 +341,7 @@ test_end
 
 #---------------------------------------------------------------------------
 
-test_begin "AC_CONFIG_MACRO_DIRS interaction with AC_REQUIRE" TODO
+test_begin "AC_CONFIG_MACRO_DIRS interaction with AC_REQUIRE"
 
 cat > configure.ac <<'END'
 AC_INIT([req], [1.0])
diff --git a/t/list-of-tests.mk b/t/list-of-tests.mk
index 290a1a5..f1a068f 100644
--- a/t/list-of-tests.mk
+++ b/t/list-of-tests.mk
@@ -87,7 +87,6 @@ t/acloca14.sh \
 t/acloca14b.sh \
 t/acloca15.sh \
 t/acloca16.sh \
-t/acloca17.sh \
 t/acloca18.sh \
 t/acloca19.sh \
 t/acloca20.sh \
-- 
1.8.0


Reply via email to