【问题标题】:Escaping makefile variables (for internal makefile use)转义 makefile 变量(供内部 makefile 使用)
【发布时间】:2015-02-25 20:14:07
【问题描述】:

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

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

${external_chaos}:
    dd if=/dev/zero of=${external_chaos}

(故意戏剧性的例子)

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

我想作为一个解决方案的是一些 Make 内置函数应该做到这一点,例如 ${escape external_chaos}(想象中的奢侈)。

${value external_chaos} 不这样做。

【问题讨论】:

    标签: variables makefile gnu-make


    【解决方案1】:

    一般来说,使用带有空格的目标是不会成功的(如果有的话,没有巨大的痛苦)。放弃吧。如果您必须支持其中包含空格的目标,请选择其他构建工具,而不是 make。

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

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

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

    # 在您定义 变量时是特殊的,但在变量扩展 时则不是:此时解析器已经完成了对 cme​​ts 的查找。所以你必须写:

    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
    

    【讨论】:

    • % 怎么样?还是属于空间痛的范畴?
    • 是的,你也必须逃离%。我没有尝试想出所有可能的特殊字符,只是使用了问题中的那些。处理% 没什么大不了的,和冒号一样。烦人的事情是不同的字符需要在不同的上下文中转义:例如在目标上下文中你不想转义;,但在先决条件上下文中你必须转义;。我会更新答案。
    • ESCAPE 对空格字符不起作用有什么原因吗?我刚刚写的一个快速测试似乎很好:ESCAPE = $(subst ${onespace},\${onespace},${1}),其中onespace := ${nullstr} # space herenullstr :=v123 := one two three${call ESCAPE,${v123}}:make 'one two three' 调用(非常抱歉评论中有这么多代码)。
    • 尝试使用$(@D)$(@F)。或其中任何一个上的任何其他 make 函数。尝试编写一个打印规则先决条件的配方(使用$^)在名称中保留空格(例如每行打印一个先决条件,或使用“ls”列出文件等——将它们传递给链接器是一样的)。
    • 我应该说,如果(a)您愿意在所有目标和先决条件中转义空格,(b)您愿意从不在配方中使用任何 make 自动变量可以扩展到多个单词(所以没有$^$?$+ 等),并且 (c) 你愿意永远不要对任何可能包含空格分隔单词的变量使用任何 make 函数,包括 @ 987654352@(这只是$(notdir $@)的简写)等等。哦,你必须用正确的引用编写你自己的所有规则,而不是使用任何make的内置规则。这至少是你必须要做的。
    猜你喜欢
    • 2018-01-30
    • 1970-01-01
    • 2014-08-07
    • 1970-01-01
    • 2015-06-12
    • 2021-06-12
    • 2017-03-21
    • 2017-02-18
    • 1970-01-01
    相关资源
    最近更新 更多