From: Stefano Lattarini Date: Sat, 3 Nov 2012 12:05:09 +0000 (+0100) Subject: warn: allow aclocal to silence m4_require warnings X-Git-Tag: v2.69b~190 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1ed0548896e941b381e96724e41badc42ef7ec6e;p=thirdparty%2Fautoconf.git warn: allow aclocal to silence m4_require warnings 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: * 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 Signed-off-by: Eric Blake --- diff --git a/doc/autoconf.texi b/doc/autoconf.texi index f2a661e3..ff8298ab 100644 --- a/doc/autoconf.texi +++ b/doc/autoconf.texi @@ -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 diff --git a/lib/m4sugar/m4sugar.m4 b/lib/m4sugar/m4sugar.m4 index 12a9ab74..94c4ba86 100644 --- a/lib/m4sugar/m4sugar.m4 +++ b/lib/m4sugar/m4sugar.m4 @@ -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])]) diff --git a/tests/m4sugar.at b/tests/m4sugar.at index 997e2ddd..56927b90 100644 --- a/tests/m4sugar.at +++ b/tests/m4sugar.at @@ -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. ## ## ----------------------------------- ##