tests: can check our recipes avoid trailing backslashes
authorStefano Lattarini <stefano.lattarini@gmail.com>
Sun, 28 Oct 2012 13:02:46 +0000 (14:02 +0100)
committerStefano Lattarini <stefano.lattarini@gmail.com>
Wed, 31 Oct 2012 10:39:03 +0000 (11:39 +0100)
This is related to commit v1.11-1704-g254227b of 2012-05-01,
"parallel-tests: avoid trailing backslashes in make recipes",
and automake bug#10436.

Recipes with a trailing backslash character (possibly followed by
blank characters only) can cause spurious syntax errors with at
least older bash versions (e.g., bash 2.05b), and can be potentially
be unportable to other weaker shells.

So provide a target that runs the testsuite looking for this kind
of breakage (without requiring a real bugged shell).

* t/ax/shell-no-trail-bslash.in: New, a "shell" that chokes on '-c'
commands having a trailing '\' (possibly followed by whitespace only).
* Makefile (t/ax/shell-no-trail-bslash): Generate this script from it.
(noinst_SCRIPTS, CLEANFILES): Add it.
(EXTRA_DIST): Add 't/ax/shell-no-trail-bslash.in'.
(check-no-trailing-backslash-in-recipes): New target, runs the testsuite
with 'shell-no-trail-bslash' as the CONFIG_SHELL, to catch possible
recipes having a trailing backslash character (possibly followed by
* .gitignore: Update.
* t/self-check-shell-no-trail-bslash.sh: New testsuite self-check.
* t/parallel-tests-trailing-bslash.sh: Remove as obsolete.
* t/list-of-tests.mk: Adjust.

Signed-off-by: Stefano Lattarini <stefano.lattarini@gmail.com>
.gitignore
Makefile.am
t/ax/shell-no-trail-bslash.in [new file with mode: 0644]
t/list-of-tests.mk
t/parallel-tests-trailing-bslash.sh [deleted file]
t/self-check-shell-no-trail-bslash.sh [new file with mode: 0755]

index c3e83f9..3bcdc9d 100644 (file)
@@ -37,6 +37,7 @@
 /t/wrap/aclocal-1.*
 /t/wrap/automake-1.*
 /t/ax/test-defs.sh
+/t/ax/shell-no-trail-bslash
 /t/testsuite-part.am
 /t/*-w.tap
 /t/*-w.sh
index a48ab82..45bf2fc 100644 (file)
@@ -423,6 +423,19 @@ EXTRA_DIST += t/ax/test-defs.in
 CLEANFILES += t/ax/test-defs.sh
 nodist_noinst_DATA = t/ax/test-defs.sh
 
+noinst_SCRIPTS = # Will be updated soon.
+
+t/ax/shell-no-trail-bslash: t/ax/shell-no-trail-bslash.in Makefile
+       $(AM_V_at)rm -f $@ $@-t
+       $(AM_V_GEN)in=t/ax/shell-no-trail-bslash.in \
+         && $(MKDIR_P) t/ax \
+         && $(do_subst) <$(srcdir)/$$in >$@-t \
+         && chmod a+x $@-t
+       $(generated_file_finalize)
+EXTRA_DIST += t/ax/shell-no-trail-bslash.in
+CLEANFILES += t/ax/shell-no-trail-bslash
+noinst_SCRIPTS += t/ax/shell-no-trail-bslash
+
 runtest: runtest.in Makefile
        $(AM_V_at)rm -f $@ $@-t
        $(AM_V_GEN)in=runtest.in \
@@ -432,7 +445,7 @@ runtest: runtest.in Makefile
        $(generated_file_finalize)
 EXTRA_DIST += runtest.in
 CLEANFILES += runtest
-noinst_SCRIPTS = runtest
+noinst_SCRIPTS += runtest
 
 # If two test scripts have the same basename, they will end up sharing
 # the same log file, leading to all sort of undefined and undesired
@@ -484,6 +497,17 @@ check-tests-syntax:
 check-local: check-tests-syntax
 .PHONY: check-tests-syntax
 
+# Recipes with a trailing backslash character (possibly followed by
+# blank characters only) can cause spurious syntax errors with at
+# least older bash versions (e.g., bash 2.05b), and can be potentially
+# be unportable to other weaker shells.  Run the testsuite in a way
+# that helps catching such problems in Automake-generated recipes.
+# See automake bug#10436.
+check-no-trailing-backslash-in-recipes:
+       $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) check \
+         CONFIG_SHELL='$(abs_top_builddir)/t/ax/shell-no-trail-bslash'
+.PHONY: check-no-trailing-backslash-in-recipes
+
 ## Checking the list of tests.
 test_subdirs = t t/pm
 include $(srcdir)/t/CheckListOfTests.am
diff --git a/t/ax/shell-no-trail-bslash.in b/t/ax/shell-no-trail-bslash.in
new file mode 100644 (file)
index 0000000..3475398
--- /dev/null
@@ -0,0 +1,76 @@
+#! @AM_TEST_RUNNER_SHELL@
+# Copyright (C) 2012 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# A "shell" that chokes on '-c' commands having a trailing '\' character
+# (possibly followed by whitespace only).  This is to emulate problems
+# seen in older bash versions (e.g., bash 2.05b).
+# See also automake bug#10436.
+
+set -e
+set -u
+
+am_SHELL=${AM_TESTSUITE_SHELL-'@SHELL@'}
+
+tab='  '
+nl='
+'
+am_shell_flags=
+am_shell_command=; unset am_shell_command
+while test $# -gt 0; do
+  case $1 in
+    # If the shell is invoked by make e.g. as "sh -ec" (seen on
+    # GNU make in POSIX mode) or "sh -ce" (seen on Solaris make).
+    -*c*)
+        am_flg=$(printf '%s\n' "$1" | sed -e 's/^-//' -e 's/c//g')
+        if test x"$am_flg" != x; then
+          am_shell_flags="$am_shell_flags -$am_flg"
+        fi
+        am_shell_command=$2
+        shift;;
+    -?*)
+        am_shell_flags="$am_shell_flags $1";;
+      *)
+        break;;
+  esac
+  shift
+done
+
+if test x${am_shell_command+"set"} != x"set"; then
+  # Some make implementations, like *BSD's, pass the recipes to the shell
+  # through its standard input.  Trying to run our extra checks in this
+  # case would be too tricky, so we just skip them.
+  exec $am_SHELL $am_shell_flags ${1+"$@"}
+fi
+
+case $am_shell_command in
+  *" "|*"$tab"|*"$nl")
+    am_tweaked_shell_command=$(printf '%s\n' "$am_shell_command" \
+                                 | tr -d " $tab$nl");;
+  *)
+    am_tweaked_shell_command=$am_shell_command;;
+esac
+
+case $am_tweaked_shell_command in
+  *\\)
+    printf '%s\n' "$0: recipe ends with backslash character" >&2
+    printf '%s\n' "=== BEGIN recipe" >&2
+    printf '%s\n' "${am_shell_command-}" >&2
+    printf '%s\n' "=== END recipe" >&2
+    exit 1
+    ;;
+esac
+
+exec $am_SHELL $am_shell_flags -c "$am_shell_command" ${1+"$@"}
index e38e7ff..4d84940 100644 (file)
@@ -789,7 +789,6 @@ t/parallel-tests-no-spurious-summary.sh \
 t/parallel-tests-exit-statuses.sh \
 t/parallel-tests-console-output.sh \
 t/parallel-tests-once.sh \
-t/parallel-tests-trailing-bslash.sh \
 t/tests-environment.sh \
 t/am-tests-environment.sh \
 t/tests-environment-backcompat.sh \
@@ -958,6 +957,7 @@ t/self-check-is_newest.tap \
 t/self-check-me.tap \
 t/self-check-report.sh \
 t/self-check-seq.tap \
+t/self-check-shell-no-trail-bslash.sh \
 t/self-check-is-blocked-signal.tap \
 t/self-check-unindent.tap \
 t/sanity.sh \
diff --git a/t/parallel-tests-trailing-bslash.sh b/t/parallel-tests-trailing-bslash.sh
deleted file mode 100755 (executable)
index dadc874..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-#! /bin/sh
-# Copyright (C) 2012 Free Software Foundation, Inc.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-# Check that the new testsuite harness do not generate recipes that can
-# have a trailing '\', since that can cause spurious syntax errors with
-# older bash versions (e.g., bash 2.05b).
-# See automake bug#10436.
-
-. ./defs || exit 1
-
-echo AC_OUTPUT >> configure.ac
-
-cat > Makefile.am <<'END'
-TESTS = foo.test
-EXTRA_DIST = $(TESTS)
-am__backslash = \\ # foo
-.PHONY: bad-recipe
-bad-recipe:
-       @printf '%s\n' $(am__backslash)
-END
-
-cat > foo.test <<'END'
-#!/bin/sh
-exit 0
-END
-chmod +x foo.test
-
-am__SHELL=$SHELL; export am__SHELL
-am__PERL=$PERL; export am__PERL
-
-cat > my-shell <<'END'
-#!/bin/sh -e
-set -u
-tab='  '
-nl='
-'
-am__shell_flags=
-am__shell_command=; unset am__shell_command
-while test $# -gt 0; do
-  case $1 in
-    # If the shell is invoked by make e.g. as "sh -ec" (seen on
-    # GNU make in POSIX mode) or "sh -ce" (seen on Solaris make).
-    -*c*)
-        flg=`echo x"$1" | sed -e 's/^x-//' -e 's/c//g'`
-        if test x"$flg" != x; then
-          am__shell_flags="$am__shell_flags -$flg"
-        fi
-        am__shell_command=$2
-        shift
-        ;;
-    -?*)
-        am__shell_flags="$am__shell_flags $1"
-        ;;
-      *)
-        break
-        ;;
-  esac
-  shift
-done
-if test x${am__shell_command+"set"} != x"set"; then
-  # Some make implementations, like *BSD's, pass the recipes to the shell
-  # through its standard input.  Trying to run our extra checks in this
-  # case would be too tricky, so we just skip them.
-  exec $am__SHELL $am__shell_flags ${1+"$@"}
-else
-  am__tweaked_shell_command=`printf '%s\n' "$am__shell_command" \
-    | tr -d " $tab$nl"`
-  case ${am__tweaked_shell_command-} in
-    *\\)
-      echo "my-shell: recipe ends with backslash character" >&2
-      printf '%s\n' "=== BEGIN recipe" >&2
-      printf '%s\n' "${am__shell_command-}" >&2
-      printf '%s\n' "=== END recipe" >&2
-      exit 99
-      ;;
-  esac
-  exec $am__SHELL $am__shell_flags -c "$am__shell_command" ${1+"$@"}
-fi
-END
-chmod a+x my-shell
-
-cat my-shell
-
-CONFIG_SHELL=$(pwd)/my-shell; export CONFIG_SHELL
-
-$ACLOCAL
-$AUTOCONF
-$AUTOMAKE -a
-
-./configure CONFIG_SHELL="$CONFIG_SHELL"
-
-st=0
-$MAKE bad-recipe 2>stderr && st=1
-cat stderr >&2
-$FGREP "my-shell: recipe ends with backslash character" stderr || st=1
-test $st -eq 0 || skip_ "can't catch trailing backslashes in make recipes"
-
-$MAKE check
-
-:
diff --git a/t/self-check-shell-no-trail-bslash.sh b/t/self-check-shell-no-trail-bslash.sh
new file mode 100755 (executable)
index 0000000..b7f07f7
--- /dev/null
@@ -0,0 +1,46 @@
+#! /bin/sh
+# Copyright (C) 2012 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# Check that our fake "shell" used to guard against use of trailing
+# backslashes in recipes actually complains when those are used.
+
+# Our hack doesn't work with some make implementations (see comments
+# in 't/ax/shell-no-trail-bslash.in' for more details).
+required=GNUmake
+am_create_testdir=empty
+. test-init.sh
+
+cat >> Makefile <<'END'
+am__backslash = \\ # foo
+.PHONY: good bad
+good:
+       @printf '%s\n' OK
+.PHONY: bad
+bad:
+       @echo $(am__backslash)
+END
+
+SHELL=$am_testauxdir/shell-no-trail-bslash
+$SHELL -c 'exit 0'
+test "$($SHELL -c 'echo is  o\k')" = "is ok"
+
+$MAKE good
+
+$MAKE bad SHELL="$SHELL" 2>stderr || { cat stderr >&2; exit 1; }
+cat stderr >&2
+$FGREP "recipe ends with backslash character" stderr
+
+: