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