mirror of
https://https.git.savannah.gnu.org/git/make.git
synced 2026-01-28 10:24:36 +00:00
When using Perl's backticks make sure that the path to the command invoked is quoted. On Windows, in particular, paths to commands such as diff, etc. may contain whitespace.
108 lines
2.5 KiB
Perl
108 lines
2.5 KiB
Perl
# -*-perl-*-
|
|
|
|
$description = "Test proper handling of SHELL.";
|
|
|
|
# If we don't have a POSIX shell available, never mind
|
|
$is_posix_sh or return -1;
|
|
|
|
# On Windows, shell names might not match
|
|
if ($port_type eq 'W32') {
|
|
return -1;
|
|
}
|
|
|
|
$mshell = $sh_name;
|
|
|
|
# According to POSIX, the value of SHELL in the environment has no impact on
|
|
# the value in the makefile.
|
|
|
|
$ENV{SHELL} = '/dev/null';
|
|
run_make_test('all:;@echo "$(SHELL)"', '', $mshell);
|
|
|
|
# According to POSIX, any value of SHELL set in the makefile should not be
|
|
# exported to the subshell. A more portable option might be to set SHELL to
|
|
# be $^X (perl) in the makefile, and set .SHELLFLAGS to -e.
|
|
|
|
$ENV{SHELL} = $mshell;
|
|
|
|
my $altshell = "/./$mshell";
|
|
my $altshell2 = "/././$mshell";
|
|
|
|
if ($mshell =~ m,^([a-zA-Z]:)([\\/])(.*),) {
|
|
$altshell = "$1$2.$2$3";
|
|
$altshell2 = "$1$2.$2.$2$3";
|
|
}
|
|
|
|
run_make_test("SHELL := $altshell\n".'
|
|
all:;@echo "$(SHELL) $$SHELL"
|
|
', '', "$altshell $mshell");
|
|
|
|
# As a GNU Make extension, if make's SHELL variable is explicitly exported,
|
|
# then we really _DO_ export it.
|
|
|
|
$ENV{SHELL} = $mshell;
|
|
|
|
run_make_test("export SHELL := $altshell\n".'
|
|
all:;@echo "$(SHELL) $$SHELL"
|
|
', '', "$altshell $altshell");
|
|
|
|
|
|
# Test out setting of SHELL, both exported and not, as a target-specific
|
|
# variable.
|
|
|
|
$ENV{SHELL} = $mshell;
|
|
|
|
run_make_test("all: SHELL := $altshell\n".'
|
|
all:;@echo "$(SHELL) $$SHELL"
|
|
', '', "$altshell $mshell");
|
|
|
|
$ENV{SHELL} = $mshell;
|
|
|
|
run_make_test("
|
|
SHELL := $altshell2
|
|
one: two
|
|
two: export SHELL := $altshell\n".'
|
|
one two:;@echo "$@: $(SHELL) $$SHELL"
|
|
', '', "two: $altshell $altshell\none: $altshell2 $mshell\n");
|
|
|
|
# Test .SHELLFLAGS
|
|
|
|
# We don't know the output here: on some systems, for example, every line
|
|
# printed by the shell in -x mode has a trailing space!
|
|
my $script = 'true; true';
|
|
my $flags = '-xc';
|
|
my $out = `"$sh_name" $flags '$script' 2>&1`;
|
|
|
|
run_make_test(qq!
|
|
.SHELLFLAGS = $flags
|
|
all: ; \@$script
|
|
!,
|
|
'', $out);
|
|
|
|
# Do it again but add spaces to SHELLFLAGS
|
|
|
|
# Some shells (*shakes fist at Solaris*) cannot handle multiple flags in
|
|
# separate arguments.
|
|
my $t = `"$sh_name" -e -c true 2>/dev/null`;
|
|
my $multi_ok = $? == 0;
|
|
|
|
if ($multi_ok) {
|
|
$flags = '-x -c';
|
|
run_make_test(qq!
|
|
.SHELLFLAGS = $flags
|
|
all: ; \@$script
|
|
!,
|
|
'', $out);
|
|
}
|
|
|
|
$script = subst_make_string('true; #HELPER# -q fail 1; true');
|
|
$flags = '-xec';
|
|
$out = `"$sh_name" $flags '$script' 2>&1`;
|
|
|
|
run_make_test(qq!
|
|
.SHELLFLAGS = $flags
|
|
all: ; \@$script
|
|
!,
|
|
'', "${out}#MAKE#: *** [#MAKEFILE#:3: all] Error 1", 512);
|
|
|
|
1;
|