转义makefile变量(供内部makefile使用)

检查NAI

是否可以“安全地”扩展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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Makefile:使用多个Makefile

来自分类Dev

Makefile:使用多个Makefile

来自分类Dev

覆盖makefile变量

来自分类Dev

使用For循环填充Makefile变量

来自分类Dev

如何在Makefile中使用导出的变量?

来自分类Dev

使用makefile时如何在变量中转义特殊字符?

来自分类Dev

Makefile延迟变量扩展

来自分类Dev

覆盖makefile中的变量

来自分类Dev

在Makefile中使用bash变量

来自分类Dev

在CMake脚本中使用makefile变量

来自分类Dev

Makefile中的条件变量

来自分类Dev

在Makefile Shell中使用for循环变量

来自分类Dev

Makefile:使用多个Makefile

来自分类Dev

不能在Makefile中使用变量

来自分类Dev

在Makefile中定义变量

来自分类Dev

在Makefile中导出变量

来自分类Dev

如何在Makefile中使用导出的变量?

来自分类Dev

Makefile中的条件变量

来自分类Dev

如何在Makefile中使用带':'的变量?

来自分类Dev

Makefile自动变量不能转义文件名中的字符

来自分类Dev

Makefile奇怪的变量替换

来自分类Dev

带有外部参数和内部变量的Makefile命令

来自分类Dev

使用env变量指定makefile

来自分类Dev

Makefile中的大写变量

来自分类Dev

Makefile变量如何计算?

来自分类Dev

使用自动变量进行Makefile编译

来自分类Dev

Makefile patsubst 使用 shell 变量的值

来自分类Dev

使用 bash <(curl ...) 在 Makefile 规则中转义括号

来自分类Dev

在条件中使用 makefile 变量的问题