| # -*-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; |