# -*-perl-*- $description = "Test second expansion in static pattern rules."; $details = ""; # Test #1: automatic variables. # run_make_test(q! .SECONDEXPANSION: .DEFAULT: ; @echo '$@' foo.a foo.b: foo.%: bar.% baz.% foo.a foo.b: foo.%: biz.% | buz.% foo.a foo.b: foo.%: $$@.1 \ $$<.2 \ $$(addsuffix .3,$$^) \ $$(addsuffix .4,$$+) \ $$|.5 \ $$*.6 !, '', 'bar.a baz.a biz.a buz.a foo.a.1 bar.a.2 bar.a.3 baz.a.3 biz.a.3 bar.a.4 baz.a.4 biz.a.4 buz.a.5 a.6 '); # Test #2: target/pattern -specific variables. # run_make_test(q! .SECONDEXPANSION: .DEFAULT: ; @echo '$@' foo.x foo.y: foo.%: $$(%_a) $$($$*_b) foo.x: x_a := bar %.x: x_b := baz !, '', "bar\nbaz\n"); # Test #3: order of prerequisites. # run_make_test(q! .SECONDEXPANSION: .DEFAULT: ; @echo '$@' all: foo.a bar.a baz.a # Subtest #1 foo.a foo.b: foo.%: foo.%.1; @: foo.a foo.b: foo.%: foo.%.2 foo.a foo.b: foo.%: foo.%.3 # Subtest #2 bar.a bar.b: bar.%: bar.%.2 bar.a bar.b: bar.%: bar.%.1; @: bar.a bar.b: bar.%: bar.%.3 # Subtest #3 baz.a baz.b: baz.%: baz.%.1 baz.a baz.b: baz.%: baz.%.2 baz.a baz.b: ; @: !, '', 'foo.a.1 foo.a.2 foo.a.3 bar.a.1 bar.a.2 bar.a.3 baz.a.1 baz.a.2 '); # Test #4: Make sure stem triple-expansion does not happen. # run_make_test(q! .SECONDEXPANSION: foo$$bar: f%r: % $$*.1 ; @echo '$*' oo$$ba oo$$ba.1: ; @echo '$@' !, '', 'oo$ba oo$ba.1 oo$ba '); # sv 62324. # Integrity self check. run_make_test(q! .SECONDEXPANSION: all: bye.x bye.x: %.x: $$(firstword %.1; !, '', "#MAKEFILE#:4: *** unterminated call to function 'firstword': missing ')'. Stop.", 512); #unlink('hello.tsk', 'bye.tsk', 'hello.o', 'hello.q', 'bye.o'); # sv 62706. # Test that makes avoids second expanding prerequisites of the targets which # are not built. # Here, hello.tsk is built and its prerequisites are second expanded. # bye.tsk is not built and its prerequisites are not second expanded. # Static pattern rules. run_make_test(q! .SECONDEXPANSION: hello.tsk: %.tsk: %.o $$(info second expansion of $$@ prereqs); $(info $@ from $<) bye.tsk: %.tsk: %.o $$(info second expansion of $$@ prereqs); $(info $@ from $<) hello.o: $$(info second expansion of $$@ prereqs); $(info $@) bye.o: $$(info second expansion of $$@ prereqs); $(info $@) !, 'hello.tsk', "second expansion of hello.tsk prereqs second expansion of hello.o prereqs hello.o hello.tsk from hello.o #MAKE#: 'hello.tsk' is up to date.\n"); # sv 62706. # Order only prereqs. run_make_test(q! .SECONDEXPANSION: hello.tsk: %.tsk:| %.o $$(info second expansion of $$@ prereqs); $(info $@ from $|) bye.tsk: %.tsk:| %.o $$(info second expansion of $$@ prereqs); $(info $@ from $|) hello.o:| $$(info second expansion of $$@ prereqs); $(info $@) bye.o:| $$(info second expansion of $$@ prereqs); $(info $@) !, 'hello.tsk', "second expansion of hello.tsk prereqs second expansion of hello.o prereqs hello.o hello.tsk from hello.o #MAKE#: 'hello.tsk' is up to date.\n"); # sv 62706. # Double colon. 1 rule per target. run_make_test(q! .SECONDEXPANSION: hello.tsk:: %.tsk: %.o $$(info second expansion of $$@ prereqs); $(info $@ from $<) bye.tsk:: %.tsk: %.o $$(info second expansion of $$@ prereqs); $(info $@ from $<) hello.o:: $$(info second expansion of $$@ prereqs); $(info $@) bye.o:: $$(info second expansion of $$@ prereqs); $(info $@) !, 'hello.tsk', "second expansion of hello.tsk prereqs second expansion of hello.o prereqs hello.o hello.tsk from hello.o #MAKE#: 'hello.tsk' is up to date.\n"); # sv 62706. # Double colon. 2 rules per target. run_make_test(q! .SECONDEXPANSION: hello.tsk:: %.tsk: %.o $$(info 1 second expansion of $$@ prereqs); $(info 1 $@ from $<) hello.tsk:: %.tsk: %.o $$(info 2 second expansion of $$@ prereqs); $(info 2 $@ from $<) bye.tsk:: %.tsk: %.o $$(info 1 second expansion of $$@ prereqs); $(info 1 $@ from $<) bye.tsk:: %.tsk: %.o $$(info 2 second expansion of $$@ prereqs); $(info 2 $@ from $<) hello.o:: $$(info 1 second expansion of $$@ prereqs); $(info 1 $@) hello.o:: $$(info 2 second expansion of $$@ prereqs); $(info 2 $@) bye.o:: $$(info 1 second expansion of $$@ prereqs); $(info 1 $@) bye.o:: $$(info 2 second expansion of $$@ prereqs); $(info 2 $@) !, 'hello.tsk', "1 second expansion of hello.tsk prereqs 1 second expansion of hello.o prereqs 1 hello.o 2 second expansion of hello.o prereqs 2 hello.o 1 hello.tsk from hello.o 2 second expansion of hello.tsk prereqs 2 hello.tsk from hello.o #MAKE#: 'hello.tsk' is up to date.\n"); # sv 62706. # Test that the prerequisites of 'hello.tsk' are second expanded once. run_make_test(q! .SECONDEXPANSION: all: hello.tsk hello.q hello.tsk: %.tsk: %.o $$(info second expansion of $$@ prereqs); $(info $@ from $^) hello.o: $$(info second expansion of $$@ prereqs); $(info $@) hello.q: %.q: %.tsk $$(info second expansion of $$@ prereqs); $(info $@ from $^) !, '', "second expansion of hello.tsk prereqs second expansion of hello.o prereqs hello.o hello.tsk from hello.o second expansion of hello.q prereqs hello.q from hello.tsk #MAKE#: Nothing to be done for 'all'.\n"); unlink('hello.1'); # sv 62706. # No side effects from second expansion of unrelated rules. run_make_test(q! .SECONDEXPANSION: all: hello.tsk hello.tsk: %.tsk: %.o; exit 1 hello.o:; bye.tsk: %.tsk: $$(shell touch hello.1); !, '', "exit 1 #MAKE#: *** [#MAKEFILE#:4: hello.tsk] Error 1\n", 512); # sv 62706. # Second expansion of intermediate prerequisites. # The rule to build hello.x is static pattern. # .SECONDARY marks hello.x as intermediate. # Test that $$(deps) is secondary expanded. run_make_test(q! deps:=hello.h .SECONDEXPANSION: .SECONDARY: hello.x all: hello.x hello.x: %.x: $$(deps); $(info $@) hello.h:; $(info $@) !, '', "hello.h\nhello.x\n#MAKE#: Nothing to be done for 'all'.\n"); # This tells the test driver that the perl test script executed properly. 1;