1#! /bin/sh
2# Copyright (C) 2012-2021 Free Software Foundation, Inc.
3#
4# This program is free software; you can redistribute it and/or modify
5# it under the terms of the GNU General Public License as published by
6# the Free Software Foundation; either version 2, or (at your option)
7# any later version.
8#
9# This program is distributed in the hope that it will be useful,
10# but WITHOUT ANY WARRANTY; without even the implied warranty of
11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12# GNU General Public License for more details.
13#
14# You should have received a copy of the GNU General Public License
15# along with this program.  If not, see <https://www.gnu.org/licenses/>.
16
17# Check that our fake "shell" used to guard against use of trailing
18# backslashes in recipes actually complains when those are used.
19
20# Our hack doesn't work with some make implementations (see comments
21# in 't/ax/shell-no-trail-bslash.in' for more details).
22required=GNUmake
23am_create_testdir=empty
24. test-init.sh
25
26cat >> Makefile <<'END'
27am__backslash = \\ # foo
28.PHONY: good bad
29good:
30	@printf '%s\n' OK
31.PHONY: bad
32bad:
33	@echo $(am__backslash)
34END
35
36SHELL=$am_testaux_builddir/shell-no-trail-bslash
37
38$SHELL -c 'exit 0'
39test "$($SHELL -c 'echo is  o\k')" = "is ok"
40
41echo 'echo is  ok\"' > ok.sh
42$SHELL ./ok.sh
43test "$($SHELL ./ok.sh)" = "is ok\""
44
45tab='	'
46nl='
47'
48for sfx in \
49  '\' \
50  '\\' \
51  '\\\\\' \
52  '\ ' \
53  "\\$tab" \
54  "\\ $tab$tab   " \
55  "\\$nl" \
56  "\\ $nl " \
57  "\\$nl$nl$nl" \
58; do
59  for pfx in "" "echo bad" ": a${nl}# multine${nl}: text"; do
60    cmd=${pfx}${sfx}
61    printf '%s' "$cmd" > bad.sh
62    for args in '-c "$cmd"' './bad.sh'; do
63      eval "\$SHELL $args 2>stderr && { cat stderr >&2; exit 1; }; :"
64      cat stderr >&2
65      $FGREP "recipe/script ends with backslash character" stderr
66      cmd="$cmd" $PERL -w -e '
67        undef $/;
68        $_ = <>;
69        index($_, $ENV{cmd}) >= 0 or exit 1;
70      ' <stderr
71      $FGREP "$cmd" stderr
72    done
73  done
74done
75
76$MAKE good
77
78run_make -E -e FAIL bad SHELL="$SHELL"
79$FGREP "recipe/script ends with backslash character" stderr
80
81:
82