1

我想在我的 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是更有用的东西。

4

2 回答 2

4

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

您的 subst 在文字字符串上运行$x,它没有/任何东西可以替换并导致$xshell 扩展为字符串hello/world

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

foo:
        x="hello/world" ; \
        echo $$x | tr / -
于 2015-03-02T18:50:01.150 回答
0

您可以定义xmake变量:

生成文件

x = foo bar baz

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

输出

make                                                                                                                                                                                                                                                     
foo qux baz

版本

make --version                                                                                                                                                                                                                                           
GNU Make 3.81   
于 2021-06-11T09:52:14.560 回答