How do I properly escape data for a Makefile?

前端 未结 3 556
南笙
南笙 2020-12-05 06:13

I\'m dynamically generating config.mk with a bash script which will be used by a Makefile. The file is constructed with:

cat > config.mk <         


        
3条回答
  •  广开言路
    2020-12-05 07:10

    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.

提交回复
热议问题