# -*-perl-*- $description = "This test is about grouped multiple targets indicated by &:"; $details = "Here we test for requirements like\n" ."- if multiple such targets are updated, the recipe is run once\n" ."- parsing issues related to the &: syntax itself\n"; # Parsing: &: allowed without any targets. run_make_test(q{ .PHONY: all &:; all: ;@printf '' }, '', ""); # Parsing: &: works not preceded by whitespace. run_make_test(q{ foo&:;@echo foo }, 'foo', "foo"); # Ordinary rule runs recipe four times for t1 t2 t3 t4. # Grouped target rule runs recipe once; others are considered updated. run_make_test(q{ .PHONY: t1 t2 t3 t4 g1 g2 g3 g4 t1 t2 t3 t4: ; @echo $@ g1 g2 g3 g4 &: ; @echo $@ }, 't1 t2 t3 t4 g1 g2 g3 g4', "t1\n" ."t2\n" ."t3\n" ."t4\n" ."g1\n" ."#MAKE#: Nothing to be done for 'g2'.\n" ."#MAKE#: Nothing to be done for 'g3'.\n" ."#MAKE#: Nothing to be done for 'g4'."); # Similar to previous test, but targets come from m1 phony # rather than from the command line. We don't see "Nothing to # be done for" messages. Also, note reversed order g4 g3 ... # Thus the auto variable $@ is "g4" when that rule fires. run_make_test(q{ .PHONY: m1 t1 t2 t3 t4 g1 g2 g3 g4 m1: t1 t2 t3 t4 g4 g3 g2 g1 t1 t2 t3 t4: ; @echo $@ g1 g2 g3 g4&: ; @echo $@ }, '', "t1\nt2\nt3\nt4\ng4"); # Set a grouped target recipe for existing targets run_make_test(q{ .PHONY: M a b M: a b a: a b&: ; @echo Y b: }, '', "Y"); # grouped targets require a recipe run_make_test(q{ .PHONY: M a b M: a b a b&: }, '', "#MAKEFILE#:4: *** grouped targets must provide a recipe. Stop.", 512); # Pattern rules use grouped targets anyway so it's a no-op run_make_test(q{ .PHONY: M M: a.q b.q a.% b.%&: ; @echo Y }, '', "Y"); # Double-colon grouped target rules. run_make_test(q{ .PHONY: M a b c d e f g h M: a b a b c&:: ; @echo X c d e&:: ; @echo Y f g h&:: ; @echo Z }, '', "X"); run_make_test(q{ .PHONY: M a b c d e f g h M: c a b c&:: ; @echo X c d e&:: ; @echo Y f g h&:: ; @echo Z }, '', "X\nY"); run_make_test(q{ .PHONY: M a b c d e f g h M: a b c d e a b c&:: ; @echo X c d e&:: ; @echo Y f g h&:: ; @echo Z }, '', "X\nY"); run_make_test(q{ .PHONY: M a b c d e f g h M: d e a b c&:: ; @echo X c d e&:: ; @echo Y f g h&:: ; @echo Z }, '', "Y"); run_make_test(q{ .PHONY: M a b c d e f g h M: f g h a b c&:: ; @echo X c d e&:: ; @echo Y f g h&:: ; @echo Z }, '', "Z"); # This tells the test driver that the perl test script executed properly. 1;