Improve backslash/newline handling to adhere to POSIX requirements.
[make.git] / tests / scripts / features / targetvars
blob6afd48aaa4e95eabb15343ca57d53421037476ba
1 #                                                                    -*-perl-*-
2 $description = "Test target-specific variable settings.";
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.";
9 run_make_test('
10 SHELL = /bin/sh
11 export FOO = foo
12 export BAR = bar
13 one: override FOO = one
14 one two: ; @echo $(FOO) $(BAR)
15 two: BAR = two
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)
56                  "one two three", "one bar\nfoo two\nBAR=1000\nfoo bar\n");
58 # TEST #2
60 run_make_test(undef, "one two FOO=1 BAR=2", "one 2\n1 2\n");
62 # TEST #3
64 run_make_test(undef, "four", "x ok  ok\n");
66 # TEST #4
68 run_make_test(undef, "seven", "eight: seven eight\nseven: seven seven\n");
70 # TEST #5
72 run_make_test(undef, "nine", "wallace bar wallace bar\n");
74 # TEST #5-a
76 run_make_test(undef, "nine-a", "baz\n");
78 # TEST #6
80 run_make_test(undef, "ten", "one=two\none bar\n=\nfoo two\nten\n");
82 # TEST #6
84 run_make_test(undef, "foo.q bar.q", "qvar = rvar\nqvar =\n");
86 # TEST #7
88 run_make_test(undef, "foo.t bar.s", "qvar = qvar\nqvar =\n");
91 # TEST #8
92 # For PR/1378: Target-specific vars don't inherit correctly
94 run_make_test('
95 foo: FOO = foo
96 bar: BAR = bar
97 foo: bar
98 bar: baz
99 baz: ; @echo $(FOO) $(BAR)
100 ', "", "foo bar\n");
102 # TEST #9
103 # For PR/1380: Using += assignment in target-specific variables sometimes fails
104 # Also PR/1831
106 run_make_test('
107 .PHONY: all one
108 all: FOO += baz
109 all: one; @echo $(FOO)
111 FOO = bar
113 one: FOO += biz
114 one: FOO += boz
115 one: ; @echo $(FOO)
117               '', "bar baz biz boz\nbar baz\n");
119 # Test #10
121 run_make_test(undef, 'one', "bar biz boz\n");
123 # Test #11
124 # PR/1709: Test semicolons in target-specific variable values
126 run_make_test('
127 foo : FOO = ; ok
128 foo : ; @echo "$(FOO)"
130               '', "; ok\n");
132 # Test #12
133 # PR/2020: More hassles with += target-specific vars.  I _really_ think
134 # I nailed it this time :-/.
136 run_make_test('
137 .PHONY: a
139 BLAH := foo
140 COMMAND = echo $(BLAH)
142 a: ; @$(COMMAND)
144 a: BLAH := bar
145 a: COMMAND += snafu $(BLAH)
147               '', "bar snafu bar\n");
149 # Test #13
150 # Test double-colon rules with target-specific variable values
152 run_make_test('
153 W = bad
154 X = bad
155 foo: W = ok
156 foo:: ; @echo $(W) $(X) $(Y) $(Z)
157 foo:: ; @echo $(W) $(X) $(Y) $(Z)
158 foo: X = ok
160 Y = foo
161 bar: foo
162 bar: Y = bar
164 Z = nopat
165 ifdef PATTERN
166   fo% : Z = pat
167 endif
169              'foo', "ok ok foo nopat\nok ok foo nopat\n");
171 # Test #14
172 # Test double-colon rules with target-specific variable values and
173 # inheritance
175 run_make_test(undef, 'bar', "ok ok bar nopat\nok ok bar nopat\n");
177 # Test #15
178 # Test double-colon rules with pattern-specific variable values
180 run_make_test(undef, 'foo PATTERN=yes', "ok ok foo pat\nok ok foo pat\n");
182 # Test #16
183 # Test target-specific variables with very long command line
184 # (> make default buffer length)
186 run_make_test('
187 base_metals_fmd_reports.sun5 base_metals_fmd_reports CreateRealPositions        CreateMarginFunds deals_changed_since : BUILD_OBJ=$(shell if [ -f               "build_information.generate" ]; then echo "$(OBJ_DIR)/build_information.o"; else echo "no build information"; fi  )
189 deals_changed_since: ; @echo $(BUILD_OBJ)
191               '', "no build information\n");
193 # TEST #17
195 # Test a merge of set_lists for files, where one list is much longer
196 # than the other.  See Savannah bug #15757.
198 mkdir('t1', 0777);
199 touch('t1/rules.mk');
201 run_make_test('
202 VPATH = t1
203 include rules.mk
204 .PHONY: all
205 all: foo.x
206 foo.x : rules.mk ; @echo MYVAR=$(MYVAR) FOOVAR=$(FOOVAR) ALLVAR=$(ALLVAR)
207 all: ALLVAR = xxx
208 foo.x: FOOVAR = bar
209 rules.mk : MYVAR = foo
210 .INTERMEDIATE: foo.x rules.mk
212               '-I t1', 'MYVAR= FOOVAR=bar ALLVAR=xxx');
214 rmfiles('t1/rules.mk');
215 rmdir('t1');
217 # TEST #18
219 # Test appending to a simple variable containing a "$": avoid a
220 # double-expansion.  See Savannah bug #15913.
222 run_make_test('
223 VAR := $$FOO
224 foo: VAR += BAR
225 foo: ; @echo '."'".'$(VAR)'."'".'
227               '', '$FOO BAR');
229 # TEST #19: Override with append variables
231 run_make_test('
232 a: override FOO += f1
233 a: FOO += f2
234 a: ; @echo "$(FOO)"
236               '', "f1\n");
238 run_make_test(undef, 'FOO=C', "C f1\n");
240 # TEST #20: Check for continuation after semicolons
242 run_make_test(q!
243 a: A = 'hello;\
244 world'
245 a: ; @echo $(A)
247               '', "hello; world\n");
249 # TEST #19: Test define/endef variables as target-specific vars
251 # run_make_test('
252 # define b
253 # @echo global
254 # endef
255 # a: define b
256 # @echo local
257 # endef
259 # a: ; $(b)
260 # ',
261 #               '', "local\n");