Module Name: src
Committed By: rillig
Date: Thu Dec 2 22:41:01 UTC 2021
Modified Files:
src/usr.bin/make/unit-tests: varname-dot-make-save_dollars.mk
Log Message:
tests/make: fix test for .MAKE.SAVE_DOLLARS
The previous assumption was wrong that only literal '$$' that occur
directly in the right-hand side of a variable assignment would be
affected. Indirect variable definitions are affected as well when they
are evaluated nestedly, as long as the '$$' appears in the text of the
variable that is actually parsed. Whether the '$$' ends up in the
expanded value of the expression doesn't matter though.
To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 \
src/usr.bin/make/unit-tests/varname-dot-make-save_dollars.mk
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/usr.bin/make/unit-tests/varname-dot-make-save_dollars.mk
diff -u src/usr.bin/make/unit-tests/varname-dot-make-save_dollars.mk:1.5 src/usr.bin/make/unit-tests/varname-dot-make-save_dollars.mk:1.6
--- src/usr.bin/make/unit-tests/varname-dot-make-save_dollars.mk:1.5 Wed Dec 1 23:15:38 2021
+++ src/usr.bin/make/unit-tests/varname-dot-make-save_dollars.mk Thu Dec 2 22:41:01 2021
@@ -1,4 +1,4 @@
-# $NetBSD: varname-dot-make-save_dollars.mk,v 1.5 2021/12/01 23:15:38 rillig Exp $
+# $NetBSD: varname-dot-make-save_dollars.mk,v 1.6 2021/12/02 22:41:01 rillig Exp $
#
# Tests for the special .MAKE.SAVE_DOLLARS variable, which controls whether
# the assignment operator ':=' converts '$$' to a single '$' or keeps it
@@ -17,8 +17,8 @@
.endif
-# Even when dollars are preserved, it only applies to literal dollars, not
-# to those that come indirectly from other expressions.
+# 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}
@@ -29,6 +29,15 @@ VAR:= ${DOLLARS}
. 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:= $$$$$$$$
@@ -51,8 +60,10 @@ VAR:= $$$$-${.MAKE.SAVE_DOLLARS::=yes}-
. error
.endif
-# The '$' from the ':U' expressions are indirect, therefore .MAKE.SAVE_DOLLARS
-# doesn't apply to them.
+# 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} != "\$\$--\$\$"
@@ -77,4 +88,24 @@ 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
+
all: