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