summaryrefslogtreecommitdiff
path: root/tests/scripts/features/exec
blob: d96d31c15854b61f824c98feaff9f247ab1809d6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#                                                                    -*-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;