[PATCH 1/3] Look harder for a shell whose -n is known to work.

Zack Weinberg <[email protected]>
Newsgroups gmane.comp.sysutils.autoconf.patches
Message-ID <[email protected]>
The test suite was insisting on using /bin/sh -n for syntax checking,
which meant that if /bin/sh wasn’t one of the short list of shells
whose -n is known to work, we would skip all of the syntax-check
tests, even if some other shell was available that would work.

Instead do like _AS_DETECT_BETTER_SHELL, and loop over possible
shells, starting with $SHELL and going on to a hardwired list of
known-good possibilities.  The result is written to the substitution
variable @SHELL_N@ and the testsuite uses that.

(Should we invoke AC_PATH_PROG on the result of the search if it’s not
already absolute?)

	* configure.ac: Search for a shell whose -n mode is known to
        work, instead of just checking /bin/sh.  Set @SHELL_N@ to
        what we find.
        * tests/atlocal.in: Propagate @SHELL_N@ to testsuite.
        * tests/local.at (AT_CHECK_SHELL_SYNTAX): Use $SHELL_N instead
        of hardcoding /bin/sh.  Update test for usable shell -n.
        (AT_CHECK_AUTOCONF): Update test for usable shell -n.
        * tests/tools.at: Update test for usable shell -n.
---
 configure.ac     | 39 +++++++++++++++++++++++++--------------
 tests/atlocal.in |  2 +-
 tests/local.at   |  6 +++---
 tests/tools.at   |  2 +-
 4 files changed, 30 insertions(+), 19 deletions(-)

diff --git a/configure.ac b/configure.ac
index 8ff9f729..e9f0da92 100644
--- a/configure.ac
+++ b/configure.ac
@@ -35,9 +35,9 @@ AC_SUBST([RELEASE_YEAR])
 
 AB_INIT
 
-# We use '/bin/sh -n script' to check that there are no syntax errors
-# in the scripts.  Although incredible, there are /bin/sh that go into
-# endless loops with '-n', e.g., SunOS's:
+# We use 'sh -n script' to check that there are no syntax errors
+# in the scripts.  Although incredible, there are sh implementations
+# that go into endless loops with '-n', e.g., SunOS's:
 #
 #   $ uname -a
 #   SunOS ondine 4.1.3 2 sun4m unknown
@@ -52,27 +52,38 @@ AB_INIT
 #   $ time sh -nx endless.sh
 #   ^Csh -nx endless.sh  3,67s user 0,03s system 63% cpu 5,868 total
 #
-# Also, some implementations of /bin/sh (e.g., Solaris 8) are soooo slow
+# Also, some implementations (e.g., Solaris 8) are soooo slow
 # that they are unusable on large scripts like our testsuite.
+#
+# So we must identify a shell whose -n can safely be used.
 
-# So before using '/bin/sh -n' to check our scripts, we first check
-# that '/bin/sh -n' is known to not have these problems.
-
-AC_CACHE_CHECK([whether /bin/sh -n is known to work], [ac_cv_sh_n_works],
-[if (
+AC_CACHE_CHECK([for a shell whose -n mode is known to work],
+               [ac_cv_sh_working_n],
+[ac_cv_sh_working_n=none
+# Start by trying the shell that autoconf decided to use for this script,
+# follow with a hardwired list of shells that are known to work and can
+# be identified as such, starting with the ones with the fewest
+# syntactic extensions.  Unfortunately, several shells that are also
+# known to work can't be easily identified (e.g. BSD sh, dash).
+# Try ksh93, which is often buggy, and plain ksh and sh last.
+for cand_sh in "$SHELL" pdksh bash zsh ksh93 ksh sh
+do
+  if (
     unset BASH_VERSION ZSH_VERSION
-    /bin/sh -c '
+    "$cand_sh" -c '
       test ${BASH_VERSION+y} || # Bash
       test ${KSH_VERSION+y} || # pdksh
       test ${ZSH_VERSION+y} || # zsh
       test -n "${.sh.version}" # ksh93; put this last since its syntax is dodgy
     '
   ) 2>/dev/null
-then ac_cv_sh_n_works=yes
-else ac_cv_sh_n_works=no
-fi
+  then
+    ac_cv_sh_working_n="$cand_sh"
+    break
+  fi
+done
 ])
-AC_SUBST([ac_cv_sh_n_works])
+AC_SUBST([SHELL_N], [$ac_cv_sh_working_n])
 
 AC_MSG_CHECKING([for characters that cannot appear in file names])
 AC_CACHE_VAL([ac_cv_unsupported_fs_chars],
diff --git a/tests/atlocal.in b/tests/atlocal.in
index ec2a4167..079e35c6 100644
--- a/tests/atlocal.in
+++ b/tests/atlocal.in
@@ -24,7 +24,7 @@ EGREP='@EGREP@'
 SED='@SED@'
 
 # We need to know if sh -n is ok.
-ac_cv_sh_n_works='@ac_cv_sh_n_works@'
+SHELL_N='@SHELL_N@'
 
 # Check whether the underlying system can manage some unusual
 # symbols in file names.
diff --git a/tests/local.at b/tests/local.at
index 88a24e77..8496f55c 100644
--- a/tests/local.at
+++ b/tests/local.at
@@ -50,8 +50,8 @@ AT_CHECK([$at_diff "$1" "$2"])
 # otherwise, do nothing.  ksh93 -n also spits outs loads of warnings
 # about older constructs, but we don't care about the warnings.
 m4_define([AT_CHECK_SHELL_SYNTAX],
-[AT_SKIP_IF([test "$ac_cv_sh_n_works" != yes])
-AT_CHECK([/bin/sh -n $1], [], [], [ignore])])
+[AT_SKIP_IF([test "$SHELL_N" = none])
+AT_CHECK(["$SHELL_N" -n $1], [], [], [ignore])])
 
 m4_define([AT_CHECK_PERL_SYNTAX],
 [AT_CHECK([autom4te_perllibdir=$abs_top_srcdir/lib $PERL -c "$abs_top_builddir"/bin/$1],
@@ -216,7 +216,7 @@ cp "$abs_top_srcdir/tests/statesave.m4" aclocal.m4
 # were running too fast.
 m4_define([AT_CHECK_AUTOCONF],
 [AT_CHECK_M4([autoconf --force $1], [$2], [$3], [$4])
-if test -s configure && test "$ac_cv_sh_n_works" = yes; then
+if test -s configure && test "$SHELL_N" != none; then
   AT_CHECK_SHELL_SYNTAX([configure])
 fi
 ])
diff --git a/tests/tools.at b/tests/tools.at
index b95bdcf5..9d3c7183 100644
--- a/tests/tools.at
+++ b/tests/tools.at
@@ -45,7 +45,7 @@ AT_BANNER([Executables (autoheader, autoupdate...).])
 
 AT_SETUP([Syntax of the shell scripts])
 
-AT_CHECK([test "$ac_cv_sh_n_works" = yes || exit 77])
+AT_CHECK([test "$SHELL_N" != none || exit 77])
 
 # Specify the absolute name of the tool, as some shells don't honor PATH when
 # running `sh PROG'.
-- 
2.26.0.rc2
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.