如何在 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 是如何工作的。
我有以下 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 是如何工作的。