| # -*-perl-*- | |
| use warnings; | |
| my $description = "Test that make can execute binaries as well as scripts with" | |
| ." various shabangs and without a shbang"; | |
| my $details = "The various shells that this test uses are the default" | |
| ." /bin/sh, \$SHELL and the perl interpreter that is" | |
| ." executing this test program. The shells are used for the value" | |
| ." of SHELL inside the test makefile and also as a shbang in the" | |
| ." executed script. There is also a test which executes a script" | |
| ." that has no shbang."; | |
| # Only bother with this on UNIX systems | |
| $port_type eq 'UNIX' or return -1; | |
| $^O =~ /cygwin/ and return -1; | |
| my @shbangs = ('#!/bin/sh', "#!$perl_name"); | |
| # The exec in Valgrind's VM doesn't allow starting commands without any shbang | |
| $valgrind or push @shbangs, ''; | |
| my @shells = ('', 'SHELL=/bin/sh'); | |
| # Try whatever shell the user has, as long as it's not a C shell. | |
| # The C shell is not usable with make, due to not correctly handling | |
| # file descriptors and possibly other issues. | |
| my $usersh = $origENV{SHELL}; | |
| if ($usersh !~ /csh/) { | |
| push @shbangs, ("#!$usersh"); | |
| push @shells, ("SHELL=$usersh"); | |
| } | |
| my $answer = 'hello, world'; | |
| # tests [0-11] | |
| # Have a makefile with various SHELL= exec a shell program with varios | |
| # shbangs or without a shbang at all. | |
| my $stem = './exec.cmd'; | |
| my $k = 0; | |
| for my $shbang (@shbangs) { | |
| for my $shell (@shells) { | |
| my $cmd = $k ? "$stem.$k" : $stem; | |
| ++$k; | |
| unlink $cmd; | |
| open(CMD,"> $cmd"); | |
| print CMD "$shbang\n"; | |
| print CMD "printf \"$answer\\n\";\n"; | |
| close(CMD); | |
| chmod 0700, $cmd; | |
| run_make_test("# shbang=$shbang\n# shell=$shell" . q! | |
| all:; @$(CMD) | |
| !, "$shell CMD=$cmd", "$answer\n"); | |
| rmfiles($cmd); | |
| } | |
| } | |
| # tests [12-14] | |
| # Exec a binary from a makefile that has SHELL=. | |
| for my $shell (@shells) { | |
| run_make_test(q! | |
| all:; @#PERL# -e 'printf "$(ANSWER)\n"'; | |
| !, "$shell ANSWER='$answer'", "$answer\n"); | |
| } | |
| # test 15 | |
| # Use perl as a shell. | |
| run_make_test(q! | |
| SHELL = #PERL# | |
| .SHELLFLAGS = -e | |
| all:; @printf "$(ANSWER)\n"; | |
| !, "ANSWER='$answer'", "$answer\n"); | |
| 1; |