Makefile子变量不受影响



我想在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就不知道该怎么处理它们了!)

您的subst在文字字符串$x上运行,该字符串没有/,因此没有任何内容可替换,并生成$x,shell将其扩展为字符串hello/world

如果必须处理shell变量值,则必须使用诸如sedtr之类的shell命令,而不是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   

相关内容

  • 没有找到相关文章

最新更新