| # -*-perl-*- |
| $description = "Test target-specific variable settings."; |
| |
| $details = "\ |
| Create a makefile containing various flavors of target-specific variable |
| values, override and non-override, and using various variable expansion |
| rules, semicolon interference, etc."; |
| |
| open(MAKEFILE,"> $makefile"); |
| |
| print MAKEFILE <<'EOF'; |
| SHELL = /bin/sh |
| export FOO = foo |
| export BAR = bar |
| one: override FOO = one |
| one two: ; @echo $(FOO) $(BAR) |
| two: BAR = two |
| three: ; BAR=1000 |
| @echo $(FOO) $(BAR) |
| # Some things that shouldn't be target vars |
| funk : override |
| funk : override adelic |
| adelic override : ; echo $@ |
| # Test per-target recursive variables |
| four:FOO=x |
| four:VAR$(FOO)=ok |
| four: ; @echo '$(FOO) $(VAR$(FOO)) $(VAR) $(VARx)' |
| five:FOO=x |
| five six : VAR$(FOO)=good |
| five six: ;@echo '$(FOO) $(VAR$(FOO)) $(VAR) $(VARx) $(VARfoo)' |
| # Test per-target variable inheritance |
| seven: eight |
| seven eight: ; @echo $@: $(FOO) $(BAR) |
| seven: BAR = seven |
| seven: FOO = seven |
| eight: BAR = eight |
| # Test the export keyword with per-target variables |
| nine: ; @echo $(FOO) $(BAR) $$FOO $$BAR |
| nine: FOO = wallace |
| # Test = escaping |
| EQ = = |
| ten: one\=two |
| ten: one \= two |
| ten one$(EQ)two $(EQ):;@echo $@ |
| .PHONY: one two three four five six seven eight nine ten $(EQ) one$(EQ)two |
| # Test target-specific vars with pattern/suffix rules |
| QVAR = qvar |
| RVAR = = |
| %.q : ; @echo $(QVAR) $(RVAR) |
| foo.q : RVAR += rvar |
| # Target-specific vars with multiple LHS pattern rules |
| %.r %.s %.t: ; @echo $(QVAR) $(RVAR) $(SVAR) $(TVAR) |
| foo.r : RVAR += rvar |
| foo.t : TVAR := $(QVAR) |
| EOF |
| |
| close(MAKEFILE); |
| |
| # TEST #1 |
| |
| &run_make_with_options($makefile, "one two three", &get_logfile); |
| $answer = "one bar\nfoo two\nBAR=1000\nfoo bar\n"; |
| &compare_output($answer,&get_logfile(1)); |
| |
| # TEST #2 |
| |
| &run_make_with_options($makefile, "one two FOO=1 BAR=2", &get_logfile); |
| $answer = "one 2\n1 2\n"; |
| &compare_output($answer,&get_logfile(1)); |
| |
| # TEST #3 |
| |
| &run_make_with_options($makefile, "four", &get_logfile); |
| $answer = "x ok ok\n"; |
| &compare_output($answer,&get_logfile(1)); |
| |
| # TEST #4 |
| |
| &run_make_with_options($makefile, "seven", &get_logfile); |
| $answer = "eight: seven eight\nseven: seven seven\n"; |
| &compare_output($answer,&get_logfile(1)); |
| |
| # TEST #5 |
| |
| &run_make_with_options($makefile, "nine", &get_logfile); |
| $answer = "wallace bar wallace bar\n"; |
| &compare_output($answer,&get_logfile(1)); |
| |
| # TEST #6 |
| |
| &run_make_with_options($makefile, "ten", &get_logfile); |
| $answer = "one=two\none bar\n=\nfoo two\nten\n"; |
| &compare_output($answer,&get_logfile(1)); |
| |
| # TEST #6 |
| |
| &run_make_with_options($makefile, "foo.q bar.q", &get_logfile); |
| $answer = "qvar = rvar\nqvar =\n"; |
| &compare_output($answer,&get_logfile(1)); |
| |
| # TEST #7 |
| |
| &run_make_with_options($makefile, "foo.t bar.s", &get_logfile); |
| $answer = "qvar = qvar\nqvar =\n"; |
| &compare_output($answer,&get_logfile(1)); |
| |
| |
| # TEST #8 |
| # For PR/1378: Target-specific vars don't inherit correctly |
| |
| $makefile2 = &get_tmpfile; |
| |
| open(MAKEFILE,"> $makefile2"); |
| print MAKEFILE <<'EOF'; |
| foo: FOO = foo |
| bar: BAR = bar |
| foo: bar |
| bar: baz |
| baz: ; @echo $(FOO) $(BAR) |
| EOF |
| close(MAKEFILE); |
| |
| &run_make_with_options("$makefile2", "", &get_logfile); |
| $answer = "foo bar\n"; |
| &compare_output($answer, &get_logfile(1)); |
| |
| # TEST #9 |
| # For PR/1380: Using += assignment in target-specific variables sometimes fails |
| |
| $makefile3 = &get_tmpfile; |
| |
| open(MAKEFILE,"> $makefile3"); |
| print MAKEFILE <<'EOF'; |
| .PHONY: all one |
| all: FOO += baz |
| all: one; @echo $(FOO) |
| |
| FOO = bar |
| |
| one: FOO += biz |
| one: ; @echo $(FOO) |
| EOF |
| close(MAKEFILE); |
| |
| &run_make_with_options("$makefile3", "", &get_logfile); |
| $answer = "bar baz biz\nbar baz\n"; |
| &compare_output($answer, &get_logfile(1)); |
| |
| &run_make_with_options("$makefile3", "one", &get_logfile); |
| $answer = "bar biz\n"; |
| &compare_output($answer, &get_logfile(1)); |
| |
| |
| 1; |