转义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时如何在变量中转义特殊字符?

来自分类Dev

在Makefile中使用bash变量

来自分类Dev

使用For循环填充Makefile变量

来自分类Dev

使用env变量指定makefile

来自分类Dev

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

来自分类Dev

Makefile:使用多个Makefile

来自分类Dev

Makefile:使用多个Makefile

来自分类Dev

Makefile:使用多个Makefile

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

在CMake脚本中使用makefile变量

来自分类Dev

在Makefile Shell中使用for循环变量

来自分类Dev

不能在Makefile中使用变量

来自分类Dev

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

来自分类Dev

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

来自分类Dev

使用自动变量进行Makefile编译

来自分类Dev

Makefile patsubst 使用 shell 变量的值

来自分类Dev

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

来自分类Dev

Makefile延迟变量扩展

来自分类Dev

覆盖makefile中的变量

来自分类Dev

覆盖makefile变量

来自分类Dev

Makefile中的条件变量

来自分类Dev

在Makefile中定义变量

来自分类Dev

在Makefile中导出变量

来自分类Dev

Makefile中的条件变量

来自分类Dev

Makefile奇怪的变量替换

来自分类Dev

Makefile变量如何计算?

来自分类Dev

Makefile中的大写变量