Okay, it turned out that Makefiles need little escaping for itself, but the commands which are executed by the shell interpreter need to be escaped.
Characters which have a special meaning in Makefile and that need to be escaped are:
- sharp (
#
, comment) becomes #
- dollar (
$
, begin of variable) becomes $$
Newlines cannot be inserted in a variable, but to avoid breaking the rest of the Makefile, prepend it with a backslash so the line break will be ignored.
Too bad a backslash itself cannot be escaped (\
will still be \
and not
as you might expect). This makes it not possible to put a literal slash on the end of a string as it will either eat the newline or the hash of a following comment. A space can be put on the end of the line, but that'll also be put in the variable itself.
The recipe itself is interpreted as a shell command, without any fancy escaping, so you've to escape data yourself, just imagine that you're writing a shellscript and inserting the variables from other files. The strategy here would be putting the variables between single quotes and escape only '
with '''
(close the string, insert a literal '
and start a new string). Example: mornin' all
becomes 'morning''' all'
which is equivalent to "morning' all"
.
The firstword+wildcard issue is caused by the fact that filenames with spaces in them are treated as separate filenames by firstword
. Furthermore, wildcard
expands escapes using
so x y
is matches as one word, x y
and not two words.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…