# -*-perl-*- $description = "Test define/endef variable assignments."; $details = ""; # TEST 0: old-style basic define/endef run_make_test(' define multi @echo hi echo there endef all: ; $(multi) ', '', "hi\necho there\nthere\n"); # TEST 1: Various new-style define/endef run_make_test(' FOO = foo define multi = echo hi @echo $(FOO) endef # this is the end define simple := @echo $(FOO) endef define posix ::= @echo $(FOO) endef append = @echo a define append += @echo b endef define cond ?= # this is a conditional @echo first endef define cond ?= @echo second endef FOO = there all: ; $(multi) $(simple) $(posix) $(append) $(cond) ', '', "echo hi\nhi\nthere\nfoo\nfoo\na\nb\nfirst\n"); # TEST 1a: Various new-style define/endef, with no spaces run_make_test(' FOO = foo define multi= echo hi @echo $(FOO) endef # this is the end define simple:= @echo $(FOO) endef define posix::= @echo $(FOO) endef append = @echo a define append+= @echo b endef define cond?= # this is a conditional @echo first endef define cond?= @echo second endef FOO = there all: ; $(multi) $(simple) $(posix) $(append) $(cond) ', '', "echo hi\nhi\nthere\nfoo\nfoo\na\nb\nfirst\n"); # TEST 2: define in true section of conditional (containing conditional) run_make_test(' FOO = foo NAME = def def = ifdef BOGUS define $(subst e,e,$(NAME)) = ifeq (1,1) FOO = bar endif endef endif $(eval $(def)) all: ; @echo $(FOO) ', 'BOGUS=1', "bar\n"); # TEST 3: define in false section of conditional (containing conditional) run_make_test(undef, '', "foo\n"); # TEST 4: nested define (supported?) run_make_test(' define outer define inner A = B endef endef $(eval $(outer)) outer: ; @echo $(inner) ', '', "A = B\n"); # TEST 5: NEGATIVE: Missing variable name run_make_test(' NAME = define $(NAME) = ouch endef all: ; @echo ouch ', '', "#MAKEFILE#:3: *** empty variable name. Stop.\n", 512); # TEST 6: NEGATIVE: extra text after define run_make_test(' NAME = define NAME = $(NAME) ouch endef all: ; @echo ok ', '', "#MAKEFILE#:3: extraneous text after 'define' directive\nok\n"); # TEST 7: NEGATIVE: extra text after endef run_make_test(' NAME = define NAME = ouch endef $(NAME) all: ; @echo ok ', '', "#MAKEFILE#:5: extraneous text after 'endef' directive\nok\n"); # TEST 8: NEGATIVE: missing endef run_make_test(' NAME = all: ; @echo ok define NAME = ouch endef$(NAME) ', '', "#MAKEFILE#:4: *** missing 'endef', unterminated 'define'. Stop.\n", 512); # ------------------------- # 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;