| # -*-perl-*- |
| |
| $description = "Test define/endef variable assignments."; |
| |
| $details = ""; |
| |
| # old-style basic define/endef |
| |
| run_make_test(' |
| define multi |
| @echo hi |
| echo there |
| endef |
| |
| all: ; $(multi) |
| ', |
| '', "hi\necho there\nthere\n"); |
| |
| # 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) |
| #TAB#$(simple) |
| #TAB#$(posix) |
| #TAB#$(append) |
| #TAB#$(cond) |
| ', |
| '', "echo hi\nhi\nthere\nfoo\nfoo\na\nb\nfirst\n"); |
| |
| # Various new-style define/endef, with no spaces |
| |
| run_make_test(q! |
| FOO = foo |
| |
| define multi= |
| echo hi |
| @echo $(FOO) |
| endef # this is the end |
| |
| define simple:= |
| @echo $(FOO) |
| endef |
| |
| define posix::= |
| @echo $(FOO) |
| endef |
| |
| define posixbsd:::= |
| @echo '$(FOO)$$bar' |
| 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) |
| #TAB#$(simple) |
| #TAB#$(posix) |
| #TAB#$(posixbsd) |
| #TAB#$(append) |
| #TAB#$(cond) |
| !, |
| '', "echo hi\nhi\nthere\nfoo\nfoo\nfoo\$bar\na\nb\nfirst\n"); |
| |
| # 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"); |
| |
| # define in false section of conditional (containing conditional) |
| |
| run_make_test(undef, '', "foo\n"); |
| |
| # nested define (supported?) |
| |
| run_make_test(' |
| define outer |
| define inner |
| A = B |
| endef |
| endef |
| |
| $(eval $(outer)) |
| |
| outer: ; @echo $(inner) |
| ', |
| '', "A = B\n"); |
| |
| # NEGATIVE: Missing variable name |
| |
| run_make_test(' |
| NAME = |
| define $(NAME) = |
| ouch |
| endef |
| all: ; @echo ouch |
| ', |
| '', "#MAKEFILE#:3: *** empty variable name. Stop.\n", 512); |
| |
| # 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"); |
| |
| # 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"); |
| |
| # 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. |
| |
| run_make_test(' |
| define FOO |
| $(V1)echo hello |
| $(V2)echo world |
| endef |
| all: ; @$(FOO) |
| ', '', 'hello |
| world'); |
| |
| run_make_test(undef, 'V1=@ V2=@', 'hello |
| world'); |
| |
| run_make_test(' |
| define FOO |
| $(V1)echo hello |
| $(V2)echo world |
| endef |
| all: ; $(FOO) |
| ', 'V1=@', 'hello |
| echo world |
| world'); |
| |
| run_make_test(undef, 'V2=@', 'echo hello |
| hello |
| world'); |
| |
| run_make_test(undef, 'V1=@ V2=@', 'hello |
| world'); |
| |
| # 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 |
| '); |
| |
| # Ensure that define can be a target when not appearing in a variable |
| # definition context. See SV 59870 |
| |
| run_make_test(q! |
| define = define |
| |
| $(define) : ;@echo $@ |
| |
| %:define |
| |
| all: define foo |
| |
| %.x : define |
| |
| foo:; |
| !, |
| '', "define\n"); |
| |
| # Verify that define indented by TAB is warned about. |
| # This will be an error in future versions. |
| |
| run_make_test(q! |
| #TAB#define foo |
| @echo foo |
| endef |
| |
| all:;$(foo) |
| !, |
| '', "#MAKEFILE#:2: warning: directive lines cannot start with TAB\nfoo\n"); |
| |
| # The failure doesn't happen at define time for nested defines, it happens |
| # at eval time |
| |
| run_make_test(q! |
| foo = echo foo |
| |
| define bar |
| #TAB#define foo |
| #TAB# echo bar |
| #TAB#endef |
| endef |
| |
| all:;@$(foo) |
| !, |
| '', "foo\n"); |
| |
| run_make_test(q! |
| foo = echo foo |
| |
| define bar |
| #TAB#define foo |
| #TAB# echo bar |
| #TAB#endef |
| endef |
| |
| $(eval $(bar)) |
| |
| all:;@echo foo |
| !, |
| '', "#MAKEFILE#:10: warning: directive lines cannot start with TAB\n#MAKEFILE#:10: *** missing 'endef', unterminated 'define'. Stop.\n", |
| 512); |
| |
| # endef indented by TAB is an error; this has always been true! |
| |
| run_make_test(q! |
| define foo |
| @echo foo |
| #TAB#endef |
| |
| all:;$(foo) |
| !, |
| '', "#MAKEFILE#:2: *** missing 'endef', unterminated 'define'. Stop.\n", 512); |
| |
| 1; |