1# $NetBSD: directive-for.mk,v 1.2 2020/09/02 22:58:59 rillig Exp $ 2# 3# Tests for the .for directive. 4 5# Using the .for loop, lists of values can be produced. 6# In simple cases, the :@var@${var}@ variable modifier can be used to 7# reach the same effects. 8# 9.undef NUMBERS 10.for num in 1 2 3 11NUMBERS+= ${num} 12.endfor 13.if ${NUMBERS} != "1 2 3" 14. error 15.endif 16 17# The .for loop also works for multiple iteration variables. 18.for name value in VARNAME value NAME2 value2 19${name}= ${value} 20.endfor 21.if ${VARNAME} != "value" || ${NAME2} != "value2" 22. error 23.endif 24 25# The .for loop splits the items at whitespace, taking quotes into account, 26# just like the :M or :S variable modifiers. 27# 28# Until 2012-06-03, it had split the items exactly at whitespace, without 29# taking the quotes into account. 30# 31.undef WORDS 32.for var in one t\ w\ o "three three" 'four four' `five six` 33WORDS+= counted 34.endfor 35.if ${WORDS:[#]} != 6 36. error 37.endif 38 39# In the body of the .for loop, the iteration variables can be accessed 40# like normal variables, even though they are not really variables. 41# 42# Instead, the expression ${var} is transformed into ${:U1}, ${:U2} and so 43# on, before the loop body is evaluated. 44# 45# A notable effect of this implementation technique is that the .for 46# iteration variables and the normal global variables live in separate 47# namespaces and do not influence each other. 48# 49var= value before 50var2= value before 51.for var var2 in 1 2 3 4 52.endfor 53.if ${var} != "value before" 54. warning After the .for loop, var must still have its original value. 55.endif 56.if ${var2} != "value before" 57. warning After the .for loop, var2 must still have its original value. 58.endif 59 60# Everything from the paragraph above also applies if the loop body is 61# empty, even if there is no actual iteration since the loop items are 62# also empty. 63# 64var= value before 65var2= value before 66.for var var2 in ${:U} 67.endfor 68.if ${var} != "value before" 69. warning After the .for loop, var must still have its original value. 70.endif 71.if ${var2} != "value before" 72. warning After the .for loop, var2 must still have its original value. 73.endif 74 75# Until 2008-12-21, the values of the iteration variables were simply 76# inserted as plain text and then parsed as usual, which made it possible 77# to achieve all kinds of strange effects. 78# 79# Before that date, the .for loop expanded to: 80# EXPANSION+= value 81# Since that date, the .for loop expands to: 82# EXPANSION${:U+}= value 83# 84EXPANSION= before 85EXPANSION+ = before 86.for plus in + 87EXPANSION${plus}= value 88.endfor 89.if ${EXPANSION} != "before" 90. error This must be a make from before 2009. 91.endif 92.if ${EXPANSION+} != "value" 93. error This must be a make from before 2009. 94.endif 95 96all: 97 @:; 98