1*69606e3fSchristos# -*-perl-*- 2*69606e3fSchristos$description = "Test pattern-specific variable settings."; 3*69606e3fSchristos 4*69606e3fSchristos$details = "\ 5*69606e3fSchristosCreate a makefile containing various flavors of pattern-specific variable 6*69606e3fSchristossettings, override and non-override, and using various variable expansion 7*69606e3fSchristosrules, semicolon interference, etc."; 8*69606e3fSchristos 9*69606e3fSchristosopen(MAKEFILE,"> $makefile"); 10*69606e3fSchristos 11*69606e3fSchristosprint MAKEFILE <<'EOF'; 12*69606e3fSchristosall: one.x two.x three.x 13*69606e3fSchristosFOO = foo 14*69606e3fSchristosBAR = bar 15*69606e3fSchristosBAZ = baz 16*69606e3fSchristosone.x: override FOO = one 17*69606e3fSchristos%.x: BAR = two 18*69606e3fSchristost%.x: BAR = four 19*69606e3fSchristosthr% : override BAZ = three 20*69606e3fSchristosone.x two.x three.x: ; @echo $@: $(FOO) $(BAR) $(BAZ) 21*69606e3fSchristosfour.x: baz ; @echo $@: $(FOO) $(BAR) $(BAZ) 22*69606e3fSchristosbaz: ; @echo $@: $(FOO) $(BAR) $(BAZ) 23*69606e3fSchristos 24*69606e3fSchristos# test matching multiple patterns 25*69606e3fSchristosa%: AAA = aaa 26*69606e3fSchristos%b: BBB = ccc 27*69606e3fSchristosa%: BBB += ddd 28*69606e3fSchristos%b: AAA ?= xxx 29*69606e3fSchristos%b: AAA += bbb 30*69606e3fSchristos.PHONY: ab 31*69606e3fSchristosab: ; @echo $(AAA); echo $(BBB) 32*69606e3fSchristosEOF 33*69606e3fSchristos 34*69606e3fSchristosclose(MAKEFILE); 35*69606e3fSchristos 36*69606e3fSchristos 37*69606e3fSchristos# TEST #1 -- basics 38*69606e3fSchristos 39*69606e3fSchristos&run_make_with_options($makefile, "", &get_logfile); 40*69606e3fSchristos$answer = "one.x: one two baz\ntwo.x: foo four baz\nthree.x: foo four three\n"; 41*69606e3fSchristos&compare_output($answer,&get_logfile(1)); 42*69606e3fSchristos 43*69606e3fSchristos 44*69606e3fSchristos# TEST #2 -- try the override feature 45*69606e3fSchristos 46*69606e3fSchristos&run_make_with_options($makefile, "BAZ=five", &get_logfile); 47*69606e3fSchristos$answer = "one.x: one two five\ntwo.x: foo four five\nthree.x: foo four three\n"; 48*69606e3fSchristos&compare_output($answer,&get_logfile(1)); 49*69606e3fSchristos 50*69606e3fSchristos 51*69606e3fSchristos# TEST #3 -- make sure patterns are inherited properly 52*69606e3fSchristos 53*69606e3fSchristos&run_make_with_options($makefile, "four.x", &get_logfile); 54*69606e3fSchristos$answer = "baz: foo two baz\nfour.x: foo two baz\n"; 55*69606e3fSchristos&compare_output($answer,&get_logfile(1)); 56*69606e3fSchristos 57*69606e3fSchristos 58*69606e3fSchristos# TEST #4 -- test multiple patterns matching the same target 59*69606e3fSchristos 60*69606e3fSchristos&run_make_with_options($makefile, "ab", &get_logfile); 61*69606e3fSchristos$answer = "aaa bbb\nccc ddd\n"; 62*69606e3fSchristos&compare_output($answer,&get_logfile(1)); 63*69606e3fSchristos 64*69606e3fSchristos# TEST #5 -- test pattern-specific exported variables 65*69606e3fSchristos# 66*69606e3fSchristosrun_make_test(' 67*69606e3fSchristos/%: export foo := foo 68*69606e3fSchristos 69*69606e3fSchristos/bar: 70*69606e3fSchristos @echo $(foo) $$foo 71*69606e3fSchristos', '', 'foo foo'); 72*69606e3fSchristos 73*69606e3fSchristos 74*69606e3fSchristos# TEST #6 -- test expansion of pattern-specific simple variables 75*69606e3fSchristos# 76*69606e3fSchristosrun_make_test(' 77*69606e3fSchristos.PHONY: all 78*69606e3fSchristos 79*69606e3fSchristosall: inherit := good $$t 80*69606e3fSchristosall: bar baz 81*69606e3fSchristos 82*69606e3fSchristosb%: pattern := good $$t 83*69606e3fSchristos 84*69606e3fSchristosglobal := orginal $$t 85*69606e3fSchristos 86*69606e3fSchristos 87*69606e3fSchristos# normal target 88*69606e3fSchristos# 89*69606e3fSchristosifdef rec 90*69606e3fSchristosbar: a = global: $(global) pattern: $(pattern) inherit: $(inherit) 91*69606e3fSchristoselse 92*69606e3fSchristosbar: a := global: $(global) pattern: $(pattern) inherit: $(inherit) 93*69606e3fSchristosendif 94*69606e3fSchristos 95*69606e3fSchristosbar: ; @echo \'normal: $a;\' 96*69606e3fSchristos 97*69606e3fSchristos 98*69606e3fSchristos# pattern target 99*69606e3fSchristos# 100*69606e3fSchristosifdef rec 101*69606e3fSchristos%z: a = global: $(global) pattern: $(pattern) inherit: $(inherit) 102*69606e3fSchristoselse 103*69606e3fSchristos%z: a := global: $(global) pattern: $(pattern) inherit: $(inherit) 104*69606e3fSchristosendif 105*69606e3fSchristos 106*69606e3fSchristos%z: ; @echo \'pattrn: $a;\' 107*69606e3fSchristos 108*69606e3fSchristos 109*69606e3fSchristosglobal := new $$t 110*69606e3fSchristos', 111*69606e3fSchristos'', 112*69606e3fSchristos'normal: global: orginal $t pattern: inherit: ; 113*69606e3fSchristospattrn: global: orginal $t pattern: inherit: ;'); 114*69606e3fSchristos 115*69606e3fSchristos 116*69606e3fSchristos# TEST #7 -- test expansion of pattern-specific recursive variables 117*69606e3fSchristos# 118*69606e3fSchristosrun_make_test(undef, # reuse previous makefile 119*69606e3fSchristos'rec=1', 120*69606e3fSchristos'normal: global: new $t pattern: good $t inherit: good $t; 121*69606e3fSchristospattrn: global: new $t pattern: good $t inherit: good $t;'); 122*69606e3fSchristos 123*69606e3fSchristos 124*69606e3fSchristos1; 125