On 2025-04-18 10:32, Zack Weinberg wrote:
this hypothetical 'shawk' would be
a *harder* task than converting all the existing unconditional uses of
awk to use sed instead.
In 2007 we starting using awk in config.status because sed didn't always
handle backslash-newline correctly, and because our sed approach ran
into POSIX length limits that our awk approach doesn't have. I also
vaguely recall awk ran faster. So I'd be cautious about switching back
to sed.
It's been mentioned a couple of times that 'configure' should diagnose
and fail if awk is missing rather than bulldozing ahead with nonsense,
so I installed the first attached patch to try to do that. The check is
actually in config.status, which 'configure' calls but which can be
called separately.
Also, I saw that a minimal 'configure' uses grep only for "grep -c ^",
so I installed the second attached patch to use "sed -n '$='" instead,
since sed is used lots of other places in the script. I think most
'configure' scripts use grep for other stuff anyway, so this second
minor tweak is not that much of a change in practice.From b73f28c5196de7f79d62f793cfc247d2d6910393 Mon Sep 17 00:00:00 2001
From: Paul Eggert <egg...@cs.ucla.edu>
Date: Fri, 18 Apr 2025 13:32:03 -0700
Subject: [PATCH 1/2] config.status now checks for missing awk
* lib/autoconf/status.m4 (_AC_OUTPUT_CONFIG_STATUS):
Diagnose missing awk and fail, rather than blundering on.
---
NEWS | 3 +++
lib/autoconf/status.m4 | 8 +++++++-
2 files changed, 10 insertions(+), 1 deletion(-)
diff --git a/NEWS b/NEWS
index 0b57386c..0899de5f 100644
--- a/NEWS
+++ b/NEWS
@@ -43,6 +43,9 @@ GNU Autoconf NEWS - User visible changes.
*** Autoconf no longer generates ${1+"$@"} in scripts, working around
a bug in AIX 7.2 ksh93.
+*** config.status now fails with a diagnostic if awk is missing,
+ rather than misbehaving.
+
* Noteworthy changes in release 2.72 (2023-12-22) [release]
** Backward incompatibilities
diff --git a/lib/autoconf/status.m4 b/lib/autoconf/status.m4
index 4fd8f39b..8bbf4b38 100644
--- a/lib/autoconf/status.m4
+++ b/lib/autoconf/status.m4
@@ -1470,7 +1470,13 @@ AC_PROVIDE_IFELSE([AC_PROG_MKDIR_P],
AC_PROVIDE_IFELSE([AC_PROG_AWK],
[AWK='$AWK'
])dnl
-test -n "\$AWK" || AWK=awk
+test -n "\$AWK" || {
+ awk '' </dev/null ||
+ AS_ESCAPE(
+ m4_dquote(m4_expand([AC_MSG_ERROR([try installing gawk])])),
+ [\$`])
+ AWK=awk
+}
_ACEOF
cat >>"$CONFIG_STATUS" <<\_ACEOF || ac_write_fail=1
--
2.48.1
From 3d79cd9ff455d85e788398bfe4fdc4544fabceb5 Mon Sep 17 00:00:00 2001
From: Paul Eggert <egg...@cs.ucla.edu>
Date: Fri, 18 Apr 2025 14:01:38 -0700
Subject: [PATCH 2/2] Avoid grep in minimal configure
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* lib/autoconf/status.m4 (_AC_OUTPUT_FILES_PREPARE):
Use ‘sed -n '$='’ instead of ‘grep -c’, since these
are the only uses of grep in a minimal ‘configure’
and we are already using sed elsewhere.
---
doc/install.texi | 12 ++++++------
lib/autoconf/status.m4 | 5 ++---
2 files changed, 8 insertions(+), 9 deletions(-)
diff --git a/doc/install.texi b/doc/install.texi
index f9e5e7fa..98eebe3d 100644
--- a/doc/install.texi
+++ b/doc/install.texi
@@ -138,15 +138,15 @@ you can type @samp{make uninstall} to remove the installed files.
Installation requires a POSIX-like environment
with a shell and at least the following standard utilities:
-@example
-awk cat cp diff echo expr false
-grep ls mkdir mv printf pwd
-rm rmdir sed sort test tr
-@end example
+@quotation
+@t{awk cat cp diff echo expr false
+ls mkdir mv printf pwd
+rm rmdir sed sort test tr}
+@end quotation
@noindent
This package's installation may need other standard utilities such as
-@command{cmp}, @command{make}, @command{sleep} and @command{touch},
+@command{grep}, @command{make}, @command{sleep} and @command{touch},
along with compilers like @command{gcc}.
@node Compilers and Options
diff --git a/lib/autoconf/status.m4 b/lib/autoconf/status.m4
index 8bbf4b38..0ac451dc 100644
--- a/lib/autoconf/status.m4
+++ b/lib/autoconf/status.m4
@@ -403,14 +403,13 @@ rm -f conf$$files.sh
echo "_ACEOF"
} >conf$$subs.sh ||
AC_MSG_ERROR([could not make $CONFIG_STATUS])
-ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim_num=`echo "$ac_subst_vars" | sed -n '$='`
ac_delim='%!_!# '
for ac_last_try in false false false false false :; do
. ./conf$$subs.sh ||
AC_MSG_ERROR([could not make $CONFIG_STATUS])
-dnl Do not use grep on conf$$subs.awk, since AIX grep has a line length limit.
- ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+ ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | sed -n '$='`
if test $ac_delim_n = $ac_delim_num; then
break
elif $ac_last_try; then
--
2.48.1