make/tests/scripts/features/exec
Paul Smith e64674b718 [SV 57022] Avoid posix_spawn which fails asynchronously
Avoid using posix_spawn implementations that fail asynchronously when
the spawned program can't be invoked: this means instead of getting
an error such as "No such file or directory" we get just "Exit 127".

Original implementation of the configure.ac macro provided by
Martin Dorey <martin.dorey@hds.com>

Original implementation of the regression tests provided by
Dmitry Goncharov <dgoncharov@users.sf.net>

* configure.ac: Test whether posix_spawn fails asynchronously.  In a
cross-compilation environment, assume that it does not.  If we detect
that it does, fall back to fork/exec.
* tests/scripts/features/exec: Add regression tests for different
shebang invocation methods.
2019-12-27 01:37:17 -05:00

64 lines
1.8 KiB
Perl

# -*-perl-*-
use warnings;
my $description = "Test that make can execute binaries as well as scripts with"
." various shabangs and without a shebang";
my $details = "The various shells that this test uses are the default "
."/bin/sh, $origENV{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 shebang in the"
." executed script. There is also a test which executes a script"
." that has no shebang.";
# Only bother with this on UNIX systems
$port_type eq 'UNIX' or return -1;
my $usersh = $origENV{SHELL};
my $answer = 'hello, world';
my @shebangs = ('', '#!/bin/sh', "#!$usersh", "#!$perl_name");
my @shells = ('', 'SHELL=/bin/sh', "SHELL=$usersh");
# tests [0-11]
# Have a makefile with various SHELL= exec a shell program with varios
# shebangs or without a shebang at all.
my $stem = './exec.cmd';
my $k = 0;
for my $shebang (@shebangs) {
for my $shell (@shells) {
my $cmd = $k ? "$stem.$k" : $stem;
++$k;
unlink $cmd;
open(CMD,"> $cmd");
print CMD "$shebang\n";
print CMD "printf \"$answer\\n\";\n";
close(CMD);
chmod 0700, $cmd;
run_make_test(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;