如何在 makefile 中使用 shell 分配,以便它可以与 FreeBSD make (bmake) 和 macOS make (GNU Make 3.81) 一起使用?

如何在 makefile 中使用 shell 分配,以便它可以与 FreeBSD make (bmake) 和 macOS make (GNU Make 3.81) 一起使用?

我想!=在将在 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 并不真正关心第一个分配,因为第二个分配无论如何都会覆盖它。

相关内容