1 # $Id: varmisc.mk,v 1.23 2021/02/05 20:02:30 sjg Exp $
2 # $NetBSD: varmisc.mk,v 1.30 2021/02/04 21:42:47 rillig Exp $
4 # Miscellaneous variable tests.
6 all: unmatched_var_paren D_true U_true D_false U_false Q_lhs Q_rhs NQ_none \
11 all: varerror-unclosed
14 @echo ${foo::=foo-text}
16 True= ${echo true >&2:L:sh}TRUE
17 False= ${echo false >&2:L:sh}FALSE
23 @echo :U skipped when var set
24 @echo ${VSET:U${False}}
27 @echo :D skipped if var undef
28 @echo ${UNDEF:D${False}}
31 @echo :U expanded when var undef
32 @echo ${UNDEF:U${True}}
35 @echo :D expanded when var set
36 @echo ${VSET:D${True}}
39 @echo :? only lhs when value true
40 @echo ${1:L:?${True}:${False}}
43 @echo :? only rhs when value false
44 @echo ${0:L:?${True}:${False}}
47 @echo do not evaluate or expand :? if discarding
48 @echo ${VSET:U${1:L:?${True}:${False}}}
52 # slightly contorted syntax to use utc via variable
54 @echo ${year=%Y month=%m day=%d:L:gmtime=1459494000}
55 @echo date=${%Y%m%d:L:${gmtime=${April1}:L}}
57 # big jumps to handle 3 digits per step
58 M_cmpv.units= 1 1000 1000000
59 M_cmpv= S,., ,g:_:range:@i@+ $${_:[-$$i]} \* $${M_cmpv.units:[$$i]}@:S,^,expr 0 ,1:sh
62 cmpv.only= target specific vars
65 @echo Version=${Version} == ${Version:${M_cmpv}}
66 @echo Literal=3.4.5 == ${3.4.5:L:${M_cmpv}}
67 @echo We have ${${.TARGET:T}.only}
69 # catch misshandling of nested vars in .for loop
73 . if defined(MAN$s) && !empty(MAN$s)
81 # begin .MAKE.SAVE_DOLLARS; see Var_SetWithFlags and ParseBoolean.
82 SD_VALUES= 0 1 2 False True false true Yes No yes no On Off ON OFF on off
85 .for val in ${SD_VALUES}
86 .MAKE.SAVE_DOLLARS:= ${val} # Must be := since a simple = has no effect.
87 SD.${val}:= ${SD_4_DOLLARS}
89 .MAKE.SAVE_DOLLARS:= yes
92 .for val in ${SD_VALUES}
93 @printf '%s: %-8s = %s\n' $@ ${val} ${SD.${val}:Q}
96 # Appending to an undefined variable does not add a space in front.
99 .if ${APPENDED} != "value"
100 . error "${APPENDED}"
103 # Appending to an empty variable adds a space between the old value
104 # and the additional value.
107 .if ${APPENDED} != " value"
108 . error "${APPENDED}"
111 # Appending to parameterized variables works as well.
115 .if ${VAR.param} != "1 2"
116 . error "${VAR.param}"
119 # The variable name can contain arbitrary characters.
120 # If the expanded variable name ends in a +, this still does not influence
121 # the parser. The assignment operator is still a simple assignment.
122 # Therefore, there is no need to add a space between the variable name
123 # and the assignment operator.
127 .if ${VAR.+} != "1 2"
131 VAR.${param}= ${param}
133 .if ${VAR.+} != "+" || ${VAR.!} != "!" || ${VAR.?} != "?"
134 . error "${VAR.+}" "${VAR.!}" "${VAR.?}"
137 # Appending to a variable from the environment creates a copy of that variable
138 # in the global scope.
139 # The appended value is not exported automatically.
140 # When a variable is exported, the exported value is taken at the time of the
141 # .export directive. Later changes to the variable have no effect.
142 .export FROM_ENV_BEFORE
146 .export FROM_ENV_AFTER
149 @echo $@: "$$FROM_ENV"
150 @echo $@: "$$FROM_ENV_BEFORE"
151 @echo $@: "$$FROM_ENV_AFTER"
153 # begin parse-dynamic
155 # Demonstrate that the target-specific variables are not evaluated in
156 # the global scope. Their expressions are preserved until there is a local
157 # scope in which resolving them makes sense.
159 # There are different code paths for short names ...
167 # ... and for braced short names ...
173 # ... and for long names.
174 GL_TARGET:= ${.TARGET}
175 GL_MEMBER:= ${.MEMBER}
176 GL_PREFIX:= ${.PREFIX}
177 GL_ARCHIVE:= ${.ARCHIVE}
178 GL_ALLSRC:= ${.ALLSRC}
181 @echo $@: ${GS_TARGET} ${GS_MEMBER} ${GS_PREFIX} ${GS_ARCHIVE} ${GS_ALLSRC}
182 @echo $@: ${GB_TARGET} ${GB_MEMBER} ${GB_PREFIX} ${GB_ARCHIVE} ${GB_ALLSRC}
183 @echo $@: ${GL_TARGET} ${GL_MEMBER} ${GL_PREFIX} ${GL_ARCHIVE} ${GL_ALLSRC}
185 # Since 2020-07-28, make complains about unclosed variables.
186 # Before that, it had complained about unclosed variables only when
187 # parsing the modifiers, but not when parsing the variable name.
189 UNCLOSED_INDIR_1= ${UNCLOSED_ORIG
190 UNCLOSED_INDIR_2= ${UNCLOSED_INDIR_1}
193 FLAGS+= ${FLAGS.${.ALLSRC:M*.c:T:u}}
194 FLAGS.target2.c= three four
199 all: target1-flags target2-flags
200 target1-flags: target1.c
201 @echo $@: we have: ${FLAGS}
203 target2-flags: target2.c
204 @echo $@: we have: ${FLAGS}
211 @echo ${UNCLOSED:M${PATTERN
212 @echo ${UNCLOSED.${param
215 @echo ${UNCLOSED.${i}
217 @echo ${UNCLOSED_INDIR_2}