Paul Smith ac2142e1a3 * tests/*: Quote backticked command paths
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.
2025-08-26 22:54:34 -04:00

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;