cond-func-empty.mk revision 1.3
1# $NetBSD: cond-func-empty.mk,v 1.3 2020/09/03 17:13:42 rillig Exp $ 2# 3# Tests for the empty() function in .if conditions, which tests a variable 4# expression for emptiness. 5# 6# Note that the argument in the parentheses is indeed a variable name, 7# optionally followed by variable modifiers. This is like the defined() 8# function. 9# 10 11.undef UNDEF 12EMPTY= # empty 13SPACE= ${:U } 14WORD= word 15 16# An undefined variable is empty. 17.if !empty(UNDEF) 18. error 19.endif 20 21# An undefined variable has the empty string as the value, and the :M 22# variable modifier does not change that. 23# 24.if !empty(UNDEF:M*) 25. error 26.endif 27 28# The :S modifier replaces the empty value with an actual word, and 29# after that the expression is no longer empty. Because the variable 30# was undefined in the first place, the expression has the flag VAR_JUNK 31# but not VAR_KEEP, therefore it is still considered undefined. 32# 33# XXX: This is hard to explain to someone who doesn't know these 34# implementation details. 35# 36.if !empty(UNDEF:S,^$,value,W) 37. error 38.endif 39 40# The :U modifier modifies expressions based on undefined variables 41# (VAR_JUNK) by adding the VAR_KEEP flag, which marks the expression 42# as "being interesting enough to be further processed". 43# 44.if empty(UNDEF:S,^$,value,W:Ufallback) 45. error 46.endif 47 48# And now to the surprising part. Applying the following :S modifier to the 49# undefined variable makes it non-empty, but the marker VAR_JUNK is preserved 50# nevertheless. The :U modifier that follows only looks at VAR_JUNK to decide 51# whether the variable is defined or not. This kind of makes sense since the 52# :U modifier tests the _variable_, not the _expression_. 53# 54# But since the variable was undefined to begin with, the fallback value is 55# used in this expression. 56# 57.if ${UNDEF:S,^$,value,W:Ufallback} != "fallback" 58. error 59.endif 60 61# The variable EMPTY is completely empty (0 characters). 62.if !empty(EMPTY) 63. error 64.endif 65 66# The variable SPACE has a single space, which counts as being empty. 67.if !empty(SPACE) 68. error 69.endif 70 71# The variable .newline has a single newline, which counts as being empty. 72.if !empty(.newline) 73. error 74.endif 75 76# The empty variable named "" gets a fallback value of " ", which counts as 77# empty. 78# 79# Contrary to the other functions in conditionals, the trailing space is not 80# stripped off, as can be seen in the -dv debug log. If the space had been 81# stripped, it wouldn't make a difference in this case. 82# 83.if !empty(:U ) 84. error 85.endif 86 87# Now the variable named " " gets a non-empty value, which demonstrates that 88# neither leading nor trailing spaces are trimmed in the argument of the 89# function. If the spaces were trimmed, the variable name would be "" and 90# that variable is indeed undefined. Since get_mpt_arg calls Var_Parse 91# without VARE_UNDEFERR, the value of the undefined variable is returned as 92# an empty string. 93${:U }= space 94.if empty( ) 95. error 96.endif 97 98# The value of the following expression is " word", which is not empty. 99.if empty(:U word) 100. error 101.endif 102 103# The :L modifier creates a variable expression that has the same value as 104# its name, which both are "VAR" in this case. The value is therefore not 105# empty. 106.if empty(VAR:L) 107. error 108.endif 109 110# The variable WORD has the value "word", which does not count as empty. 111.if empty(WORD) 112. error 113.endif 114 115# The expression ${} for a variable with the empty name always evaluates 116# to an empty string (see Var_Parse, varNoError). 117.if !empty() 118. error 119.endif 120 121all: 122 @:; 123