- Enhance .POSIX to set -e when invoking shells, as demanded by a
[make.git] / tests / scripts / features / patternrules
blobeebe7c0af4f47c663b90b994cc7aea2a430b5ec5
1 #                                                                    -*-perl-*-
3 $description = "Test pattern rules.";
5 $details = "";
7 use Cwd;
9 $dir = cwd;
10 $dir =~ s,.*/([^/]+)$,../$1,;
13 # TEST #0: Make sure that multiple patterns where the same target
14 #          can be built are searched even if the first one fails
15 #          to match properly.
18 run_make_test(q!
19 .PHONY: all
21 all: case.1 case.2 case.3
23 # We can't have this, due to "Implicit Rule Search Algorithm" step 5c
24 #xxx: void
26 # 1 - existing file
27 %.1: void
28         @exit 1
29 %.1: #MAKEFILE#
30         @exit 0
32 # 2 - phony
33 %.2: void
34         @exit 1
35 %.2: 2.phony
36         @exit 0
37 .PHONY: 2.phony
39 # 3 - implicit-phony
40 %.3: void
41         @exit 1
42 %.3: 3.implicit-phony
43         @exit 0
45 3.implicit-phony:
46 !, '', '');
48 # TEST #1: make sure files that are built via implicit rules are marked
49 #          as targets (Savannah bug #12202).
51 run_make_test('
52 TARGETS := foo foo.out
54 .PHONY: all foo.in
56 all: $(TARGETS)
58 %: %.in
59         @echo $@
61 %.out: %
62         @echo $@
64 foo.in: ; @:
67 '',
68 'foo
69 foo.out');
72 # TEST #2: make sure intermediate files that also happened to be
73 #          prerequisites are not removed (Savannah bug #12267).
75 run_make_test('
76 $(dir)/foo.o:
78 $(dir)/foo.y:
79         @echo $@
81 %.c: %.y
82         touch $@
84 %.o: %.c
85         @echo $@
87 .PHONY: install
88 install: $(dir)/foo.c
91 "dir=$dir",
92 "$dir/foo.y
93 touch $dir/foo.c
94 $dir/foo.o");
96 unlink("$dir/foo.c");
99 # TEST #3: make sure precious flag is set properly for targets
100 #          that are built via implicit rules (Savannah bug #13218).
102 run_make_test('
103 .DELETE_ON_ERROR:
105 .PRECIOUS: %.bar
107 %.bar:; @touch $@ && exit 1
109 $(dir)/foo.bar:
112 "dir=$dir",
113 "#MAKE#: *** [$dir/foo.bar] Error 1",
114 512);
116 unlink("$dir/foo.bar");
119 # TEST #4: make sure targets of a matched implicit pattern rule are
120 #          never considered intermediate (Savannah bug #13022).
122 run_make_test('
123 .PHONY: all
124 all: foo.c foo.o
126 %.h %.c: %.in
127         touch $*.h
128         touch $*.c
130 %.o: %.c %.h
131         echo $+ >$@
133 %.o: %.c
134         @echo wrong rule
136 foo.in:
137         touch $@
141 'touch foo.in
142 touch foo.h
143 touch foo.c
144 echo foo.c foo.h >foo.o');
146 unlink('foo.in', 'foo.h', 'foo.c', 'foo.o');
148 # TEST #5: make sure both prefix and suffix patterns work with multiple
149 #          target patterns (Savannah bug #26593).
151 run_make_test('
152 all: foo.s1 foo.s2 p1.foo p2.foo
154 p1.% p2.%: %.orig
155         @echo $@
156 %.s1 %.s2: %.orig
157         @echo $@
159 .PHONY: foo.orig
161               '', "foo.s1\np1.foo\n");
163 # TEST 6: Make sure that non-target files are still eligible to be created
164 # as part of implicit rule chaining.  Savannah bug #17752.
166 run_make_test(q!
167 BIN = xyz
168 COPY = $(BIN).cp
169 SRC = $(BIN).c
170 allbroken: $(COPY) $(BIN) ; @echo ok
171 $(SRC): ; @echo 'main(){}' > $@
172 %.cp: % ; @cp $< $@
173 % : %.c ; @cp $< $@
174 clean: ; @rm -rf $(SRC) $(COPY) $(BIN)
176               '', "ok\n");
178 unlink(qw(xyz xyz.cp xyz.c));
180 # TEST 7: Make sure that all prereqs of all "also_make" targets get created
181 # before any of the things that depend on any of them.  Savannah bug #19108.
183 run_make_test(q!
184 final: x ; @echo $@
185 x: x.t1 x.t2 ; @echo $@
186 x.t2: dep
187 dep: ; @echo $@
188 %.t1 %.t2: ; @echo $*.t1 ; echo $*.t2
190               '', "dep\nx.t1\nx.t2\nx\nfinal\n");
193 # TEST 8: Verify we can remove pattern rules.  Savannah bug #18622.
195 my @f = (qw(foo.w foo.ch));
196 touch(@f);
198 run_make_test(q!
199 CWEAVE := :
201 # Disable builtin rules
202 %.tex : %.w
203 %.tex : %.w %.ch
205               'foo.tex',
206               "#MAKE#: *** No rule to make target `foo.tex'.  Stop.", 512);
208 unlink(@f);
210 # TEST #9: Test shortest stem selection in pattern rules.
212 run_make_test('
213 %.x: ;@echo one
214 %-mt.x: ;@echo two
216 all: foo.x foo-mt.x
219 "one\ntwo");
223 # This tells the test driver that the perl test script executed properly.