如何在 Makefile 中使用 Bash 参数替换?

How to use Bash parameter substitution in a Makefile?

我有以下 Makefile,我想在其中使用 Bash parameter substitution 语法,如下所示:

SHELL:=/bin/bash
Foo=Bar
all:
  @echo ${Foo}
  @echo ${Foo/Bar/OK}

但是它没有按预期工作,因为第二个 echo 命令的输出为空:

$ make
Bar
(empty)

尽管在 shell 中直接调用时效果很好:

$ Foo=Bar; echo ${Foo/Bar/OK}
OK

如何在 Makefile 中使用上述语法?

如果你想要 shell 扩展变量,你必须使用 shell 变量,而不是 make 变量。 ${Foo/Bar/OK} 是一个按字面意思命名的 make 变量 Foo/Bar/OK.

如果您想使用 shell 变量替换,您必须将该值分配给 shell 变量:

all:
        Foo='$(Foo)'; echo $${Foo/Bar/OK}

请注意,我们使用双美元 $$ 来转义美元符号,这样 make 就不会尝试扩展它。

强烈建议您在确定规则有效之前不要将@添加到您的规则中。这是我见过的最常见的错误;如果人们不使用 @ 他们可以看到命令 make 正在调用,然后他们会更好地理解 make 是如何工作的。