| # -*-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."; |
| |
| # basics |
| |
| run_make_test(q!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) |
| !, |
| "", "one.x: one two baz\ntwo.x: foo four baz\nthree.x: foo four three\n"); |
| |
| # try the override feature |
| |
| run_make_test(undef, "BAZ=five", |
| "one.x: one two five\ntwo.x: foo four five\nthree.x: foo four three\n"); |
| |
| # make sure patterns are inherited properly |
| |
| run_make_test(undef, "four.x", |
| "baz: foo two baz\nfour.x: foo two baz\n"); |
| |
| # test multiple patterns matching the same target |
| |
| run_make_test(undef, "ab", "aaa bbb\nccc ddd\n"); |
| |
| # test pattern-specific exported variables |
| |
| run_make_test(' |
| /%: export foo := foo |
| |
| /bar: |
| #TAB#@echo $(foo) $$foo |
| ', '', 'foo foo'); |
| |
| # 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 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;'); |
| |
| # 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 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; |