Imported Upstream version 4.4
[platform/upstream/make.git] / tests / scripts / features / targetvars
1 #                                                                    -*-perl-*-
2 $description = "Test target-specific variable settings.";
3
4 $details = "\
5 Create a makefile containing various flavors of target-specific variable
6 values, override and non-override, and using various variable expansion
7 rules, semicolon interference, etc.";
8
9 run_make_test('
10 export FOO = foo
11 export BAR = bar
12 one: override FOO = one
13 one two: ; @echo $(FOO) $(BAR)
14 two: BAR = two
15 .RECIPEPREFIX = >
16 three: ; BAR=1000
17 > @echo $(FOO) $(BAR)
18 # Some things that shouldn not be target vars
19 funk : override
20 funk : override adelic
21 adelic override : ; echo $@
22 # Test per-target recursive variables
23 four:FOO=x
24 four:VAR$(FOO)=ok
25 four: ; @echo "$(FOO) $(VAR$(FOO)) $(VAR) $(VARx)"
26 five:FOO=x
27 five six : VAR$(FOO)=good
28 five six: ;@echo "$(FOO) $(VAR$(FOO)) $(VAR) $(VARx) $(VARfoo)"
29 # Test per-target variable inheritance
30 seven: eight
31 seven eight: ; @echo $@: $(FOO) $(BAR)
32 seven: BAR = seven
33 seven: FOO = seven
34 eight: BAR = eight
35 # Test the export keyword with per-target variables
36 nine: ; @echo $(FOO) $(BAR) $$FOO $$BAR
37 nine: FOO = wallace
38 nine-a: export BAZ = baz
39 nine-a: ; @echo $$BAZ
40 # Test = escaping
41 EQ = =
42 ten: one$(EQ)two
43 ten: one $(EQ) two
44 ten one$(EQ)two $(EQ):;@echo $@
45 .PHONY: one two three four five six seven eight nine ten $(EQ) one$(EQ)two
46 # Test target-specific vars with pattern/suffix rules
47 QVAR = qvar
48 RVAR = =
49 %.q : ; @echo $(QVAR) $(RVAR)
50 foo.q : RVAR += rvar
51 # Target-specific vars with multiple LHS pattern rules
52 %.r %.s %.t: ; @echo $(QVAR) $(RVAR) $(SVAR) $(TVAR)
53 foo.r : RVAR += rvar
54 foo.t : TVAR := $(QVAR)
55 ',
56                  "one two three", "one bar\nfoo two\nBAR=1000\nfoo bar\n");
57
58 # TEST #2
59
60 run_make_test(undef, "one two FOO=1 BAR=2", "one 2\n1 2\n");
61
62 # TEST #3
63
64 run_make_test(undef, "four", "x ok  ok\n");
65
66 # TEST #4
67
68 run_make_test(undef, "seven", "eight: seven eight\nseven: seven seven\n");
69
70 # TEST #5
71
72 run_make_test(undef, "nine", "wallace bar wallace bar\n");
73
74 # TEST #5-a
75
76 run_make_test(undef, "nine-a", "baz\n");
77
78 # TEST #6
79
80 run_make_test(undef, "ten", "one=two\none bar\n=\nfoo two\nten\n");
81
82 # TEST #6
83
84 run_make_test(undef, "foo.q bar.q", "qvar = rvar\nqvar =\n");
85
86 # TEST #7
87
88 run_make_test(undef, "foo.t bar.s", "qvar = qvar\nqvar =\n");
89
90 # TEST #8
91 # For PR/1378: Target-specific vars don't inherit correctly
92
93 run_make_test('
94 foo: FOO = foo
95 bar: BAR = bar
96 foo: bar
97 bar: baz
98 baz: ; @echo $(FOO) $(BAR)
99 ', "", "foo bar\n");
100
101 # TEST #9
102 # For PR/1380: Using += assignment in target-specific variables sometimes fails
103 # Also PR/1831
104
105 run_make_test('
106 .PHONY: all one
107 all: FOO += baz
108 all: one; @echo $(FOO)
109
110 FOO = bar
111
112 one: FOO += biz
113 one: FOO += boz
114 one: ; @echo $(FOO)
115 ',
116               '', "bar baz biz boz\nbar baz\n");
117
118 # Test #10
119
120 run_make_test(undef, 'one', "bar biz boz\n");
121
122 # Test #11
123 # PR/1709: Test semicolons in target-specific variable values
124
125 run_make_test('
126 foo : FOO = ; ok
127 foo : ; @echo "$(FOO)"
128 ',
129               '', "; ok\n");
130
131 # Test #12
132 # PR/2020: More hassles with += target-specific vars.  I _really_ think
133 # I nailed it this time :-/.
134
135 run_make_test('
136 .PHONY: a
137
138 BLAH := foo
139 COMMAND = echo $(BLAH)
140
141 a: ; @$(COMMAND)
142
143 a: BLAH := bar
144 a: COMMAND += snafu $(BLAH)
145 ',
146               '', "bar snafu bar\n");
147
148 # Test #13
149 # Test double-colon rules with target-specific variable values
150
151 run_make_test('
152 W = bad
153 X = bad
154 foo: W = ok
155 foo:: ; @echo $(W) $(X) $(Y) $(Z)
156 foo:: ; @echo $(W) $(X) $(Y) $(Z)
157 foo: X = ok
158
159 Y = foo
160 bar: foo
161 bar: Y = bar
162
163 Z = nopat
164 ifdef PATTERN
165   fo% : Z = pat
166 endif
167 ',
168              'foo', "ok ok foo nopat\nok ok foo nopat\n");
169
170 # Test #14
171 # Test double-colon rules with target-specific variable values and
172 # inheritance
173
174 run_make_test(undef, 'bar', "ok ok bar nopat\nok ok bar nopat\n");
175
176 # Test #15
177 # Test double-colon rules with pattern-specific variable values
178
179 run_make_test(undef, 'foo PATTERN=yes', "ok ok foo pat\nok ok foo pat\n");
180
181 # Test #16
182 # Test target-specific variables with very long command line
183 # (> make default buffer length)
184
185 run_make_test('
186 base_metals_fmd_reports.sun5 base_metals_fmd_reports CreateRealPositions        CreateMarginFunds deals_changed_since : BUILD_OBJ=$(shell if test -f               "build_information.generate"   ; then echo "$(OBJ_DIR)/build_information.o"; else echo "no build information"; fi  )
187
188 deals_changed_since: ; @echo $(BUILD_OBJ)
189 ',
190               '', "no build information\n");
191
192 # TEST #17
193
194 # Test a merge of set_lists for files, where one list is much longer
195 # than the other.  See Savannah bug #15757.
196
197 mkdir('t1', 0777);
198 touch('t1/rules.mk');
199
200 run_make_test('
201 VPATH = t1
202 include rules.mk
203 .PHONY: all
204 all: foo.x
205 foo.x : rules.mk ; @echo MYVAR=$(MYVAR) FOOVAR=$(FOOVAR) ALLVAR=$(ALLVAR)
206 all: ALLVAR = xxx
207 foo.x: FOOVAR = bar
208 rules.mk : MYVAR = foo
209 .INTERMEDIATE: foo.x rules.mk
210 ',
211               '-I t1', 'MYVAR= FOOVAR=bar ALLVAR=xxx');
212
213 rmfiles('t1/rules.mk');
214 rmdir('t1');
215
216 # TEST #18
217
218 # Test appending to a simple variable containing a "$": avoid a
219 # double-expansion.  See Savannah bug #15913.
220
221 run_make_test('
222 VAR := $$FOO
223 foo: VAR += BAR
224 foo: ; @echo '."'".'$(VAR)'."'".'
225 ',
226               '', '$FOO BAR');
227
228 # TEST #19: Override with append variables
229
230 run_make_test('
231 a: override FOO += f1
232 a: FOO += f2
233 a: ; @echo "$(FOO)"
234 ',
235               '', "f1\n");
236
237 run_make_test(undef, 'FOO=C', "C f1\n");
238
239 # TEST #19: Conditional variables with command-line settings
240
241 run_make_test('
242 a: FOO ?= f1
243 a: ; @echo "$(FOO)"
244 ',
245               '', "f1\n");
246
247 run_make_test(undef, 'FOO=C', "C\n");
248
249 # TEST #20: Check for continuation after semicolons
250
251 run_make_test(q!
252 a: A = 'hello;\
253 world'
254 a: ; @echo $(A)
255 !,
256               '', "hello; world\n");
257
258 # TEST #21: SV-56834 Ensure setting PATH in a target var works properly
259 my $sname = "foobar$scriptsuffix";
260
261 mkdir('sd', 0775);
262 create_file("sd/$sname", "exit 0\n");
263 chmod 0755, "sd/$sname";
264
265 run_make_test(qq!
266 all: PATH := sd
267 all: ; $sname >/dev/null
268 !,
269               '', "$sname >/dev/null\n");
270
271 # Don't use the general PATH if not found on the target path
272
273 $ENV{PATH} = "$ENV{PATH}:sd";
274
275 my ($ernum, $erstr);
276 if ($port_type eq 'W32') {
277     $ernum = 1;
278     $erstr = "'$sname' is not recognized as an internal or external command,\noperable program or batch file.";
279 } else {
280     $ernum = 127;
281     $erstr = "#MAKE#: $sname: $ERR_no_such_file";
282 }
283
284 run_make_test(qq!
285 all: PATH := ..
286 all: ; $sname
287 !,
288               '', "$sname\n$erstr\n#MAKE#: *** [#MAKEFILE#:3: all] Error $ernum", 512);
289
290 unlink("sd/$sname");
291 rmdir ('sd');
292
293 # SV 59230: Conditional (non-)assignment of target-specific variables should
294 # preserve export settings.
295
296 $ENV{hello} = 'moon';
297 run_make_test(q!
298 all:; @echo hello=$$hello
299 dummy: hello?=world
300 !,
301               '', 'hello=moon');
302
303 # SV 59230: Assignment of a global variable should not affect export of a
304 # target specific variable.
305
306 $ENV{hello} = "moon";
307 run_make_test(q!
308 all:; @echo hello=$$hello
309 hello=sun
310 dummy: hello?=world
311 !,
312               '', 'hello=sun');
313
314 # Support target-specific unexport
315
316 $ENV{hello} = "moon";
317 run_make_test(q!
318 unexport hello=sun
319 all: base exp
320 base exp: ; @echo hello=$$hello
321 exp: export hello=world
322 !,
323               '', "hello=\nhello=world\n");
324
325 $ENV{hello} = "moon";
326 run_make_test(q!
327 hello=sun
328 all: base exp
329 base exp: ; @echo hello=$$hello
330 exp: unexport hello=world
331 !,
332               '', "hello=sun\nhello=\n");
333
334 run_make_test(q!
335 all:; @echo hello=$$hello
336 unexport hello=sun
337 dummy: hello?=world
338 !,
339               '', 'hello=');
340
341 $ENV{hello} = "moon";
342 run_make_test(q!
343 all:; @echo hello=$$hello
344 hello=sun
345 dummy: unexport hello=world
346 !,
347               '', 'hello=sun');
348
349 run_make_test(q!
350 all: mid
351 mid: base
352
353 ifeq ($(midexport),export)
354 mid: export hello=mid
355 else ifeq ($(midexport),unexport)
356 mid: unexport hello=mid
357 else
358 mid: hello=mid
359 endif
360
361 ifeq ($(baseexport),export)
362 base: export hello=base
363 else ifeq ($(baseexport),unexport)
364 base: unexport hello=base
365 else
366 base: hello=base
367 endif
368
369 all mid base:; @echo $@ make=$(hello) shell=$$hello
370 !,
371               '', "base make=base shell=\nmid make=mid shell=\nall make= shell=\n");
372
373 # Test base settings with env var
374 $ENV{hello} = "environ";
375 run_make_test(undef,
376               '', "base make=base shell=base\nmid make=mid shell=mid\nall make=environ shell=environ\n");
377
378 $ENV{hello} = "environ";
379 run_make_test(undef,
380               'baseexport=export', "base make=base shell=base\nmid make=mid shell=mid\nall make=environ shell=environ\n");
381
382 $ENV{hello} = "environ";
383 run_make_test(undef,
384               'baseexport=unexport', "base make=base shell=\nmid make=mid shell=mid\nall make=environ shell=environ\n");
385
386 # Test mid settings with env var
387 $ENV{hello} = "environ";
388 run_make_test(undef,
389               'midexport=export', "base make=base shell=base\nmid make=mid shell=mid\nall make=environ shell=environ\n");
390
391 $ENV{hello} = "environ";
392 run_make_test(undef,
393               'midexport=export baseexport=unexport', "base make=base shell=\nmid make=mid shell=mid\nall make=environ shell=environ\n");
394
395 $ENV{hello} = "environ";
396 run_make_test(undef,
397               'midexport=unexport', "base make=base shell=\nmid make=mid shell=\nall make=environ shell=environ\n");
398
399 $ENV{hello} = "environ";
400 run_make_test(undef,
401               'midexport=unexport baseexport=export', "base make=base shell=base\nmid make=mid shell=\nall make=environ shell=environ\n");
402
403 # Test base settings without env var
404 run_make_test(undef,
405               'baseexport=export', "base make=base shell=base\nmid make=mid shell=\nall make= shell=\n");
406
407 run_make_test(undef,
408               'baseexport=unexport', "base make=base shell=\nmid make=mid shell=\nall make= shell=\n");
409
410 # Test mid settings with env var
411 run_make_test(undef,
412               'midexport=export', "base make=base shell=base\nmid make=mid shell=mid\nall make= shell=\n");
413
414 run_make_test(undef,
415               'midexport=export baseexport=unexport', "base make=base shell=\nmid make=mid shell=mid\nall make= shell=\n");
416
417 run_make_test(undef,
418               'midexport=unexport', "base make=base shell=\nmid make=mid shell=\nall make= shell=\n");
419
420 run_make_test(undef,
421               'midexport=unexport baseexport=export', "base make=base shell=base\nmid make=mid shell=\nall make= shell=\n");
422
423
424
425 # TEST #19: Test define/endef variables as target-specific vars
426
427 # run_make_test('
428 # define b
429 # @echo global
430 # endef
431 # a: define b
432 # @echo local
433 # endef
434
435 # a: ; $(b)
436 # ',
437 #               '', "local\n");
438
439 1;