| # -*-perl-*- |
| |
| $description = "Test various flavors of make variable setting."; |
| |
| $details = ""; |
| |
| open(MAKEFILE, "> $makefile"); |
| |
| # The Contents of the MAKEFILE ... |
| |
| print MAKEFILE <<'EOF'; |
| foo = $(bar) |
| bar = ${ugh} |
| ugh = Hello |
| |
| all: multi ; @echo $(foo) |
| |
| multi: ; $(multi) |
| |
| x := foo |
| y := $(x) bar |
| x := later |
| |
| nullstring := |
| space := $(nullstring) $(nullstring) |
| |
| next: ; @echo $x$(space)$y |
| |
| define multi |
| @echo hi |
| echo there |
| endef |
| |
| ifdef BOGUS |
| define |
| @echo error |
| endef |
| endif |
| |
| define outer |
| define inner |
| A = B |
| endef |
| endef |
| |
| $(eval $(outer)) |
| |
| outer: ; @echo $(inner) |
| |
| EOF |
| |
| # END of Contents of MAKEFILE |
| |
| close(MAKEFILE); |
| |
| # TEST #1 |
| # ------- |
| |
| &run_make_with_options($makefile, "", &get_logfile); |
| $answer = "hi\necho there\nthere\nHello\n"; |
| &compare_output($answer, &get_logfile(1)); |
| |
| # TEST #2 |
| # ------- |
| |
| &run_make_with_options($makefile, "next", &get_logfile); |
| $answer = "later foo bar\n"; |
| &compare_output($answer, &get_logfile(1)); |
| |
| # TEST #3 |
| # ------- |
| |
| &run_make_with_options($makefile, "BOGUS=true", &get_logfile, 512); |
| $answer = "$makefile:24: *** empty variable name. Stop.\n"; |
| &compare_output($answer, &get_logfile(1)); |
| |
| # TEST #4 |
| # ------- |
| |
| &run_make_with_options($makefile, "outer", &get_logfile); |
| $answer = "A = B\n"; |
| &compare_output($answer, &get_logfile(1)); |
| |
| # Clean up from "old style" testing. If all the above tests are converted to |
| # run_make_test() syntax than this line can be removed. |
| $makefile = undef; |
| |
| # ------------------------- |
| # Make sure that prefix characters apply properly to define/endef values. |
| # |
| # There's a bit of oddness here if you try to use a variable to hold the |
| # prefix character for a define. Even though something like this: |
| # |
| # define foo |
| # echo bar |
| # endef |
| # |
| # all: ; $(V)$(foo) |
| # |
| # (where V=@) can be seen by the user to be obviously different than this: |
| # |
| # define foo |
| # $(V)echo bar |
| # endef |
| # |
| # all: ; $(foo) |
| # |
| # and the user thinks it should behave the same as when the "@" is literal |
| # instead of in a variable, that can't happen because by the time make |
| # expands the variables for the command line and sees it begins with a "@" it |
| # can't know anymore whether the prefix character came before the variable |
| # reference or was included in the first line of the variable reference. |
| |
| # TEST #5 |
| # ------- |
| |
| run_make_test(' |
| define FOO |
| $(V1)echo hello |
| $(V2)echo world |
| endef |
| all: ; @$(FOO) |
| ', '', 'hello |
| world'); |
| |
| # TEST #6 |
| # ------- |
| |
| run_make_test(undef, 'V1=@ V2=@', 'hello |
| world'); |
| |
| # TEST #7 |
| # ------- |
| |
| run_make_test(' |
| define FOO |
| $(V1)echo hello |
| $(V2)echo world |
| endef |
| all: ; $(FOO) |
| ', 'V1=@', 'hello |
| echo world |
| world'); |
| |
| # TEST #8 |
| # ------- |
| |
| run_make_test(undef, 'V2=@', 'echo hello |
| hello |
| world'); |
| |
| # TEST #9 |
| # ------- |
| |
| run_make_test(undef, 'V1=@ V2=@', 'hello |
| world'); |
| |
| # TEST #10 |
| # ------- |
| # Test the basics; a "@" internally to the variable applies to only one line. |
| # A "@" before the variable applies to the entire variable. |
| |
| run_make_test(' |
| define FOO |
| @echo hello |
| echo world |
| endef |
| define BAR |
| echo hello |
| echo world |
| endef |
| |
| all: foo bar |
| foo: ; $(FOO) |
| bar: ; @$(BAR) |
| ', '', 'hello |
| echo world |
| world |
| hello |
| world |
| '); |
| |
| 1; |