我想!=
在将在 FreeBSD、macOS 和 Linux 上执行的 makefile 中使用 shell 赋值运算符(即 )。这是一个例子:
a!= seq 3
.PHONY: all
all: $a
.PHONY: $a
$a:
@echo $@
这是预期的输出:
$ touch 1 2 3
$ make all
1
2
3
不幸的是,macOS Monterey 12.6.1 附带的 GNU Make 不支持 shell 赋值运算符,并且该示例的输出为空。它可以在更新版本的 GNU Make 中运行(例如 4.4),这在最近的 Linux 发行版中很可能会遇到。
如果我希望这个 makefile 能够与任何版本的 GNU make 和 bmake 一起使用,我该怎么办?
答案1
$(shell ...)
解决方案是除了 shell 赋值运算符之外还使用该构造,如下所示:
a= $(shell seq 3)
a!= seq 3
.PHONY: all
all: $a
.PHONY: $a
$a:
@echo $@
GNU Make 3.81 似乎跳过了 shell 分配,因此它使用第一个分配的输出。然而,bmake 并不真正关心第一个分配,因为第二个分配无论如何都会覆盖它。