diff options
Diffstat (limited to 'unit-tests/varname-dot-make-save_dollars.mk')
-rw-r--r-- | unit-tests/varname-dot-make-save_dollars.mk | 130 |
1 files changed, 126 insertions, 4 deletions
diff --git a/unit-tests/varname-dot-make-save_dollars.mk b/unit-tests/varname-dot-make-save_dollars.mk index 97f37a646d2d..31f228c220b2 100644 --- a/unit-tests/varname-dot-make-save_dollars.mk +++ b/unit-tests/varname-dot-make-save_dollars.mk @@ -1,8 +1,130 @@ -# $NetBSD: varname-dot-make-save_dollars.mk,v 1.2 2020/08/16 14:25:16 rillig Exp $ +# $NetBSD: varname-dot-make-save_dollars.mk,v 1.7 2021/12/03 18:43:52 rillig Exp $ # -# Tests for the special .MAKE.SAVE_DOLLARS variable. +# Tests for the special .MAKE.SAVE_DOLLARS variable, which controls whether +# the assignment operator ':=' converts '$$' to a single '$' or keeps it +# as-is. +# +# See also: +# var-op-expand.mk for ':=' in general +# varmisc.mk for parsing the boolean values + +# Initially, the variable .MAKE.SAVE_DOLLARS is undefined. At this point the +# behavior of the assignment operator ':=' depends. NetBSD's usr.bin/make +# preserves the '$$' as-is, while the bmake distribution replaces '$$' with +# '$'. +.if ${.MAKE.SAVE_DOLLARS:Uundefined} != "undefined" +. error +.endif + + +# When dollars are preserved, this setting not only applies to literal +# dollars, but also to those that come indirectly from other expressions. +DOLLARS= $$$$$$$$ +.MAKE.SAVE_DOLLARS= yes +VAR:= ${DOLLARS} +# The reduction from 8 '$' to 4 '$' happens when ${VAR} is evaluated in the +# condition; .MAKE.SAVE_DOLLARS only applies at the moment where the +# assignment is performed using ':='. +.if ${VAR} != "\$\$\$\$" +. error +.endif + +# When dollars are preserved, this setting not only applies to literal +# dollars, but also to those that come indirectly from other expressions. +DOLLARS= $$$$$$$$ +.MAKE.SAVE_DOLLARS= no +VAR:= ${DOLLARS} +.if ${VAR} != "\$\$" +. error +.endif + +# The 'yes' preserves the dollars from the literal. +.MAKE.SAVE_DOLLARS= yes +VAR:= $$$$$$$$ +.if ${VAR} != "\$\$\$\$" +. error +.endif + +# The 'no' converts each '$$' to '$'. +.MAKE.SAVE_DOLLARS= no +VAR:= $$$$$$$$ +.if ${VAR} != "\$\$" +. error +.endif + +# It's even possible to change the dollar interpretation in the middle of +# evaluating an expression, but there is no practical need for it. +.MAKE.SAVE_DOLLARS= no +VAR:= $$$$-${.MAKE.SAVE_DOLLARS::=yes}-$$$$ +.if ${VAR} != "\$--\$\$" +. error +.endif + +# The '$' from the ':U' expressions do not appear as literal '$$' to the +# parser (no matter whether directly or indirectly), they only appear as '$$' +# in the value of an expression, therefore .MAKE.SAVE_DOLLARS doesn't apply +# here. +.MAKE.SAVE_DOLLARS= no +VAR:= ${:U\$\$\$\$}-${.MAKE.SAVE_DOLLARS::=yes}-${:U\$\$\$\$} +.if ${VAR} != "\$\$--\$\$" +. error +.endif + +# Undefining .MAKE.SAVE_DOLLARS does not have any effect, in particular it +# does not restore the default behavior. +.MAKE.SAVE_DOLLARS= no +.undef .MAKE.SAVE_DOLLARS +VAR:= $$$$$$$$ +.if ${VAR} != "\$\$" +. error +.endif + +# Undefining .MAKE.SAVE_DOLLARS does not have any effect, in particular it +# does not restore the default behavior. +.MAKE.SAVE_DOLLARS= yes +.undef .MAKE.SAVE_DOLLARS +VAR:= $$$$$$$$ +.if ${VAR} != "\$\$\$\$" +. error +.endif + +# The variable '.MAKE.SAVE_DOLLARS' not only affects literal '$$' on the +# right-hand side of the assignment operator ':=', it also affects dollars +# in indirect expressions. +# +# In this example, it affects the command in CMD itself, not the result of +# running that command. +.MAKE.SAVE_DOLLARS= no +CMD= echo '$$$$$$$$' +VAR:= ${CMD:sh} +.if ${VAR} != "\$\$" +. error +.endif + +.MAKE.SAVE_DOLLARS= yes +CMD= echo '$$$$$$$$' +VAR:= ${CMD:sh} +.if ${VAR} != "\$\$\$\$" +. error +.endif + + +# In the modifier ':@var@body@', .MAKE.SAVE_DOLLARS does not affect the body. +# In both cases, each '$$' is replaced with a single '$', no matter whether +# directly or indirectly via another expression. +.MAKE.SAVE_DOLLARS= no +DOLLARS= $$$$$$$$ +VAR:= ${word:L:@word@$$$$$$$$-${DOLLARS}@} +.if ${VAR} != "\$\$-\$\$" +. error +.endif + +.MAKE.SAVE_DOLLARS= yes +DOLLARS= $$$$$$$$ +VAR:= ${word:L:@word@$$$$$$$$-${DOLLARS}@} +.if ${VAR} != "\$\$-\$\$" +. error +.endif -# TODO: Implementation all: - @:; |