xref: /freebsd/contrib/bmake/unit-tests/escape.mk (revision d5e0a182cf153f8993a633b93d9220c99a89e760)
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