| # -*-perl-*- |
| |
| $description = "Test pattern rules."; |
| |
| $details = ""; |
| |
| use Cwd; |
| |
| $dir = cwd; |
| $dir =~ s,.*/([^/]+)$,../$1,; |
| |
| |
| # TEST #0: Make sure that multiple patterns where the same target |
| # can be built are searched even if the first one fails |
| # to match properly. |
| # |
| |
| run_make_test(q! |
| .PHONY: all |
| |
| all: case.1 case.2 case.3 |
| |
| # We can't have this, due to "Implicit Rule Search Algorithm" step 5c |
| #xxx: void |
| |
| # 1 - existing file |
| %.1: void |
| @exit 1 |
| %.1: #MAKEFILE# |
| @exit 0 |
| |
| # 2 - phony |
| %.2: void |
| @exit 1 |
| %.2: 2.phony |
| @exit 0 |
| .PHONY: 2.phony |
| |
| # 3 - implicit-phony |
| %.3: void |
| @exit 1 |
| %.3: 3.implicit-phony |
| @exit 0 |
| |
| 3.implicit-phony: |
| !, '', ''); |
| |
| # TEST #1: make sure files that are built via implicit rules are marked |
| # as targets (Savannah bug #12202). |
| # |
| run_make_test(' |
| TARGETS := foo foo.out |
| |
| .PHONY: all foo.in |
| |
| all: $(TARGETS) |
| |
| %: %.in |
| @echo $@ |
| |
| %.out: % |
| @echo $@ |
| |
| foo.in: ; @: |
| |
| ', |
| '', |
| 'foo |
| foo.out'); |
| |
| |
| # TEST #2: make sure intermediate files that also happened to be |
| # prerequisites are not removed (Savannah bug #12267). |
| # |
| run_make_test(' |
| $(dir)/foo.o: |
| |
| $(dir)/foo.y: |
| @echo $@ |
| |
| %.c: %.y |
| touch $@ |
| |
| %.o: %.c |
| @echo $@ |
| |
| .PHONY: install |
| install: $(dir)/foo.c |
| |
| ', |
| "dir=$dir", |
| "$dir/foo.y |
| touch $dir/foo.c |
| $dir/foo.o"); |
| |
| unlink("$dir/foo.c"); |
| |
| |
| # TEST #3: make sure precious flag is set properly for targets |
| # that are built via implicit rules (Savannah bug #13218). |
| # |
| run_make_test(' |
| .DELETE_ON_ERROR: |
| |
| .PRECIOUS: %.bar |
| |
| %.bar:; @touch $@ && exit 1 |
| |
| $(dir)/foo.bar: |
| |
| ', |
| "dir=$dir", |
| "#MAKE#: *** [#MAKEFILE#:6: $dir/foo.bar] Error 1", |
| 512); |
| |
| unlink("$dir/foo.bar"); |
| |
| |
| # TEST #4: make sure targets of a matched implicit pattern rule are |
| # never considered intermediate (Savannah bug #13022). |
| # |
| run_make_test(' |
| .PHONY: all |
| all: foo.c foo.o |
| |
| %.h %.c: %.in |
| touch $*.h |
| touch $*.c |
| |
| %.o: %.c %.h |
| echo $+ >$@ |
| |
| %.o: %.c |
| @echo wrong rule |
| |
| foo.in: |
| touch $@ |
| |
| ', |
| '', |
| 'touch foo.in |
| touch foo.h |
| touch foo.c |
| echo foo.c foo.h >foo.o'); |
| |
| unlink('foo.in', 'foo.h', 'foo.c', 'foo.o'); |
| |
| # TEST #5: make sure both prefix and suffix patterns work with multiple |
| # target patterns (Savannah bug #26593). |
| # |
| run_make_test(' |
| all: foo.s1 foo.s2 p1.foo p2.foo |
| |
| p1.% p2.%: %.orig |
| @echo $@ |
| %.s1 %.s2: %.orig |
| @echo $@ |
| |
| .PHONY: foo.orig |
| ', |
| '', "foo.s1\np1.foo\n"); |
| |
| # TEST 6: Make sure that non-target files are still eligible to be created |
| # as part of implicit rule chaining. Savannah bug #17752. |
| |
| run_make_test(sprintf(q! |
| BIN = xyz |
| COPY = $(BIN).cp |
| SRC = $(BIN).c |
| allbroken: $(COPY) $(BIN) ; @echo ok |
| $(SRC): ; @echo 'main(){}' > $@ |
| %%.cp: %% ; @cp $< $@ |
| %% : %%.c ; @cp $< $@ |
| clean: ; @%s $(SRC) $(COPY) $(BIN) |
| !, $CMD_rmfile), |
| '', "ok\n"); |
| |
| unlink(qw(xyz xyz.cp xyz.c)); |
| |
| # TEST 7: Make sure that all prereqs of all "also_make" targets get created |
| # before any of the things that depend on any of them. Savannah bug #19108. |
| |
| run_make_test(q! |
| final: x ; @echo $@ |
| x: x.t1 x.t2 ; @echo $@ |
| x.t2: dep |
| dep: ; @echo $@ |
| %.t1 %.t2: ; @echo $*.t1 ; echo $*.t2 |
| !, |
| '', "dep\nx.t1\nx.t2\nx\nfinal\n"); |
| |
| |
| # TEST 8: Verify we can remove pattern rules. Savannah bug #18622. |
| |
| my @f = (qw(foo.w foo.ch)); |
| touch(@f); |
| |
| run_make_test(q! |
| CWEAVE := : |
| |
| # Disable builtin rules |
| %.tex : %.w |
| %.tex : %.w %.ch |
| !, |
| 'foo.tex', |
| "#MAKE#: *** No rule to make target 'foo.tex'. Stop.", 512); |
| |
| unlink(@f); |
| |
| # TEST #9: Test shortest stem selection in pattern rules. |
| |
| run_make_test(' |
| %.x: ;@echo one |
| %-mt.x: ;@echo two |
| |
| all: foo.x foo-mt.x |
| ', |
| '', |
| "one\ntwo"); |
| |
| 1; |
| |
| # This tells the test driver that the perl test script executed properly. |
| 1; |
| |
| ### Local Variables: |
| ### eval: (setq whitespace-action (delq 'auto-cleanup whitespace-action)) |
| ### End: |