Imported Upstream version 3.82
[platform/upstream/make.git] / tests / scripts / features / patspecific_vars
1 #                                                                    -*-perl-*-
2 $description = "Test pattern-specific variable settings.";
3
4 $details = "\
5 Create a makefile containing various flavors of pattern-specific variable
6 settings, override and non-override, and using various variable expansion
7 rules, semicolon interference, etc.";
8
9 open(MAKEFILE,"> $makefile");
10
11 print MAKEFILE <<'EOF';
12 all: one.x two.x three.x
13 FOO = foo
14 BAR = bar
15 BAZ = baz
16 one.x: override FOO = one
17 %.x: BAR = two
18 t%.x: BAR = four
19 thr% : override BAZ = three
20 one.x two.x three.x: ; @echo $@: $(FOO) $(BAR) $(BAZ)
21 four.x: baz ; @echo $@: $(FOO) $(BAR) $(BAZ)
22 baz: ; @echo $@: $(FOO) $(BAR) $(BAZ)
23
24 # test matching multiple patterns
25 a%: AAA = aaa
26 %b: BBB = ccc
27 a%: BBB += ddd
28 %b: AAA ?= xxx
29 %b: AAA += bbb
30 .PHONY: ab
31 ab: ; @echo $(AAA); echo $(BBB)
32 EOF
33
34 close(MAKEFILE);
35
36
37 # TEST #1 -- basics
38
39 &run_make_with_options($makefile, "", &get_logfile);
40 $answer = "one.x: one two baz\ntwo.x: foo four baz\nthree.x: foo four three\n";
41 &compare_output($answer,&get_logfile(1));
42
43
44 # TEST #2 -- try the override feature
45
46 &run_make_with_options($makefile, "BAZ=five", &get_logfile);
47 $answer = "one.x: one two five\ntwo.x: foo four five\nthree.x: foo four three\n";
48 &compare_output($answer,&get_logfile(1));
49
50
51 # TEST #3 -- make sure patterns are inherited properly
52
53 &run_make_with_options($makefile, "four.x", &get_logfile);
54 $answer = "baz: foo two baz\nfour.x: foo two baz\n";
55 &compare_output($answer,&get_logfile(1));
56
57
58 # TEST #4 -- test multiple patterns matching the same target
59
60 &run_make_with_options($makefile, "ab", &get_logfile);
61 $answer = "aaa bbb\nccc ddd\n";
62 &compare_output($answer,&get_logfile(1));
63
64 # TEST #5 -- test pattern-specific exported variables
65 #
66 run_make_test('
67 /%: export foo := foo
68
69 /bar:
70         @echo $(foo) $$foo
71 ', '', 'foo foo');
72
73
74 # TEST #6 -- test expansion of pattern-specific simple variables
75 #
76 run_make_test('
77 .PHONY: all
78
79 all: inherit := good $$t
80 all: bar baz
81
82 b%: pattern := good $$t
83
84 global := orginal $$t
85
86
87 # normal target
88 #
89 ifdef rec
90 bar: a = global: $(global) pattern: $(pattern) inherit: $(inherit)
91 else
92 bar: a := global: $(global) pattern: $(pattern) inherit: $(inherit)
93 endif
94
95 bar: ; @echo \'normal: $a;\'
96
97
98 # pattern target
99 #
100 ifdef rec
101 %z: a = global: $(global) pattern: $(pattern) inherit: $(inherit)
102 else
103 %z: a := global: $(global) pattern: $(pattern) inherit: $(inherit)
104 endif
105
106 %z: ; @echo \'pattrn: $a;\'
107
108
109 global := new $$t
110 ',
111 '',
112 'normal: global: orginal $t pattern:  inherit: ;
113 pattrn: global: orginal $t pattern:  inherit: ;');
114
115
116 # TEST #7 -- test expansion of pattern-specific recursive variables
117 #
118 run_make_test(undef, # reuse previous makefile
119 'rec=1',
120 'normal: global: new $t pattern: good $t inherit: good $t;
121 pattrn: global: new $t pattern: good $t inherit: good $t;');
122
123 # TEST #8: override in pattern-specific variables
124
125 run_make_test('
126 a%: override FOO += f1
127 a%: FOO += f2
128 ab: ; @echo "$(FOO)"
129 ',
130               '', "f1\n");
131
132 run_make_test(undef, 'FOO=C', "C f1\n");
133
134 # TEST #9: Test shortest stem selection in pattern-specific variables.
135
136 run_make_test('
137 %-mt.x: x := two
138 %.x: x := one
139
140 all: foo.x foo-mt.x
141
142 foo.x: ;@echo $x
143 foo-mt.x: ;@echo $x
144 ',
145 '',
146 "one\ntwo");
147
148 1;