Makefile subst变量不受影响?

时间:2015-03-02 18:43:48

标签: bash makefile subst

我想在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,而是更有用。

2 个答案:

答案 0 :(得分:4)

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

您的子文件正在文字字符串$x上运行,该字符串没有/,因此无法替换任何内容并生成$x,其中shell扩展为字符串hello/world

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

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

答案 1 :(得分:0)

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

Makefile

x = foo bar baz

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

输出

make                                                                                                                                                                                                                                                     
foo qux baz

版本

make --version                                                                                                                                                                                                                                           
GNU Make 3.81