diff options
Diffstat (limited to 'unit-tests/dep-var.mk')
-rwxr-xr-x | unit-tests/dep-var.mk | 63 |
1 files changed, 59 insertions, 4 deletions
diff --git a/unit-tests/dep-var.mk b/unit-tests/dep-var.mk index b0ce4b2c53ae..438a8a84a60d 100755 --- a/unit-tests/dep-var.mk +++ b/unit-tests/dep-var.mk @@ -1,4 +1,4 @@ -# $NetBSD: dep-var.mk,v 1.1 2020/08/22 16:51:26 rillig Exp $ +# $NetBSD: dep-var.mk,v 1.5 2020/09/13 20:04:26 rillig Exp $ # # Tests for variable references in dependency declarations. # @@ -17,7 +17,7 @@ all: ${UNDEF1} # # At the point where the expression ${DEF2} is expanded, the variable DEF2 # is defined, so everything's fine. -all: $${DEF2} +all: $${DEF2} a-$${DEF2}-b # This variable is not defined at all. # XXX: The -dv log says: @@ -26,8 +26,63 @@ all: $${DEF2} # The variable expression ${UNDEF3} simply expands to an empty string. all: $${UNDEF3} +# Try out how many levels of indirection are really expanded in dependency +# lines. +# +# The first level of indirection is the $$ in the dependency line. +# When the dependency line is parsed, it is resolved to the string +# "${INDIRECT_1}". At this point, the dollar is just an ordinary character, +# waiting to be expanded at some later point. +# +# Later, in SuffExpandChildren, that expression is expanded again by calling +# Var_Parse, and this time, the result is the string "1-2-${INDIRECT_2}-2-1". +# +# This string is not expanded anymore by Var_Parse. But there is another +# effect. Now DirExpandCurly comes into play and expands the curly braces +# in this filename pattern, resulting in the string "1-2-$INDIRECT_2-2-1". +# As of 2020-09-03, the test dir.mk contains further details on this topic. +# +# Finally, this string is assigned to the local ${.TARGET} variable. This +# variable is expanded when the shell command is generated. At that point, +# the $I is expanded. Since the variable I is not defined, it expands to +# the empty string. This way, the final output is the string +# "1-2-NDIRECT_2-2-1", which differs from the actual name of the target. +# For exactly this reason, it is not recommended to use dollar signs in +# target names. +# +# The number of actual expansions is way more than one might expect, +# therefore this feature is probably not widely used. +# +all: 1-$${INDIRECT_1}-1 +INDIRECT_1= 2-$${INDIRECT_2}-2 +INDIRECT_2= 3-$${INDIRECT_3}-3 +INDIRECT_3= indirect + UNDEF1= undef1 DEF2= def2 -undef1 def2: - @echo ${.TARGET} +# Cover the code in SuffExpandChildren that deals with malformed variable +# expressions. +# +# This seems to be an edge case that never happens in practice, and it would +# probably be appropriate to just error out in such a case. +# +# To trigger this piece of code, the variable name must contain "$)" or "$:" +# or "$)" or "$$". Using "$:" does not work since the dependency line is +# fully expanded before parsing, therefore any ':' in a target or source name +# would be interpreted as a dependency operator instead. +all: $$$$) + +# The $$INDIRECT in the following line is treated like the dependency of the +# "all" target, that is, the "$$I" is first expanded to "$I", and in a second +# round of expansion, the "$I" expands to nothing since the variable "I" is +# undefined. +# +# Since 2020-09-13, this generates a parse error in lint mode (-dL), but not +# in normal mode since ParseDoDependency does not handle any errors after +# calling Var_Parse. +undef1 def2 a-def2-b 1-2-$$INDIRECT_2-2-1 ${:U\$)}: + @echo ${.TARGET:Q} + +# XXX: Why is the exit status still 0, even though Parse_Error is called +# with PARSE_FATAL in SuffExpandChildren? |