| # -*-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; |