]> git.ipfire.org Git - thirdparty/autoconf.git/commitdiff
warn: allow aclocal to silence m4_require warnings
authorStefano Lattarini <stefano.lattarini@gmail.com>
Sat, 3 Nov 2012 12:05:09 +0000 (13:05 +0100)
committerEric Blake <eblake@redhat.com>
Fri, 9 Nov 2012 23:16:22 +0000 (16:16 -0700)
We introduce a new witness macro, m4_require_silent_probe, for use by
aclocal during the Autoconf-without-aclocal-m4 language.  This will let
aclocal process AC_CONFIG_MACRO_DIRS without emitting spurious warnings.
In fact, if aclocal doesn't suppress require warnings, then, 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, the
*first* autom4te invocation issued by aclocal, not yet being able to "see"
the m4 macro definitions in the local m4 dirs, will print 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...

Expose the use of this macro in our testsuite.

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

* lib/m4sugar/m4sugar.m4 (_m4_require_call): Make warnings in the
-Wsyntax category depend on the witness macro.
* tests/m4sugar.at (m4@&t@_require: warning message): New test.
* doc/autoconf.texi (Prerequisite Macros): Document how aclocal
can silence AC_REQUIRE (m4_require) warnings.

Signed-off-by: Stefano Lattarini <stefano.lattarini@gmail.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
doc/autoconf.texi
lib/m4sugar/m4sugar.m4
tests/m4sugar.at

index f2a661e3f34360eaa05e24c37a66e42617b433d7..ff8298ab66cd43832b7cdb1bc3fcf377a0deede4 100644 (file)
@@ -14636,6 +14636,13 @@ put all @code{AC_REQUIRE} calls
 at the beginning of a macro.  You can use @code{dnl} to avoid the empty
 lines they leave.
 
+Autoconf will normally warn if an @code{AC_REQUIRE} call refers to a
+macro that has not been defined.  However, the @command{aclocal} tool
+relies on parsing an incomplete set of input files to trace which macros
+have been required, in order to then pull in additional files that
+provide those macros; for this particular use case, pre-defining the
+macro @code{m4_require_silent_probe} will avoid the warnings.
+
 @node Suggested Ordering
 @subsection Suggested Ordering
 @cindex Macros, ordering
index 12a9ab74ef761796713d5b61889d2de4f6bc1fd2..94c4ba8676bd2392ec72460b7b93dfb7745e61ef 100644 (file)
@@ -2080,13 +2080,19 @@ m4_if([$0], [m4_require], [[m4_defun]], [[AC_DEFUN]])['d macro])])]dnl
 #
 # This is called frequently, so minimize the number of macro invocations
 # by avoiding dnl and other overhead on the common path.
+# The use of a witness macro protecting the warning allows aclocal
+# to silence any warnings when probing for what macros are required
+# and must therefore be located, when using the Autoconf-without-aclocal-m4
+# autom4te language.  For more background, see:
+# https://lists.gnu.org/archive/html/automake-patches/2012-11/msg00035.html
 m4_define([_m4_require_call],
 [m4_pushdef([_m4_divert_grow], m4_decr(_m4_divert_grow))]dnl
 [m4_pushdef([_m4_diverting([$1])])m4_pushdef([_m4_diverting], [$1])]dnl
 [m4_divert_push(_m4_divert_grow, [-])]dnl
 [m4_if([$2], [], [$1], [$2])
 m4_provide_if([$1], [m4_set_remove([_m4_provide], [$1])],
-  [m4_warn([syntax], [$1 is m4_require'd but not m4_defun'd])])]dnl
+  [m4_ifndef([m4_require_silent_probe],
+    [m4_warn([syntax], [$1 is m4_require'd but not m4_defun'd])])])]dnl
 [_m4_divert_raw($3)_m4_undivert(_m4_divert_grow)]dnl
 [m4_divert_pop(_m4_divert_grow)_m4_popdef([_m4_divert_grow],
 [_m4_diverting([$1])], [_m4_diverting])])
index 997e2ddd82c9d5651b300767a4b1a1aa9d43836e..56927b90b862371ecaac0f0897f577ed732e5ea3 100644 (file)
@@ -429,6 +429,57 @@ autom4te: m4 failed with exit status: 1
 AT_CLEANUP
 
 
+## ----------------------------- ##
+## m4_require: warning message.  ##
+## ----------------------------- ##
+
+AT_SETUP([m4@&t@_require: warning message])
+AT_KEYWORDS([m4@&t@_require m4@&t@_require_silent_probe])
+
+# Mirror the job of aclocal on a typical scenario: the user invokes a
+# single macro that comes from one included file, which in turn requires
+# another macro from a second file.  When using the incomplete set of
+# files, we want a warning, unless we are merely learning which additional
+# macros are needed in order to regenerate the list of files to include.
+AT_DATA_M4SUGAR([script.4s],
+[[m4_init
+m4_include([script1.4s])
+foo
+]])
+
+AT_DATA_M4SUGAR([script1.4s],
+[[m4_defun([foo], [m4_require([bar])])
+]])
+
+AT_DATA_M4SUGAR([script2.4s],
+[[m4_defun([bar], [BAR])
+]])
+
+AT_CHECK_M4SUGAR([], [0], [],
+[[script.4s:3: warning: bar is m4@&t@_require'd but not m4@&t@_defun'd
+script1.4s:1: foo is expanded from...
+script.4s:3: the top level
+]])
+
+# Inline expansion of AT_CHECK_M4SUGAR, mirroring how aclocal will
+# inject a definition of our witness macro for a silent run.
+echo 'm4@&t@_define([m4@&t@_require_silent_probe])' |
+  AT_CHECK_AUTOM4TE([--language=m4sugar - script.4s -o script],
+[0], [], [])
+
+# Now that we have recomputed the set of include files, things should work.
+AT_DATA_M4SUGAR([script.4s],
+[[m4_init
+m4_include([script1.4s])
+m4_include([script2.4s])
+foo
+]])
+
+AT_CHECK_M4SUGAR([], [0], [], [])
+
+AT_CLEANUP
+
+
 ## ----------------------------------- ##
 ## m4_require: circular dependencies.  ##
 ## ----------------------------------- ##