1 # $NetBSD: escape.mk,v 1.15 2023/10/19 18:24:33 rillig Exp $ 2 # 3 # Test backslash escaping. 4 5 # Extracts from the POSIX 2008 specification 6 # <http://pubs.opengroup.org/onlinepubs/9699919799/utilities/make.html>: 7 # 8 # Comments start with a <number-sign> ( '#' ) and continue until an 9 # unescaped <newline> is reached. 10 # 11 # When an escaped <newline> (one preceded by a <backslash>) is found 12 # anywhere in the makefile except in a command line, an include 13 # line, or a line immediately preceding an include line, it shall 14 # be replaced, along with any leading white space on the following 15 # line, with a single <space>. 16 # 17 # When an escaped <newline> is found in a command line in a 18 # makefile, the command line shall contain the <backslash>, the 19 # <newline>, and the next line, except that the first character of 20 # the next line shall not be included if it is a <tab>. 21 # 22 # When an escaped <newline> is found in an include line or in a 23 # line immediately preceding an include line, the behavior is 24 # unspecified. 25 # 26 # Notice that the behaviour of <backslash><backslash> or 27 # <backslash><anything other than newline> is not mentioned. I think 28 # this implies that <backslash> should be taken literally everywhere 29 # except before <newline>. 30 # 31 # Our practice, despite what POSIX might say, is that "\#" 32 # in a variable assignment stores "#" as part of the value. 33 # The "\" is not taken literally, and the "#" does not begin a comment. 34 # 35 # Also, our practice is that an even number of backslashes before a 36 # newline in a variable assignment simply stores the backslashes as part 37 # of the value, and treats the newline as though it was not escaped. 38 # Similarly, an even number of backslashes before a newline in a 39 # command simply uses the backslashes as part of the command, but 40 # does not escape the newline. This is compatible with GNU make. 41 42 all: .PHONY 43 # We will add dependencies like "all: yet-another-test" later. 44 45 # Some variables to be expanded in tests 46 # 47 a= aaa 48 A= ${a} 49 50 # Backslash at end of line in a comment\ 51 should continue the comment. \ 52 # This is also tested in comment.mk. 53 54 __printvars: .USE .MADE 55 @echo ${.TARGET} 56 @${.ALLSRC:@v@ printf "%s=:%s:\n" ${v:Q} ${${v}:Q}; @} 57 58 # Embedded backslash in variable should be taken literally. 59 # 60 VAR1BS= 111\111 61 VAR1BSa= 111\${a} 62 VAR1BSA= 111\${A} 63 VAR1BSda= 111\$${a} 64 VAR1BSdA= 111\$${A} 65 VAR1BSc= 111\# backslash escapes comment char, so this is part of the value 66 VAR1BSsc= 111\ # This is a comment. Value ends with <backslash><space> 67 68 all: var-1bs 69 var-1bs: .PHONY __printvars VAR1BS VAR1BSa VAR1BSA VAR1BSda VAR1BSdA \ 70 VAR1BSc VAR1BSsc 71 72 # Double backslash in variable should be taken as two literal backslashes. 73 # 74 VAR2BS= 222\\222 75 VAR2BSa= 222\\${a} 76 VAR2BSA= 222\\${A} 77 VAR2BSda= 222\\$${a} 78 VAR2BSdA= 222\\$${A} 79 VAR2BSc= 222\\# backslash does not escape comment char, so this is a comment 80 VAR2BSsc= 222\\ # This is a comment. Value ends with <backslash><backslash> 81 82 all: var-2bs 83 var-2bs: .PHONY __printvars VAR2BS VAR2BSa VAR2BSA VAR2BSda VAR2BSdA \ 84 VAR2BSc VAR2BSsc 85 86 # In a variable assignment, when the sequence <backslash><newline> occurs at 87 # the end of a physical line, it is replaced with a single space. 88 # 89 VAR1BSNL= 111\ 90 111 91 VAR1BSNLa= 111\ 92 ${a} 93 VAR1BSNLA= 111\ 94 ${A} 95 VAR1BSNLda= 111\ 96 $${a} 97 VAR1BSNLdA= 111\ 98 $${A} 99 VAR1BSNLc= 111\ 100 # this should be processed as a comment 101 VAR1BSNLsc= 111\ 102 # this should be processed as a comment 103 104 all: var-1bsnl 105 var-1bsnl: .PHONY 106 var-1bsnl: .PHONY __printvars \ 107 VAR1BSNL VAR1BSNLa VAR1BSNLA VAR1BSNLda VAR1BSNLdA \ 108 VAR1BSNLc VAR1BSNLsc 109 110 # Double-backslash-newline in a variable setting. 111 # Both backslashes should be taken literally, and the newline is NOT escaped. 112 # 113 # The second lines below each end with '=' so that they will not 114 # generate syntax errors regardless of whether or not they are 115 # treated as part of the value. 116 # 117 VAR2BSNL= 222\\ 118 222= 119 VAR2BSNLa= 222\\ 120 ${a}= 121 VAR2BSNLA= 222\\ 122 ${A}= 123 VAR2BSNLda= 222\\ 124 $${a}= 125 VAR2BSNLdA= 222\\ 126 $${A}= 127 VAR2BSNLc= 222\\ 128 # this should be processed as a comment 129 VAR2BSNLsc= 222\\ 130 # this should be processed as a comment 131 132 all: var-2bsnl 133 var-2bsnl: .PHONY __printvars \ 134 VAR2BSNL VAR2BSNLa VAR2BSNLA VAR2BSNLda VAR2BSNLdA \ 135 VAR2BSNLc VAR2BSNLsc 136 137 # Triple-backslash-newline in a variable setting. 138 # First two should be taken literally, and last should escape the newline. 139 # 140 # The second lines below each end with '=' so that they will not 141 # generate syntax errors regardless of whether or not they are 142 # treated as part of the value. 143 # 144 VAR3BSNL= 333\\\ 145 333= 146 VAR3BSNLa= 333\\\ 147 ${a}= 148 VAR3BSNLA= 333\\\ 149 ${A}= 150 VAR3BSNLda= 333\\\ 151 $${a}= 152 VAR3BSNLdA= 333\\\ 153 $${A}= 154 VAR3BSNLc= 333\\\ 155 # this should be processed as a comment 156 VAR3BSNLsc= 333\\\ 157 # this should be processed as a comment 158 159 all: var-3bsnl 160 var-3bsnl: .PHONY __printvars \ 161 VAR3BSNL VAR3BSNLa VAR3BSNLA VAR3BSNLda VAR3BSNLdA \ 162 VAR3BSNLc VAR3BSNLsc 163 164 # Backslash-newline in a variable setting, plus any amount of white space 165 # on the next line, is replaced by a single space. 166 # 167 VAR1BSNL00= first line\ 168 169 # above line is entirely empty, and this is a comment 170 VAR1BSNL0= first line\ 171 no space on second line 172 VAR1BSNLs= first line\ 173 one space on second line 174 VAR1BSNLss= first line\ 175 two spaces on second line 176 VAR1BSNLt= first line\ 177 one tab on second line 178 VAR1BSNLtt= first line\ 179 two tabs on second line 180 VAR1BSNLxx= first line\ 181 many spaces and tabs [ ] on second line 182 183 all: var-1bsnl-space 184 var-1bsnl-space: .PHONY __printvars \ 185 VAR1BSNL00 VAR1BSNL0 VAR1BSNLs VAR1BSNLss VAR1BSNLt VAR1BSNLtt \ 186 VAR1BSNLxx 187 188 # Backslash-newline in a command is retained. 189 # 190 # The "#" in "# second line without space" makes it a comment instead 191 # of a syntax error if the preceding line is parsed incorrectly. 192 # The ":" in "third line':" makes it look like the start of a 193 # target instead of a syntax error if the first line is parsed incorrectly. 194 # 195 all: cmd-1bsnl 196 cmd-1bsnl: .PHONY 197 @echo ${.TARGET} 198 echo :'first line\ 199 #second line without space\ 200 third line': 201 echo :'first line\ 202 second line spaces should be retained': 203 echo :'first line\ 204 second line tab should be elided': 205 echo :'first line\ 206 only one tab should be elided, second tab remains' 207 208 # When backslash-newline appears at the end of a command script, 209 # both the backslash and the newline should be passed to the shell. 210 # The shell should elide the backslash-newline. 211 # 212 all: cmd-1bsnl-eof 213 cmd-1bsnl-eof: 214 @echo ${.TARGET} 215 echo :'command ending with backslash-newline'; \ 216 217 # above line must be blank 218 219 # Double-backslash-newline in a command. 220 # Both backslashes are retained, but the newline is not escaped. 221 # XXX: This may differ from POSIX, but matches gmake. 222 # 223 # When make passes two backslashes to the shell, the shell will pass one 224 # backslash to the echo command. 225 # 226 all: cmd-2bsnl 227 cmd-2bsnl: .PHONY 228 @echo ${.TARGET} 229 echo take one\\ 230 # this should be a comment 231 echo take two\\ 232 echo take three\\ 233 234 # Triple-backslash-newline in a command is retained. 235 # 236 all: cmd-3bsnl 237 cmd-3bsnl: .PHONY 238 @echo ${.TARGET} 239 echo :'first line\\\ 240 #second line without space\\\ 241 third line': 242 echo :'first line\\\ 243 second line spaces should be retained': 244 echo :'first line\\\ 245 second line tab should be elided': 246 echo :'first line\\\ 247 only one tab should be elided, second tab remains' 248