【问题标题】:How to use Bash parameter substitution in a Makefile?如何在 Makefile 中使用 Bash 参数替换?
【发布时间】:2017-02-25 22:03:59
【问题描述】:
我有以下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 中使用上述语法?
【问题讨论】:
标签:
bash
shell
makefile
syntax
string-substitution
【解决方案1】:
如果你想让 shell 扩展变量,你必须使用 shell 变量,而不是 make 变量。 ${Foo/Bar/OK} 是一个 make 变量,字面意思是 Foo/Bar/OK。
如果您想使用 shell 变量替换,您必须将该值分配给 shell 变量:
all:
Foo='$(Foo)'; echo $${Foo/Bar/OK}
请注意,我们使用双美元 $$ 来转义美元符号,以便 make 不会尝试扩展它。
我强烈建议您不要将@ 添加到您的规则中,除非您确定它们有效。这是我看到的最常见的错误;如果人们不使用@,他们会看到命令 make 正在调用,然后他们会更好地了解 make 的工作原理。