| # -*-perl-*- | |
| # $Id$ | |
| $description = "Test the foreach function."; | |
| $details = "This is a test of the foreach function in gnu make. | |
| This function starts with a space separated list of | |
| names and a variable. Each name in the list is substituted | |
| into the variable and the given text evaluated. The general | |
| form of the command is $(foreach var,\$list,\$text). Several | |
| types of foreach loops are tested\n"; | |
| # TEST 0 | |
| # Set an environment variable that we can test in the makefile. | |
| $ENV{FOOFOO} = 'foo foo'; | |
| run_make_test("space = ' '".' | |
| null := | |
| auto_var = udef space CC null FOOFOO MAKE foo CFLAGS WHITE @ < | |
| foo = bletch null @ garf | |
| av = $(foreach var, $(auto_var), $(origin $(var)) ) | |
| override WHITE := BLACK | |
| for_var = $(addsuffix .c,foo $(null) $(foo) $(space) $(av) ) | |
| fe = $(foreach var2, $(for_var),$(subst .c,.o, $(var2) ) ) | |
| all: auto for2 | |
| auto : ; @echo $(av) | |
| for2: ; @echo $(fe)', | |
| '-e WHITE=WHITE CFLAGS=', | |
| "undefined file default file environment override default file command line override automatic automatic | |
| foo.o bletch.o null.o @.o garf.o .o .o undefined.o file.o default.o file.o environment.o override.o default.o file.o command.o line.o override.o automatic.o automatic.o"); | |
| # TEST 1: Test that foreach variables take precedence over global | |
| # variables in a global scope (like inside an eval). Tests bug #11913 | |
| run_make_test(' | |
| .PHONY: all target | |
| all: target | |
| x := BAD | |
| define mktarget | |
| target: x := $(x) | |
| target: ; @echo "$(x)" | |
| endef | |
| x := GLOBAL | |
| $(foreach x,FOREACH,$(eval $(value mktarget)))', | |
| '', | |
| 'FOREACH'); | |
| # Allow variable names with trailing space | |
| run_make_test(q! | |
| $(foreach \ | |
| a \ | |
| , b c d \ | |
| , $(info $a)) | |
| all:;@: | |
| !, | |
| "", "b\nc\nd\n"); | |
| # Allow empty variable names. We still expand the body. | |
| run_make_test(' | |
| x = $(foreach ,1 2 3,a) | |
| y := $x | |
| all: ; @echo $y', | |
| '', "a a a\n"); | |
| # Check some error conditions. | |
| run_make_test(' | |
| x = $(foreach ) | |
| y = $x | |
| all: ; @echo $y', | |
| '', | |
| "#MAKEFILE#:2: *** insufficient number of arguments (1) to function 'foreach'. Stop.", | |
| 512); | |
| run_make_test(' | |
| x = $(foreach x,y) | |
| y := $x | |
| all: ; @echo $y', | |
| '', | |
| "#MAKEFILE#:2: *** insufficient number of arguments (2) to function 'foreach'. Stop.", | |
| 512); | |
| 1; |