是否可以“安全”地展开makefile中的变量,转义makefile认为特殊的所有字符?
例如,假设变量被用作目标:
${external_chaos}:
dd if=/dev/zero of=${external_chaos}(以戏剧为例故意)
如果external_chaos包含空格、;、#、:、,或其他makefile重要字符,那么整个规则就会变得一团糟。
作为解决方案,我设想的是一些内置的功能,应该做到这一点,如${escape external_chaos} (想象奢侈品)。
${value external_chaos}不这么做。
发布于 2015-02-25 20:38:50
一般来说,如果没有巨大的痛苦,你就不会成功地使用有空格的目标。放弃吧。如果必须支持有空格的目标,那么选择不同的构建工具,而不是make。
简单的回答是没有,没有内置的功能。您可以使用subst自己编写一个;例如,在目标中,至少需要转义%和:。
TESCAPE = $(subst :,\:,$(subst %,\%,$1))另一方面,请注意,;和,在目标中并不特殊,因此根本不需要转义它们;实际上,如果需要转义,就会得到不正确的结果,因为\将留在目标名称中:只有在引用特殊字符时才会删除反斜杠。
当您定义变量时,#是特殊的,但在扩展变量时则不是这样:解析器到那时已经完成了对注释的查找。所以你得写:
external_chaos = foo\#bar,biz;baz:boz%bin要让#首先进入变量,但一旦它存在,您就不需要在使用变量时转义它。
下一个有趣的事情是,对于目标和先决条件,您需要以不同的方式逃避。因此,例如,在目标中,您不能转义;,但在先决条件中,您必须转义;。因此,您需要不同的宏:
PESCAPE = $(subst :,\:,$(subst ;,\;,$1))
TESCAPE = $(subst :,\:,$(subst %,\%,$1))
all: $(call PESCAPE,${external_chaos})
$(call TESCAPE,${external_chaos}): ; echo '$@'给予:
foo#bar,biz;baz:boz%binhttps://stackoverflow.com/questions/28728731
复制相似问题