Imported Upstream version 4.3
[platform/upstream/make.git] / tests / scripts / features / se_implicit
1 #                                                                    -*-perl-*-
2 $description = "Test second expansion in implicit rules.";
3
4 $details = "";
5
6 use Cwd;
7
8 $dir = cwd;
9 $dir =~ s,.*/([^/]+)$,../$1,;
10
11
12 # Test #1: automatic variables.
13 #
14 run_make_test(q!
15 .SECONDEXPANSION:
16 .DEFAULT: ; @echo '$@'
17
18 foo.a: bar baz
19
20 foo.a: biz | buz
21
22 foo.%: 1.$$@ \
23        2.$$< \
24        $$(addprefix 3.,$$^) \
25        $$(addprefix 4.,$$+) \
26        5.$$| \
27        6.$$* ; @:
28
29 1.foo.a \
30 2.bar \
31 3.bar \
32 3.baz \
33 3.biz \
34 4.bar \
35 4.baz \
36 4.biz \
37 5.buz \
38 6.a: ; @echo '$@'
39
40 !,
41 '',
42 '1.foo.a
43 2.bar
44 3.bar
45 3.baz
46 3.biz
47 4.bar
48 4.baz
49 4.biz
50 5.buz
51 6.a
52 bar
53 baz
54 biz
55 buz
56 ');
57
58
59 # Test #2: target/pattern -specific variables.
60 #
61 run_make_test(q!
62 .SECONDEXPANSION:
63 foo.x:
64
65 foo.%: $$(%_a) $$(%_b) bar ; @:
66
67 foo.x: x_a := bar
68
69 %.x: x_b := baz
70
71 bar baz: ; @echo '$@'
72 !,
73               '', "bar\nbaz\n");
74
75
76 # Test #3: order of prerequisites.
77 #
78 run_make_test(q!
79 .SECONDEXPANSION:
80 .DEFAULT: ; @echo '$@'
81
82 all: foo bar baz
83
84
85 # Subtest #1
86 #
87 %oo: %oo.1; @:
88
89 foo: foo.2
90
91 foo: foo.3
92
93 foo.1: ; @echo '$@'
94
95
96 # Subtest #2
97 #
98 bar: bar.2
99
100 %ar: %ar.1; @:
101
102 bar: bar.3
103
104 bar.1: ; @echo '$@'
105
106
107 # Subtest #3
108 #
109 baz: baz.1
110
111 baz: baz.2
112
113 %az: ; @:
114 !,
115               '',
116 'foo.1
117 foo.2
118 foo.3
119 bar.1
120 bar.2
121 bar.3
122 baz.1
123 baz.2
124 ');
125
126
127 # Test #4: stem splitting logic.
128 #
129 run_make_test(q!
130 .SECONDEXPANSION:
131 $(dir)/tmp/bar.o:
132
133 $(dir)/tmp/foo/bar.c: ; @echo '$@'
134 $(dir)/tmp/bar/bar.c: ; @echo '$@'
135 foo.h: ; @echo '$@'
136
137 %.o: $$(addsuffix /%.c,foo bar) foo.h ; @echo '$@: {$<} $^'
138 !,
139               "dir=$dir", "$dir/tmp/foo/bar.c
140 $dir/tmp/bar/bar.c
141 foo.h
142 $dir/tmp/bar.o: {$dir/tmp/foo/bar.c} $dir/tmp/foo/bar.c $dir/tmp/bar/bar.c foo.h
143 ");
144
145
146 # Test #5: stem splitting logic and order-only prerequisites.
147 #
148 run_make_test(q!
149 .SECONDEXPANSION:
150 $(dir)/tmp/foo.o: $(dir)/tmp/foo.c
151 $(dir)/tmp/foo.c: ; @echo '$@'
152 bar.h: ; @echo '$@'
153
154 %.o: %.c|bar.h ; @echo '$@: {$<} {$|} $^'
155
156 !,
157               "dir=$dir", "$dir/tmp/foo.c
158 bar.h
159 $dir/tmp/foo.o: {$dir/tmp/foo.c} {bar.h} $dir/tmp/foo.c
160 ");
161
162
163 # Test #6: lack of implicit prerequisites.
164 #
165 run_make_test(q!
166 .SECONDEXPANSION:
167 foo.o: foo.c
168 foo.c: ; @echo '$@'
169
170 %.o: ; @echo '$@: {$<} $^'
171 !,
172               '', "foo.c\nfoo.o: {foo.c} foo.c\n");
173
174
175 # Test #7: Test stem from the middle of the name.
176 #
177 run_make_test(q!
178 .SECONDEXPANSION:
179 foobarbaz:
180
181 foo%baz: % $$*.1 ; @echo '$*'
182
183 bar bar.1: ; @echo '$@'
184 !,
185               '', "bar\nbar.1\nbar\n");
186
187
188 # Test #8: Make sure stem triple-expansion does not happen.
189 #
190 run_make_test(q!
191 .SECONDEXPANSION:
192 foo$$bar:
193
194 f%r: % $$*.1 ; @echo '$*'
195
196 oo$$ba oo$$ba.1: ; @echo '$@'
197 !,
198               '', 'oo$ba
199 oo$ba.1
200 oo$ba
201 ');
202
203 # Test #9: Check the value of $^
204 run_make_test(q!
205 .SECONDEXPANSION:
206
207 %.so: | $$(extra) ; @echo $^
208
209 foo.so: extra := foo.o
210 foo.so:
211 foo.o:
212 !,
213               '', "\n");
214
215 # Test #10: Test second expansion with second expansion prerequisites
216 # Ensures pattern_search() recurses with SE prereqs.
217 touch('a');
218 run_make_test(q!
219 .SECONDEXPANSION:
220 sim_base_rgg := just_a_name
221 sim_base_src := a
222 sim_base_f := a a a
223 sim_%.f: $${sim_$$*_f} ; echo $@
224 sim_%.src: $${sim_$$*_src} ; echo $@
225 sim_%: \
226         $$(if $$(sim_$$*_src),sim_%.src) \
227         $$(if $$(sim_$$*_f),sim_%.f) \
228         $$(if $$(sim_$$*_rgg),$$(sim_$$*_rgg).s) ; echo $@
229 !,
230               '-s sim_base', "#MAKE#: *** No rule to make target 'sim_base'.  Stop.", 512);
231
232 unlink('a');
233
234 # Ensure that order-only tokens embedded in second expansions are parsed
235 run_make_test(q!
236 .SECONDEXPANSION:
237 PREREQS=p1|p2
238 P2=p2
239 all : foo bar
240 f%o: $$(PREREQS) ; @echo '$@' from '$^' and '$|'
241 b%r: p1|$$(P2)   ; @echo '$@' from '$^' and '$|'
242 p% : ; : $@
243 !,
244               "", ": p1\n: p2\nfoo from p1 and p2\nbar from p1 and p2\n");
245
246 # SV 28456 : Don't reset $$< for default recipes
247 run_make_test(q!
248 .SECONDEXPANSION:
249
250 .PHONY: foo bar
251 foo: bar
252 foo: $$(info $$<)
253 %oo: ;
254 !,
255               '', "bar\n#MAKE#: Nothing to be done for 'foo'.\n");
256
257 # SV 54161: Expand $$* properly when it contains a path
258
259 run_make_test(q!
260 .SECONDEXPANSION:
261 %x: $$(info $$*); @echo '$*'
262 !,
263               'q/ux', "q/u\nq/u\n");
264
265 # This tells the test driver that the perl test script executed properly.
266 1;