| # -*-perl-*- | |
| # $Id$ | |
| $description = "Test the let function."; | |
| $details = "This is a test of the let function in gnu make. | |
| This function destructures a list of values and binds each | |
| value to a variable name in a list of variable names. | |
| Superfluous variable names are assigned the empty string and | |
| the remaining values are assigned to the last variable name. | |
| The binding holds for the duration of the evaluation of the | |
| given text and no longer. The general form of the command | |
| is $(let \$vars,\$list,\$text). Several types of let | |
| assignments are tested\n"; | |
| # check for mismatched var and list word counts | |
| run_make_test(q! | |
| a = bad | |
| b = news | |
| x = $(let a b,1 2,$a $b) | |
| y = $(let a,1 2,$a) | |
| z = $(let a b,1,$a $b) | |
| all:;@echo 'a=,$a,' 'b=,$b,' 'x=,$x,' 'y=,$y,' 'z=,$z,' | |
| !, | |
| '', "a=,bad, b=,news, x=,1 2, y=,1 2, z=,1 ,\n"); | |
| # check for whitespace | |
| run_make_test(q! | |
| a = bad | |
| b = news | |
| x = $(let a b, 1 2 ,+$a+$b+) | |
| y = $(let a, 1 2 ,+$a+) | |
| z = $(let a b, 1 ,+$a+$b+) | |
| all:;@echo 'a=,$a,' 'b=,$b,' 'x=,$x,' 'y=,$y,' 'z=,$z,' | |
| !, | |
| '', "a=,bad, b=,news, x=,+1+2 +, y=,+1 2 +, z=,+1++,\n"); | |
| # Allow empty variable names and empty value list. | |
| # We still expand the list and body. | |
| run_make_test(' | |
| null = | |
| v = $(let ,$(info blankvar),abc) | |
| x = $(let $(null),$(info side-effect),abc) | |
| y = $(let y,,$ydef) | |
| z = $(let a b, ,+$a+$b+) | |
| all: ; @echo $v/$x/$y/$z', | |
| '', "blankvar\nside-effect\nabc/abc/def/+++\n"); | |
| # The example macro from the manual. | |
| run_make_test(' | |
| reverse = $(let first rest,$1,$(if $(rest),$(call reverse,$(rest)) )$(first)) | |
| all: ; @echo $(call reverse, \ | |
| moe miny meeny eeny \ | |
| )', | |
| '', "eeny meeny miny moe\n"); | |
| # Set an environment variable that we can test in the makefile. | |
| $ENV{FOOFOO} = 'foo foo'; | |
| # Verify masking: expansion outside the scope of let is unaffected. | |
| run_make_test(' | |
| auto_var = \ | |
| udef \ | |
| CC \ | |
| FOOFOO \ | |
| MAKE \ | |
| foo \ | |
| CFLAGS \ | |
| WHITE \ | |
| @ \ | |
| < | |
| av = $(foreach var, $(auto_var), $(origin $(var)) ) | |
| foo = bletch null @ garf | |
| override WHITE := BLACK | |
| define mktarget | |
| target: foo := $(foo) | |
| target: ; @echo $(AR)_$(foo)_ | |
| endef | |
| all: auto target | |
| auto: ; @echo $(let $(auto_var),,$(av)) $(av) | |
| $(let AR foo,bar foo ,$(eval $(value mktarget)))', | |
| '-e WHITE=WHITE CFLAGS=', | |
| "automatic automatic automatic automatic automatic automatic automatic automatic automatic undefined default environment override default file command line override automatic automatic | |
| ar_foo _ | |
| "); | |
| # Check some error conditions. | |
| run_make_test(' | |
| x = $(let ) | |
| y = $x | |
| all: ; @echo $y', | |
| '', | |
| "#MAKEFILE#:2: *** insufficient number of arguments (1) to function 'let'. Stop.", | |
| 512); | |
| run_make_test(' | |
| x = $(let x,y) | |
| y := $x | |
| all: ; @echo $y', | |
| '', | |
| "#MAKEFILE#:2: *** insufficient number of arguments (2) to function 'let'. Stop.", | |
| 512); | |
| 1; |