Home | History | Annotate | Download | only in functions
      1 #                                                                    -*-perl-*-
      2 # $Id: foreach,v 1.5 2006/03/10 02:20:46 psmith Exp $
      3 
      4 $description = "Test the foreach function.";
      5 
      6 $details = "This is a test of the foreach function in gnu make.
      7 This function starts with a space separated list of
      8 names and a variable. Each name in the list is subsituted
      9 into the variable and the given text evaluated. The general
     10 form of the command is $(foreach var,$list,$text). Several
     11 types of foreach loops are tested\n";
     12 
     13 
     14 # TEST 0
     15 
     16 # Set an environment variable that we can test in the makefile.
     17 $extraENV{FOOFOO} = 'foo foo';
     18 
     19 run_make_test("space = ' '".'
     20 null :=
     21 auto_var = udef space CC null FOOFOO MAKE foo CFLAGS WHITE @ <
     22 foo = bletch null @ garf
     23 av = $(foreach var, $(auto_var), $(origin $(var)) )
     24 override WHITE := BLACK
     25 for_var = $(addsuffix .c,foo $(null) $(foo) $(space) $(av) )
     26 fe = $(foreach var2, $(for_var),$(subst .c,.o, $(var2) ) )
     27 all: auto for2
     28 auto : ; @echo $(av)
     29 for2: ; @echo $(fe)',
     30               '-e WHITE=WHITE CFLAGS=',
     31               "undefined file default file environment default file command line override automatic automatic
     32 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");
     33 
     34 delete $extraENV{FOOFOO};
     35 
     36 # TEST 1: Test that foreach variables take precedence over global
     37 # variables in a global scope (like inside an eval).  Tests bug #11913
     38 
     39 run_make_test('
     40 .PHONY: all target
     41 all: target
     42 
     43 x := BAD
     44 
     45 define mktarget
     46 target: x := $(x)
     47 target: ; @echo "$(x)"
     48 endef
     49 
     50 x := GLOBAL
     51 
     52 $(foreach x,FOREACH,$(eval $(value mktarget)))',
     53               '',
     54               'FOREACH');
     55 
     56 
     57 # TEST 2: Check some error conditions.
     58 
     59 run_make_test('
     60 x = $(foreach )
     61 y = $x
     62 
     63 all: ; @echo $y',
     64               '',
     65               "#MAKEFILE#:2: *** insufficient number of arguments (1) to function `foreach'.  Stop.",
     66               512);
     67 
     68 run_make_test('
     69 x = $(foreach )
     70 y := $x
     71 
     72 all: ; @echo $y',
     73               '',
     74               "#MAKEFILE#:2: *** insufficient number of arguments (1) to function `foreach'.  Stop.",
     75               512);
     76 
     77 1;
     78