gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 23:24:57 24 4
gpt4 key购买 nike

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

关于variables - 转义 makefile 变量(供内部 makefile 使用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28728731/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com