From fec8a33d87bbe9f024a31a18642618716b7ad7c9 Mon Sep 17 00:00:00 2001 From: Zack Weinberg Date: Wed, 6 Jul 2022 16:11:43 -0400 Subject: [PATCH 2/2] Require GNU M4 1.4.8 or later. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The former minimum version was 1.4.6. 1.4.6 and 1.4.7 do not track the original location of text fed to ‘m4wrap’, which breaks autom4te’s ability to trace macros invoked from _AC_FINALIZE. Right now, the only _user_ visible effect of this is that autoconf running on M4 1.4.6 or 1.4.7 will emit an internal error, instead of the intended warning message, when it processes a configure.ac that neglects to invoke AC_INIT or AC_OUTPUT. Perhaps more importantly, it causes a bunch of scary-sounding failures in our own testsuite, which deliberately doesn’t use AC_OUTPUT sometimes. M4 1.4.6 and 1.4.7 also have bugs in location tracking of macro invocations spread over multiple lines, which, guess what, causes even more testsuite failures. 1.4.8 came out in 2006. As a practical matter, this change to our requirements means that people using macOS *to run autoconf* (not just to run generated configure scripts) cannot use the system-provided m4 anymore. {Free,Net,Open}BSD already don’t ship GNU M4 as their system m4, so users of those OSes should not be affected. --- NEWS | 14 ++++++++++++++ m4/m4.m4 | 14 +++++++++++--- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/NEWS b/NEWS index 4e41345d..91164390 100644 --- a/NEWS +++ b/NEWS @@ -7,6 +7,20 @@ GNU Autoconf NEWS - User visible changes. *** Autoconf now requires perl 5.8 (2002) or later. Generated 'configure' scripts continue to run without perl. +*** Autoconf now requires GNU M4 1.4.8 (2006) or later. + Generated 'configure' scripts continue to run without M4. + + Use of GNU M4 1.4.16 or later is recommended, as all earlier versions + are known to have had serious bugs in the text-processing builtins + on some, but not all, operating systems. Autoconf’s own configure + script will attempt to find a version of M4 that is not affected by + these bugs. + + Note: Autoconf 2.70 and 2.71 include code that malfunctions with + M4 1.4.6 or 1.4.7. However, the only effect of the malfunction is + that you will get a confusing error message if you run autoconf on + a configure.ac that neglects to use AC_INIT or AC_OUTPUT. + ** New features ** Obsolete features and new warnings diff --git a/m4/m4.m4 b/m4/m4.m4 index 0fedaca8..66e7341f 100644 --- a/m4/m4.m4 +++ b/m4/m4.m4 @@ -10,7 +10,7 @@ # AC_PROG_GNU_M4 # -------------- -# Check for GNU M4, at least 1.4.6 (all earlier versions had bugs in +# Check for GNU M4, at least 1.4.8 (all earlier versions had bugs in # trace support and regexp support): # https://lists.gnu.org/archive/html/bug-gnu-utils/2006-11/msg00096.html # https://lists.gnu.org/archive/html/bug-autoconf/2009-07/msg00023.html @@ -18,7 +18,7 @@ # is supported, and AC_SUBST M4_DEBUGFILE accordingly. # Also avoid versions of m4 that trigger strstr bugs. AC_DEFUN([AC_PROG_GNU_M4], - [AC_ARG_VAR([M4], [Location of GNU M4 1.4.6 or later. Defaults to the first + [AC_ARG_VAR([M4], [Location of GNU M4 1.4.8 or later. Defaults to the first program of 'm4', 'gm4', or 'gnum4' on PATH that meets Autoconf needs.]) AC_CACHE_CHECK([for GNU M4 that supports accurate traces], [ac_cv_path_M4], [rm -f conftest.m4f @@ -36,13 +36,21 @@ AC_PATH_PROGS_FEATURE_CHECK([M4], [m4 gm4 gnum4], ac_snippet=${ac_snippet}${as_nl}if'else(in''dex(dnl ;:11-:12-:12-:12-:12-:12-:12-:12-:12.:12.:12.:12.:12.:12.:12.:12.:12-,dnl :12-:12-:12-:12-:12-:12-:12-:12-),-1,,strstr-bug2)' + # Root out M4 1.4.6 and 1.4.7, which do not implement --debug=aflq + # correctly for macros invoked from m4wrap. + ac_snip2=change'quote(<,>)def''ine(,<>)d'nl + ac_snip2=${ac_snip2}${as_nl}def'ine(,)>)d'nl + ac_snip2=${ac_snip2}${as_nl}m4'wrap()d'nl test -z "`$ac_path_M4 -F conftest.m4f &1`" \ && test -z "`AS_ECHO([$ac_snippet]) | $ac_path_M4 --trace=mac 2>&1`" \ && test -f conftest.m4f \ + && test x"`AS_ECHO([$ac_snip2]) | \ + $ac_path_M4 --trace=T --debug=aflq 2>&1`" = \ + x'm4trace:stdin:3: -1- T()' \ && ac_cv_path_M4=$ac_path_M4 ac_path_M4_found=: rm -f conftest.m4f], [AC_MSG_ERROR([no acceptable m4 could be found in \$PATH. -GNU M4 1.4.6 or later is required; 1.4.16 or newer is recommended. +GNU M4 1.4.8 or later is required; 1.4.16 or newer is recommended. GNU M4 1.4.15 uses a buggy replacement strstr on some systems. Glibc 2.9 - 2.12 and GNU M4 1.4.11 - 1.4.15 have another strstr bug.])])]) M4=$ac_cv_path_M4 -- 2.36.1