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