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