| # -*-perl-*- |
| $description = "Test pattern-specific variable settings."; |
| |
| $details = "\ |
| Create a makefile containing various flavors of pattern-specific variable |
| settings, override and non-override, and using various variable expansion |
| rules, semicolon interference, etc."; |
| |
| open(MAKEFILE,"> $makefile"); |
| |
| print MAKEFILE <<'EOF'; |
| all: one.x two.x three.x |
| FOO = foo |
| BAR = bar |
| BAZ = baz |
| one.x: override FOO = one |
| %.x: BAR = two |
| t%.x: BAR = four |
| thr% : override BAZ = three |
| one.x two.x three.x: ; @echo $@: $(FOO) $(BAR) $(BAZ) |
| four.x: baz ; @echo $@: $(FOO) $(BAR) $(BAZ) |
| baz: ; @echo $@: $(FOO) $(BAR) $(BAZ) |
| |
| # test matching multiple patterns |
| a%: AAA = aaa |
| %b: BBB = ccc |
| a%: BBB += ddd |
| %b: AAA ?= xxx |
| %b: AAA += bbb |
| .PHONY: ab |
| ab: ; @echo $(AAA); echo $(BBB) |
| EOF |
| |
| close(MAKEFILE); |
| |
| |
| # TEST #1 -- basics |
| |
| &run_make_with_options($makefile, "", &get_logfile); |
| $answer = "one.x: one two baz\ntwo.x: foo four baz\nthree.x: foo four three\n"; |
| &compare_output($answer,&get_logfile(1)); |
| |
| |
| # TEST #2 -- try the override feature |
| |
| &run_make_with_options($makefile, "BAZ=five", &get_logfile); |
| $answer = "one.x: one two five\ntwo.x: foo four five\nthree.x: foo four three\n"; |
| &compare_output($answer,&get_logfile(1)); |
| |
| |
| # TEST #3 -- make sure patterns are inherited properly |
| |
| &run_make_with_options($makefile, "four.x", &get_logfile); |
| $answer = "baz: foo two baz\nfour.x: foo two baz\n"; |
| &compare_output($answer,&get_logfile(1)); |
| |
| |
| # TEST #4 -- test multiple patterns matching the same target |
| |
| &run_make_with_options($makefile, "ab", &get_logfile); |
| $answer = "aaa bbb\nccc ddd\n"; |
| &compare_output($answer,&get_logfile(1)); |
| |
| # TEST #5 -- test pattern-specific exported variables |
| # |
| run_make_test(' |
| /%: export foo := foo |
| |
| /bar: |
| @echo $(foo) $$foo |
| ', '', 'foo foo'); |
| |
| |
| # TEST #6 -- test expansion of pattern-specific simple variables |
| # |
| run_make_test(' |
| .PHONY: all |
| |
| all: inherit := good $$t |
| all: bar baz |
| |
| b%: pattern := good $$t |
| |
| global := original $$t |
| |
| |
| # normal target |
| # |
| ifdef rec |
| bar: a = global: $(global) pattern: $(pattern) inherit: $(inherit) |
| else |
| bar: a := global: $(global) pattern: $(pattern) inherit: $(inherit) |
| endif |
| |
| bar: ; @echo \'normal: $a;\' |
| |
| |
| # pattern target |
| # |
| ifdef rec |
| %z: a = global: $(global) pattern: $(pattern) inherit: $(inherit) |
| else |
| %z: a := global: $(global) pattern: $(pattern) inherit: $(inherit) |
| endif |
| |
| %z: ; @echo \'pattern: $a;\' |
| |
| |
| global := new $$t |
| ', |
| '', |
| 'normal: global: original $t pattern: inherit: ; |
| pattern: global: original $t pattern: inherit: ;'); |
| |
| |
| # TEST #7 -- test expansion of pattern-specific recursive variables |
| # |
| run_make_test(undef, # reuse previous makefile |
| 'rec=1', |
| 'normal: global: new $t pattern: good $t inherit: good $t; |
| pattern: global: new $t pattern: good $t inherit: good $t;'); |
| |
| # TEST #8: override in pattern-specific variables |
| |
| run_make_test(' |
| a%: override FOO += f1 |
| a%: FOO += f2 |
| ab: ; @echo "$(FOO)" |
| ', |
| '', "f1\n"); |
| |
| run_make_test(undef, 'FOO=C', "C f1\n"); |
| |
| # TEST #9: Test shortest stem selection in pattern-specific variables. |
| |
| run_make_test(' |
| %-mt.x: x := two |
| %.x: x := one |
| |
| all: foo.x foo-mt.x |
| |
| foo.x: ;@echo $x |
| foo-mt.x: ;@echo $x |
| ', |
| '', |
| "one\ntwo"); |
| |
| 1; |