summaryrefslogtreecommitdiff
path: root/tests/tools.at
diff options
context:
space:
mode:
authorZack Weinberg <zackw@panix.com>2020-08-14 13:16:58 -0400
committerZack Weinberg <zackw@panix.com>2020-08-18 08:24:05 -0400
commitaba75f6d4a9c875a9d5d90a07c6b3678db66a4bf (patch)
treebd22316093ce106881b5d9d5574dbdbc65d72191 /tests/tools.at
parent6a0c0239449a98181c5dd7e505cddbc0840471a4 (diff)
downloadautoconf-aba75f6d4a9c875a9d5d90a07c6b3678db66a4bf.tar.gz
Warn if AC_INIT or AC_OUTPUT are missing from configure.ac (#107986)
It is almost always incorrect for a configure script to omit either AC_INIT or AC_OUTPUT. Issue warnings in the ‘syntax’ category for this. The implementation is, unfortunately, a bit of a kludge. To check for the _absence_ of a macro invocation, we can use m4_provide_if inside a m4_wrap hook. However, if we activate the m4_wrap hook directly from general.m4, we get spurious warnings at freeze time. We also get warnings whenever a script that’s missing AC_INIT and/or AC_OUTPUT is *traced*, which means we get double warnings from autoconf, and autoheader and aclocal complain about it too, which seems unnecessary. A clean way to deal with this would be to make the hook look for a special macro that’s defined only when autoconf (the program) is invoked without any --trace arguments. Unfortunately, autom4te doesn’t pass --define down to M4, and changing that would involve coordinating with Automake (the project), so instead I’ve gone for the kludge: a new file lib/autoconf/trailer.m4 that calls m4_wrap. This file is *not* included in autoconf.m4f, but it’s installed, and it’s added to the m4 invocation by autoconf (the program) only when not tracing. (It still uses m4_wrap, because we pass it to m4 *before* configure.ac, because otherwise we get nonsense locations for any *other* diagnostics coming out of this autoconf invocation. I don’t know why.) The additional checks in autoreconf are intended to make sure that if autoreconf skips a directory entirely, you get told why. Lots of tests in the testsuite didn’t bother with AC_OUTPUT, and somewhat fewer didn’t bother with AC_INIT; where possible I just added them. Suggested by David A. Wheeler, who submitted a patch, but I didn’t wind up using any of his code. (His implementation used an extra tracing pass, only checked for a missing AC_INIT, and invented a new command-line option to turn off this specific warning. I thought this was tidier overall, despite the kludge.) * lib/autoconf/general.m4 (_AC_FINALIZE): New macro: code to be run when generating configure, after the entire configure.ac is processed. Currently only checks that AC_INIT and AC_OUTPUT were called at some point, issuing syntax-category warnings if not. (AC_INIT, AC_OUTPUT): m4_provide self. * lib/autoconf/trailer.m4: New file that just calls m4_wrap([_AC_FINALIZE]). * lib/local.mk: Install new file. * bin/autoconf.as: Add trailer.m4 to the final invocation of autom4te, but only when not tracing. * bin/autoreconf.in (autoreconf_current_directory): Distinguish in diagnostics between “directory skipped because it doesn’t have a configure.ac or configure.in” (e.g. Cygnus configure) and “directory has a configure.ac but it doesn’t appear to be autoconf input.” * tests/*.at: Fix all tests affected by the new warnings.
Diffstat (limited to 'tests/tools.at')
-rw-r--r--tests/tools.at28
1 files changed, 23 insertions, 5 deletions
diff --git a/tests/tools.at b/tests/tools.at
index 314462ff..3093225c 100644
--- a/tests/tools.at
+++ b/tests/tools.at
@@ -390,6 +390,7 @@ AT_DATA([configure.ac],
[[AC_INIT
AC_CONFIG_MACRO_DIR([dir1])
AC_CONFIG_MACRO_DIR([dir2])
+AC_OUTPUT
]])
AT_CHECK_AUTOCONF([], [1], [], [stderr])
AT_CHECK([grep 'error: AC_CONFIG_MACRO_DIR can only be used once' stderr],
@@ -421,6 +422,7 @@ AT_DATA([configure.ac],
[[AC_INIT
AC_CONFIG_MACRO_DIRS([dir1])
AC_CONFIG_MACRO_DIRS([dir2])
+AC_OUTPUT
]])
AT_CHECK_AUTOCONF([], [0], [], [])
AT_CHECK_AUTOCONF([-t AC_CONFIG_MACRO_DIR], [0],
@@ -459,7 +461,9 @@ end-language: "Autoconf-without-aclocal-m4"
]])
AT_CHECK_AUTOCONF([], 1, [],
-[[configure.ac:2: error: possibly undefined macro: m4@&t@_foo
+[[trailer.m4: warning: AC_INIT was never used
+trailer.m4: warning: AC_OUTPUT was never used
+configure.ac:2: error: possibly undefined macro: m4@&t@_foo
If this token and others are legitimate, please use m4@&t@_pattern_allow.
See the Autoconf documentation.
configure.ac:3: error: possibly undefined macro: _m4@&t@_bar
@@ -467,8 +471,12 @@ configure.ac:4: error: possibly undefined macro: AS@&t@_FOO
configure.ac:5: error: possibly undefined macro: _AS@&t@_BAR
configure.ac:6: error: possibly undefined macro: d@&t@nl
]])
-# Second run should succeed and yield no output.
-AT_CHECK([autoconf])
+# A second run (without --force) should succeed and yield only the
+# warnings about AC_INIT and AC_OUTPUT.
+AT_CHECK_M4([autoconf], 0, [],
+[[trailer.m4: warning: AC_INIT was never used
+trailer.m4: warning: AC_OUTPUT was never used
+]])
AT_CLEANUP
@@ -500,7 +508,9 @@ It would be very bad if Autoconf forgot to expand [AS_]INIT!
]])
AT_CHECK_AUTOCONF([], 1, [],
-[[configure.ac:1: error: possibly undefined macro: AS@&t@_INIT
+[[trailer.m4: warning: AC_INIT was never used
+trailer.m4: warning: AC_OUTPUT was never used
+configure.ac:1: error: possibly undefined macro: AS@&t@_INIT
If this token and others are legitimate, please use m4@&t@_pattern_allow.
See the Autoconf documentation.
configure.ac:7: error: possibly undefined macro: AS@&t@_ALLOWED_NOT
@@ -539,7 +549,10 @@ m4_divert([])dnl
line that begins with a space
]])
-AT_CHECK_AUTOCONF
+AT_CHECK_AUTOCONF([], 0, [],
+[[trailer.m4: warning: AC_INIT was never used
+trailer.m4: warning: AC_OUTPUT was never used
+]])
AT_CLEANUP
@@ -1009,6 +1022,7 @@ AT_DATA([configure.ac],
[[AC_INIT
OLD(1, 2)
NEW([0, 0], [0])
+AC_OUTPUT
]])
# Checking `autoupdate'.
@@ -1053,6 +1067,7 @@ AT_SETUP([autoupdating AC_HELP_STRING])
AT_DATA([configure.ac],
[[AC_INIT
AC_ARG_ENABLE([foo], [AC_HELP_STRING([--enable-foo], [foo bar])], [:], [:])
+AC_OUTPUT
]])
# Checking `autoupdate'.
@@ -1189,6 +1204,7 @@ AC_LANG_SAVE
AC_LANG_RESTORE
AC_LANG_SAVE
AC_LANG_RESTORE
+AC_OUTPUT
]])
# Checking `autoupdate'.
@@ -1210,6 +1226,7 @@ AT_DATA([aclocal.m4],
AT_DATA([configure.ac],
[[AC_INIT
echo AC_FOREACH([myvar], [1 2 3], [' myvar'])OLD
+AC_OUTPUT
]])
# Checking `autoupdate'.
@@ -1318,6 +1335,7 @@ chmod a-w sub
AT_DATA([configure.ac],
[[AC_INIT
+AC_OUTPUT
]])
AT_DATA([.autom4te.cfg],