Makefile subst 变量不受影响?

Makefile subst variable not affected?

我想在我的 Makefile 中执行字符串替换。我可以像这样使用字符串文字轻松地做到这一点:

foo:
    echo $(subst /,-,"hello/world")

产生预期的结果:

hello-world

但是当我切换到使用变量时,我似乎无法坚持替换:

foo:
    x="hello/world" ; \
    echo $(subst /,-,$$x)

我没有用破折号替换斜杠,而是打印回了原始字符串。有人可以解释这里发生了什么吗?变量是否需要显式转换为字符串文字或其他内容?

更新:

基于 MadScientist 的回答的修复——这将允许我将修改后的字符串作为变量引用。

foo:
    x="hello/world" ; \
    y=`echo $$x | tr / -` ; \
    echo $$y

但这可能比 echo $$y 更有用。

您不能将 make 函数与 shell 变量结合使用...所有 make 函数都先展开 ,然后将生成的脚本传递给 shell 为 运行。当 shell 获取脚本时,其中不再有 make 函数(如果有,shell 将不知道如何处理它们!)

你的替换是 运行ning 在文字字符串 $x 上,它没有 /,所以没有什么可替换的,结果是 $x,[=26] =] 扩展为字符串 hello/world.

如果您必须处理 shell 变量值,您必须使用 shell 命令,例如 sedtr,而不是 make 的 subst 函数:

foo:
        x="hello/world" ; \
        echo $$x | tr / -

您可以将 x 定义为 make 变量:

生成文件:

x = foo bar baz

t:
    @echo $(subst bar,qux,$(x))

输出:

make                                                                                                                                                                                                                                                     
foo qux baz

版本:

make --version                                                                                                                                                                                                                                           
GNU Make 3.81