是否可以“安全地”扩展makefile中的变量,转义makefile认为特殊的所有字符?
例如,假定将变量用作目标:
${external_chaos}:
dd if=/dev/zero of=${external_chaos}
(示例中的有意戏剧)
如果external_chaos
包含空格,;
,#
,:
,,
,或其他的makefile-显著字符,则整个规则得到弄糟。
我想作为解决方案的是一些Make内置函数应该执行的,例如${escape external_chaos}
(虚幻的奢侈品)。
${value external_chaos}
不这样做。
通常,使用目标中带有空格的目标不会成功(即使没有痛苦,也不会造成痛苦)。放弃吧 如果必须支持目标中有空格的目标,请选择其他构建工具,而不是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%bin
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句