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. 22 DOLLARS= $$$$$$$$ 23 .MAKE.SAVE_DOLLARS= yes 24 VAR:= ${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. 34 DOLLARS= $$$$$$$$ 35 .MAKE.SAVE_DOLLARS= no 36 VAR:= ${DOLLARS} 37 .if ${VAR} != "\$\$" 38 . error 39 .endif 40 41 # The 'yes' preserves the dollars from the literal. 42 .MAKE.SAVE_DOLLARS= yes 43 VAR:= $$$$$$$$ 44 .if ${VAR} != "\$\$\$\$" 45 . error 46 .endif 47 48 # The 'no' converts each '$$' to '$'. 49 .MAKE.SAVE_DOLLARS= no 50 VAR:= $$$$$$$$ 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 58 VAR:= $$$$-${.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 68 VAR:= ${: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 77 VAR:= $$$$$$$$ 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 86 VAR:= $$$$$$$$ 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 98 CMD= echo '$$$$$$$$' 99 VAR:= ${CMD:sh} 100 .if ${VAR} != "\$\$" 101 . error 102 .endif 103 104 .MAKE.SAVE_DOLLARS= yes 105 CMD= echo '$$$$$$$$' 106 VAR:= ${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 116 DOLLARS= $$$$$$$$ 117 VAR:= ${word:L:@word@$$$$$$$$-${DOLLARS}@} 118 .if ${VAR} != "\$\$-\$\$" 119 . error 120 .endif 121 122 .MAKE.SAVE_DOLLARS= yes 123 DOLLARS= $$$$$$$$ 124 VAR:= ${word:L:@word@$$$$$$$$-${DOLLARS}@} 125 .if ${VAR} != "\$\$-\$\$" 126 . error 127 .endif 128 129 130 all: 131