1# $NetBSD: varname-dot-make-save_dollars.mk,v 1.7 2021/12/03 18:43:52 rillig Exp $ 2# 3# Tests for the special .MAKE.SAVE_DOLLARS variable, which controls whether 4# the assignment operator ':=' converts '$$' to a single '$' or keeps it 5# as-is. 6# 7# See also: 8# var-op-expand.mk for ':=' in general 9# varmisc.mk for parsing the boolean values 10 11# Initially, the variable .MAKE.SAVE_DOLLARS is undefined. At this point the 12# behavior of the assignment operator ':=' depends. NetBSD's usr.bin/make 13# preserves the '$$' as-is, while the bmake distribution replaces '$$' with 14# '$'. 15.if ${.MAKE.SAVE_DOLLARS:Uundefined} != "undefined" 16. error 17.endif 18 19 20# When dollars are preserved, this setting not only applies to literal 21# dollars, but also to those that come indirectly from other expressions. 22DOLLARS= $$$$$$$$ 23.MAKE.SAVE_DOLLARS= yes 24VAR:= ${DOLLARS} 25# The reduction from 8 '$' to 4 '$' happens when ${VAR} is evaluated in the 26# condition; .MAKE.SAVE_DOLLARS only applies at the moment where the 27# assignment is performed using ':='. 28.if ${VAR} != "\$\$\$\$" 29. error 30.endif 31 32# When dollars are preserved, this setting not only applies to literal 33# dollars, but also to those that come indirectly from other expressions. 34DOLLARS= $$$$$$$$ 35.MAKE.SAVE_DOLLARS= no 36VAR:= ${DOLLARS} 37.if ${VAR} != "\$\$" 38. error 39.endif 40 41# The 'yes' preserves the dollars from the literal. 42.MAKE.SAVE_DOLLARS= yes 43VAR:= $$$$$$$$ 44.if ${VAR} != "\$\$\$\$" 45. error 46.endif 47 48# The 'no' converts each '$$' to '$'. 49.MAKE.SAVE_DOLLARS= no 50VAR:= $$$$$$$$ 51.if ${VAR} != "\$\$" 52. error 53.endif 54 55# It's even possible to change the dollar interpretation in the middle of 56# evaluating an expression, but there is no practical need for it. 57.MAKE.SAVE_DOLLARS= no 58VAR:= $$$$-${.MAKE.SAVE_DOLLARS::=yes}-$$$$ 59.if ${VAR} != "\$--\$\$" 60. error 61.endif 62 63# The '$' from the ':U' expressions do not appear as literal '$$' to the 64# parser (no matter whether directly or indirectly), they only appear as '$$' 65# in the value of an expression, therefore .MAKE.SAVE_DOLLARS doesn't apply 66# here. 67.MAKE.SAVE_DOLLARS= no 68VAR:= ${:U\$\$\$\$}-${.MAKE.SAVE_DOLLARS::=yes}-${:U\$\$\$\$} 69.if ${VAR} != "\$\$--\$\$" 70. error 71.endif 72 73# Undefining .MAKE.SAVE_DOLLARS does not have any effect, in particular it 74# does not restore the default behavior. 75.MAKE.SAVE_DOLLARS= no 76.undef .MAKE.SAVE_DOLLARS 77VAR:= $$$$$$$$ 78.if ${VAR} != "\$\$" 79. error 80.endif 81 82# Undefining .MAKE.SAVE_DOLLARS does not have any effect, in particular it 83# does not restore the default behavior. 84.MAKE.SAVE_DOLLARS= yes 85.undef .MAKE.SAVE_DOLLARS 86VAR:= $$$$$$$$ 87.if ${VAR} != "\$\$\$\$" 88. error 89.endif 90 91# The variable '.MAKE.SAVE_DOLLARS' not only affects literal '$$' on the 92# right-hand side of the assignment operator ':=', it also affects dollars 93# in indirect expressions. 94# 95# In this example, it affects the command in CMD itself, not the result of 96# running that command. 97.MAKE.SAVE_DOLLARS= no 98CMD= echo '$$$$$$$$' 99VAR:= ${CMD:sh} 100.if ${VAR} != "\$\$" 101. error 102.endif 103 104.MAKE.SAVE_DOLLARS= yes 105CMD= echo '$$$$$$$$' 106VAR:= ${CMD:sh} 107.if ${VAR} != "\$\$\$\$" 108. error 109.endif 110 111 112# In the modifier ':@var@body@', .MAKE.SAVE_DOLLARS does not affect the body. 113# In both cases, each '$$' is replaced with a single '$', no matter whether 114# directly or indirectly via another expression. 115.MAKE.SAVE_DOLLARS= no 116DOLLARS= $$$$$$$$ 117VAR:= ${word:L:@word@$$$$$$$$-${DOLLARS}@} 118.if ${VAR} != "\$\$-\$\$" 119. error 120.endif 121 122.MAKE.SAVE_DOLLARS= yes 123DOLLARS= $$$$$$$$ 124VAR:= ${word:L:@word@$$$$$$$$-${DOLLARS}@} 125.if ${VAR} != "\$\$-\$\$" 126. error 127.endif 128 129 130all: 131