# -*-perl-*- $description = "Check GNU Make conditionals."; $details = "Attempt various different flavors of GNU Make conditionals."; run_make_test(q! arg1 = first arg2 = second arg3 = third arg4 = cc arg5 = second all: ifeq ($(arg1),$(arg2)) #TAB#@echo arg1 equals arg2 else #TAB#@echo arg1 NOT equal arg2 endif ifeq '$(arg2)' "$(arg5)" #TAB#@echo arg2 equals arg5 else #TAB#@echo arg2 NOT equal arg5 endif ifneq '$(arg3)' '$(arg4)' #TAB#@echo arg3 NOT equal arg4 else #TAB#@echo arg3 equal arg4 endif ifndef undefined #TAB#@echo variable is undefined else #TAB#@echo variable undefined is defined endif ifdef arg4 #TAB#@echo arg4 is defined else #TAB#@echo arg4 is NOT defined endif!, '', 'arg1 NOT equal arg2 arg2 equals arg5 arg3 NOT equal arg4 variable is undefined arg4 is defined'); # Test expansion of variables inside ifdef. run_make_test(q! foo = 1 FOO = foo F = f DEF = no DEF2 = no ifdef $(FOO) DEF = yes endif ifdef $(F)oo DEF2 = yes endif DEF3 = no FUNC = $1 ifdef $(call FUNC,DEF)3 DEF3 = yes endif all:; @echo DEF=$(DEF) DEF2=$(DEF2) DEF3=$(DEF3)!, '', 'DEF=yes DEF2=yes DEF3=yes'); # Test all the different "else if..." constructs run_make_test(q! arg1 = first arg2 = second arg3 = third arg4 = cc arg5 = fifth result = ifeq ($(arg1),$(arg2)) result += arg1 equals arg2 else ifeq '$(arg2)' "$(arg5)" result += arg2 equals arg5 else ifneq '$(arg3)' '$(arg3)' result += arg3 NOT equal arg4 else ifndef arg5 result += variable is undefined else ifdef undefined result += arg4 is defined else result += success endif all: ; @echo $(result)!, '', 'success'); # Test some random "else if..." construct nesting run_make_test(q! arg1 = first arg2 = second arg3 = third arg4 = cc arg5 = second ifeq ($(arg1),$(arg2)) $(info failed 1) else ifeq '$(arg2)' "$(arg2)" ifdef undefined $(info failed 2) else $(info success) endif else ifneq '$(arg3)' '$(arg3)' $(info failed 3) else ifdef arg5 $(info failed 4) else ifdef undefined $(info failed 5) else $(info failed 6) endif .PHONY: all all: ; @:!, '', 'success'); # SV 47960 : ensure variable assignments in non-taken legs don't cause problems run_make_test(q! ifneq ($(FOO),yes) target: else BAR = bar target: endif #TAB#@echo one !, '', "one\n"); # SV 64085: Ensure tab-prefixed conditional directives are warned about # In a future release these will become errors: according to the docs this # was never allowed, but unfortunately the code didn't check for it. my @defcond = ('ifdef', 'ifndef'); my @eqcond = ('ifeq', 'ifneq'); for my $d (@defcond) { run_make_test(qq! blah=1 #TAB#$d blah endif all:; !, '', "#MAKEFILE#:3: warning: conditional directive lines cannot start with TAB\n#MAKE#: 'all' is up to date."); } for my $d (@eqcond) { run_make_test(qq! blah=1 #TAB#$d (a,b) endif all:; !, '', "#MAKEFILE#:3: warning: conditional directive lines cannot start with TAB\n#MAKE#: 'all' is up to date."); } run_make_test(q! ifeq (a, b) #TAB## noop else #TAB#ifeq (a, b) #TAB##TAB## noop #TAB#endif endif all: #TAB#@echo foo !, '', "#MAKEFILE#:5: warning: conditional directive lines cannot start with TAB\n#MAKEFILE#:7: warning: conditional directive lines cannot start with TAB\nfoo"); run_make_test(q! all: $(info hello) ifdef blah junk: #TAB#else else endif !, '', "hello\n#MAKEFILE#:7: warning: conditional directive lines cannot start with TAB\n#MAKEFILE#:8: *** only one 'else' per conditional. Stop.", 512); run_make_test(q! blah=1 ifdef blah else #TAB#else endif all:; !, '', "#MAKEFILE#:5: warning: conditional directive lines cannot start with TAB\n#MAKEFILE#:5: *** only one 'else' per conditional. Stop.", 512); run_make_test(q! blah=1 ifdef blah else #TAB#endif endif all:; !, '', "#MAKEFILE#:5: warning: conditional directive lines cannot start with TAB\n#MAKEFILE#:6: *** extraneous 'endif'. Stop.", 512); run_make_test(q! blah=1 ifdef blah else #TAB#ifdef blah endif all:; !, '', "#MAKEFILE#:5: warning: conditional directive lines cannot start with TAB\n#MAKEFILE#:8: *** missing 'endif'. Stop.", 512); run_make_test(q! blah=1 all:; foo: ifdef blah #TAB#ifdef blah endif !, '', "#MAKE#: 'all' is up to date."); run_make_test(q! blah=1 all:; foo: ifdef blah #TAB#endif endif !, '', "#MAKE#: 'all' is up to date."); run_make_test(q! blah=1 all:; foo: ifdef blah #TAB#else else endif !, '', "#MAKE#: 'all' is up to date."); # SV 64402: parse braces in ifeq/ifneq properly run_make_test(q! ifeq ($(and a,b),) endif ifeq (${and a,b},) endif ifeq (${and $(x),${or $(z),${q}}},) endif ifeq (${and ),(},) endif ifeq ($(and },{),) endif # We can hide the comma in a variable C = , ifeq ((and a$Cb),) endif all:; !, '', "#MAKE#: 'all' is up to date."); # The "," in "$," is a variable name not a comma run_make_test(q! ifeq ($,,) $(info ok) endif all:; !, '', "ok\n#MAKE#: 'all' is up to date."); # Without variable references we don't do anything special with parens run_make_test(q! ifeq ((and a,b),) endif all:; !, '', "#MAKEFILE#:2: extraneous text after 'ifeq' directive\n#MAKE#: 'all' is up to date."); # This tells the test driver that the perl test script executed properly. 1;