# -*-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;