automake-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[FYI] {maint} tests: can check our recipes avoid trailing backslashes


From: Stefano Lattarini
Subject: [FYI] {maint} tests: can check our recipes avoid trailing backslashes
Date: Wed, 31 Oct 2012 11:15:14 +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 <address@hidden>
---
 .gitignore                            |   1 +
 Makefile.am                           |  26 +++++++-
 t/ax/shell-no-trail-bslash.in         |  76 +++++++++++++++++++++++
 t/list-of-tests.mk                    |   2 +-
 t/parallel-tests-trailing-bslash.sh   | 113 ----------------------------------
 t/self-check-shell-no-trail-bslash.sh |  47 ++++++++++++++
 6 files changed, 150 insertions(+), 115 deletions(-)
 create mode 100644 t/ax/shell-no-trail-bslash.in
 delete mode 100755 t/parallel-tests-trailing-bslash.sh
 create mode 100755 t/self-check-shell-no-trail-bslash.sh

diff --git a/.gitignore b/.gitignore
index c3e83f9..3bcdc9d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -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
diff --git a/Makefile.am b/Makefile.am
index a48ab82..45bf2fc 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -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 $@ address@hidden
+       $(AM_V_GEN)in=t/ax/shell-no-trail-bslash.in \
+         && $(MKDIR_P) t/ax \
+         && $(do_subst) <$(srcdir)/$$in >address@hidden \
+         && chmod a+x address@hidden
+       $(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 $@ address@hidden
        $(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
index 0000000..3475398
--- /dev/null
+++ b/t/ax/shell-no-trail-bslash.in
@@ -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+"$@"}
diff --git a/t/list-of-tests.mk b/t/list-of-tests.mk
index e38e7ff..4d84940 100644
--- a/t/list-of-tests.mk
+++ b/t/list-of-tests.mk
@@ -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
index dadc874..0000000
--- a/t/parallel-tests-trailing-bslash.sh
+++ /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
index 0000000..b4424f7
--- /dev/null
+++ b/t/self-check-shell-no-trail-bslash.sh
@@ -0,0 +1,47 @@
+#! /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
+
+st=0; $MAKE bad SHELL="$SHELL" 2>stderr || st=$?
+cat stderr >&2
+test $st -gt 0
+$FGREP "recipe ends with backslash character" stderr
+
+:
-- 
1.8.0




reply via email to

[Prev in Thread] Current Thread [Next in Thread]