summaryrefslogtreecommitdiff
path: root/tests/scripts/options/dash-f
blob: b241606449751e7fa87f1e647a2104a9ed5697e7 (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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
#                                                                    -*-perl-*-
$description = "The following test tests that if you specify greater \n"
              ."than one '-f makefilename' on the command line, \n"
              ."that make concatenates them.  This test creates three \n"
              ."makefiles and specifies all of them with the -f option \n"
              ."on the command line.  To make sure they were concatenated, \n"
              ."we then call make with the rules from the concatenated \n"
              ."makefiles one at a time.  Finally, it calls all three \n"
              ."rules in one call to make and checks that the output\n"
              ."is in the correct order.";

$makefile2 = &get_tmpfile;
$makefile3 = &get_tmpfile;

open(MAKEFILE,"> $makefile");

# The Contents of the MAKEFILE ...

print MAKEFILE "all: \n";
print MAKEFILE "\t\@echo This is the output from the original makefile\n";

# END of Contents of MAKEFILE

close(MAKEFILE);

# Create a second makefile
open(MAKEFILE,"> $makefile2");
print MAKEFILE "TWO: \n";
print MAKEFILE "\t\@echo This is the output from makefile 2\n";
close(MAKEFILE);

# Create a third makefile
open(MAKEFILE,"> $makefile3");
print MAKEFILE "THREE: \n";
print MAKEFILE "\t\@echo This is the output from makefile 3\n";
close(MAKEFILE);


# Create the answer to what should be produced by this Makefile
$answer = "This is the output from the original makefile\n";

# Run make to catch the default rule
&run_make_with_options($makefile,"-f $makefile2 -f $makefile3",&get_logfile,0);

&compare_output($answer,&get_logfile(1));


# Run Make again with the rule from the second makefile: TWO
$answer = "This is the output from makefile 2\n";

&run_make_with_options($makefile,"-f $makefile2 -f $makefile3 TWO",&get_logfile,0);

&compare_output($answer,&get_logfile(1));


# Run Make again with the rule from the third makefile: THREE

$answer = "This is the output from makefile 3\n";
&run_make_with_options($makefile,
                       "-f $makefile2 -f $makefile3 THREE",
                       &get_logfile,
                       0);
&compare_output($answer,&get_logfile(1));


# Run Make again with ALL three rules in the order 2 1 3 to make sure
# that all rules are executed in the proper order

$answer = "This is the output from makefile 2\n";
$answer .= "This is the output from the original makefile\n";
$answer .= "This is the output from makefile 3\n";
&run_make_with_options($makefile,
                       "-f $makefile2 -f $makefile3 TWO all THREE",
                       &get_logfile,
                       0);
&compare_output($answer,&get_logfile(1));


# sv 62118.
# Validate all sorts of -f etc. options

my $hello = 'hello.mk';
my $bye = 'bye.mk';
my $byesrc = 'bye.mk.src';

create_file($hello, 'all:; $(info hello, world)
');

create_file($bye, 'def:; $(info bye, world)
bye.mk: bye.mk.src; touch $@
bye.mk.src:; touch $@
');

# These invocations use the empty filename string so that the test framework
# doesn't add any -f options on its own.

# Incorrect order of options. -R follows -f.
# Invocation of make is equivalent to
#   echo 'all:; $(info hello, world)' | make -f bye.mk -fR - all
# There is bye.mk, but there is no 'R'.
# make runs the recipes from bye.mk and prints the error about missing 'R'.

# Ensure the newly created bye.src.mk is newer than bye.mk.
&utouch(-600, $bye);
run_make_test('', "-f$bye -fR - all", "#MAKE#: R: No such file or directory
touch bye.mk.src
touch bye.mk
#MAKE#: *** No rule to make target 'R'.  Stop.
", 512);

my @opts;
my $answer;

# Test double -f-.
@opts = ('-f- -f-', '-f - -f -', '-f- -f -', '-f - -f-',
         '-f- --file=-', '-f- --file -', '-f - --file=-', '-f - --file -',
         '-f- --makefile=-', '-f- --makefile -',
         '-f - --makefile=-', '-f - --makefile -',
         '--file=- --makefile=-', '--file=- --makefile -',
         '--file - --makefile=-', '--file - --makefile -');

for my $opt (@opts) {
    # We shouldn't need this; if the options are wrong then make shouldn't try
    # to read from stdin.
    close(STDIN);
    open(STDIN, "<", $hello) || die "$0: cannot open $hello for reading: $!";
    run_make_test('', "-f$bye $opt", "#MAKE#: *** Makefile from standard input specified twice.  Stop.\n", 512);
}

# -f is not followed by filename.
@opts = ('-f', '--file', '--makefile');
$answer = "/requires an argument/";
for my $opt (@opts) {
    run_make_test('', $opt, $answer, 512);
}

# Test that make correctly parses all possible syntaxes to pipe make code to
# the standard input.

$answer = "touch bye.mk.src
touch bye.mk
hello, world
#MAKE#: 'all' is up to date.\n";

@opts = ('-f- all', '-f - all', '-Rf- all', '-Rf - all',
         '--file=- all', '--file - all',
         '--makefile=- all', '--makefile - all');
for my $opt (@opts) {
    unlink($byesrc);
    close(STDIN);
    open(STDIN, "<", $hello) || die "$0: cannot open $hello for reading: $!";
    # Ensure the newly created bye.src.mk is newer than bye.mk.
    &utouch(-600, $bye);

    run_make_test('', "-f$bye $opt", $answer);
}


# This close MUST come at the end of the test!!
close(STDIN);
unlink($hello, $bye, $byesrc);

# This tells the test driver that the perl test script executed properly.
1;