xref: /netbsd-src/external/gpl2/gmake/dist/tests/scripts/features/patternrules (revision 69606e3f5c9388e52aed8c120ad63c049ca45d8f)
1*69606e3fSchristos#                                                                    -*-perl-*-
2*69606e3fSchristos
3*69606e3fSchristos$description = "Test pattern rules.";
4*69606e3fSchristos
5*69606e3fSchristos$details = "";
6*69606e3fSchristos
7*69606e3fSchristosuse Cwd;
8*69606e3fSchristos
9*69606e3fSchristos$dir = cwd;
10*69606e3fSchristos$dir =~ s,.*/([^/]+)$,../$1,;
11*69606e3fSchristos
12*69606e3fSchristos
13*69606e3fSchristos#  TEST #1: Make sure that multiple patterns where the same target
14*69606e3fSchristos#           can be built are searched even if the first one fails
15*69606e3fSchristos#           to match properly.
16*69606e3fSchristos#
17*69606e3fSchristos
18*69606e3fSchristosrun_make_test('
19*69606e3fSchristos.PHONY: all
20*69606e3fSchristos
21*69606e3fSchristosall: case.1 case.2 case.3
22*69606e3fSchristosa: void
23*69606e3fSchristos
24*69606e3fSchristos# 1 - existing file
25*69606e3fSchristos%.1: void
26*69606e3fSchristos	@exit 1
27*69606e3fSchristos%.1: #MAKEFILE#
28*69606e3fSchristos	@exit 0
29*69606e3fSchristos
30*69606e3fSchristos# 2 - phony
31*69606e3fSchristos%.2: void
32*69606e3fSchristos	@exit 1
33*69606e3fSchristos%.2: 2.phony
34*69606e3fSchristos	@exit 0
35*69606e3fSchristos.PHONY: 2.phony
36*69606e3fSchristos
37*69606e3fSchristos# 3 - implicit-phony
38*69606e3fSchristos%.3: void
39*69606e3fSchristos	@exit 1
40*69606e3fSchristos%.3: 3.implicit-phony
41*69606e3fSchristos	@exit 0
42*69606e3fSchristos
43*69606e3fSchristos3.implicit-phony:
44*69606e3fSchristos',
45*69606e3fSchristos'',
46*69606e3fSchristos'');
47*69606e3fSchristos
48*69606e3fSchristos# TEST #2: make sure files that are built via implicit rules are marked
49*69606e3fSchristos#          as targets (Savannah bug #12202).
50*69606e3fSchristos#
51*69606e3fSchristosrun_make_test('
52*69606e3fSchristosTARGETS := foo foo.out
53*69606e3fSchristos
54*69606e3fSchristos.PHONY: all foo.in
55*69606e3fSchristos
56*69606e3fSchristosall: $(TARGETS)
57*69606e3fSchristos
58*69606e3fSchristos%: %.in
59*69606e3fSchristos	@echo $@
60*69606e3fSchristos
61*69606e3fSchristos%.out: %
62*69606e3fSchristos	@echo $@
63*69606e3fSchristos
64*69606e3fSchristosfoo.in: ; @:
65*69606e3fSchristos
66*69606e3fSchristos',
67*69606e3fSchristos'',
68*69606e3fSchristos'foo
69*69606e3fSchristosfoo.out');
70*69606e3fSchristos
71*69606e3fSchristos
72*69606e3fSchristos# TEST #3: make sure intermidite files that also happened to be
73*69606e3fSchristos#          prerequisites are not removed (Savannah bug #12267).
74*69606e3fSchristos#
75*69606e3fSchristosrun_make_test('
76*69606e3fSchristos$(dir)/foo.o:
77*69606e3fSchristos
78*69606e3fSchristos$(dir)/foo.y:
79*69606e3fSchristos	@echo $@
80*69606e3fSchristos
81*69606e3fSchristos%.c: %.y
82*69606e3fSchristos	touch $@
83*69606e3fSchristos
84*69606e3fSchristos%.o: %.c
85*69606e3fSchristos	@echo $@
86*69606e3fSchristos
87*69606e3fSchristos.PHONY: install
88*69606e3fSchristosinstall: $(dir)/foo.c
89*69606e3fSchristos
90*69606e3fSchristos',
91*69606e3fSchristos"dir=$dir",
92*69606e3fSchristos"$dir/foo.y
93*69606e3fSchristostouch $dir/foo.c
94*69606e3fSchristos$dir/foo.o");
95*69606e3fSchristos
96*69606e3fSchristosunlink("$dir/foo.c");
97*69606e3fSchristos
98*69606e3fSchristos
99*69606e3fSchristos# TEST #4: make sure precious flag is set properly for targets
100*69606e3fSchristos#          that are built via implicit rules (Savannah bug #13218).
101*69606e3fSchristos#
102*69606e3fSchristosrun_make_test('
103*69606e3fSchristos.DELETE_ON_ERROR:
104*69606e3fSchristos
105*69606e3fSchristos.PRECIOUS: %.bar
106*69606e3fSchristos
107*69606e3fSchristos%.bar:; @touch $@ && exit 1
108*69606e3fSchristos
109*69606e3fSchristos$(dir)/foo.bar:
110*69606e3fSchristos
111*69606e3fSchristos',
112*69606e3fSchristos"dir=$dir",
113*69606e3fSchristos"#MAKE#: *** [$dir/foo.bar] Error 1",
114*69606e3fSchristos512);
115*69606e3fSchristos
116*69606e3fSchristosunlink("$dir/foo.bar");
117*69606e3fSchristos
118*69606e3fSchristos
119*69606e3fSchristos# TEST #5: make sure targets of a macthed implicit pattern rule never
120*69606e3fSchristos#          never considered intermediate (Savannah bug #13022).
121*69606e3fSchristos#
122*69606e3fSchristosrun_make_test('
123*69606e3fSchristos.PHONY: all
124*69606e3fSchristosall: foo.c foo.o
125*69606e3fSchristos
126*69606e3fSchristos%.h %.c: %.in
127*69606e3fSchristos	touch $*.h
128*69606e3fSchristos	touch $*.c
129*69606e3fSchristos
130*69606e3fSchristos%.o: %.c %.h
131*69606e3fSchristos	echo $+ >$@
132*69606e3fSchristos
133*69606e3fSchristos%.o: %.c
134*69606e3fSchristos	@echo wrong rule
135*69606e3fSchristos
136*69606e3fSchristosfoo.in:
137*69606e3fSchristos	touch $@
138*69606e3fSchristos
139*69606e3fSchristos',
140*69606e3fSchristos'',
141*69606e3fSchristos'touch foo.in
142*69606e3fSchristostouch foo.h
143*69606e3fSchristostouch foo.c
144*69606e3fSchristosecho foo.c foo.h >foo.o');
145*69606e3fSchristos
146*69606e3fSchristosunlink('foo.in', 'foo.h', 'foo.c', 'foo.o');
147*69606e3fSchristos
148*69606e3fSchristos# This tells the test driver that the perl test script executed properly.
149*69606e3fSchristos1;
150