首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >转义makefile变量(用于内部makefile )

转义makefile变量(用于内部makefile )
EN

Stack Overflow用户
提问于 2015-02-25 20:14:07
回答 1查看 1.2K关注 0票数 5

是否可以“安全”地展开makefile中的变量,转义makefile认为特殊的所有字符?

例如,假设变量被用作目标:

代码语言:javascript
复制
${external_chaos}:
    dd if=/dev/zero of=${external_chaos}

(以戏剧为例故意)

如果external_chaos包含空格、;#:,或其他makefile重要字符,那么整个规则就会变得一团糟。

作为解决方案,我设想的是一些内置的功能,应该做到这一点,如${escape external_chaos} (想象奢侈品)。

${value external_chaos}不这么做。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-25 20:38:50

一般来说,如果没有巨大的痛苦,你就不会成功地使用有空格的目标。放弃吧。如果必须支持有空格的目标,那么选择不同的构建工具,而不是make。

简单的回答是没有,没有内置的功能。您可以使用subst自己编写一个;例如,在目标中,至少需要转义%:

代码语言:javascript
复制
TESCAPE = $(subst :,\:,$(subst %,\%,$1))

另一方面,请注意,;,在目标中并不特殊,因此根本不需要转义它们;实际上,如果需要转义,就会得到不正确的结果,因为\将留在目标名称中:只有在引用特殊字符时才会删除反斜杠。

当您定义变量时,#是特殊的,但在扩展变量时则不是这样:解析器到那时已经完成了对注释的查找。所以你得写:

代码语言:javascript
复制
external_chaos = foo\#bar,biz;baz:boz%bin

要让#首先进入变量,但一旦它存在,您就不需要在使用变量时转义它。

下一个有趣的事情是,对于目标和先决条件,您需要以不同的方式逃避。因此,例如,在目标中,您不能转义;,但在先决条件中,您必须转义;。因此,您需要不同的宏:

代码语言:javascript
复制
PESCAPE = $(subst :,\:,$(subst ;,\;,$1))

TESCAPE = $(subst :,\:,$(subst %,\%,$1))

all: $(call PESCAPE,${external_chaos})

$(call TESCAPE,${external_chaos}): ; echo '$@'

给予:

代码语言:javascript
复制
foo#bar,biz;baz:boz%bin
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28728731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档