| # -*-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 subsituted |
| 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. |
| $extraENV{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 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 default.o file.o command.o line.o override.o automatic.o automatic.o"); |
| |
| delete $extraENV{FOOFOO}; |
| |
| # 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; |