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