Makefile 在旧版本的Make中模拟分组目标的规范方法是什么?

Makefile 在旧版本的Make中模拟分组目标的规范方法是什么?,makefile,Makefile,对于没有该功能的旧版本Make,模拟Make功能的最佳方法是什么 更新 这似乎是一个可行的方法: “模式规则始终被视为分组目标…无论它们是否使用:或&:分隔符” 模式规则的分组目标一直存在(您不需要&:为此,这是它们的默认工作方式)。在2020年1月发布的GNU make 4.3中引入了针对非模式规则的带有&:的分组目标 没有GNU make 3.0。如果你在MacOS上有默认的GNU make,你就有GNU make 3.81之类的东西。你永远不会得到更新的版本,因为苹果永远不会添加GPLv3

对于没有该功能的旧版本Make,模拟Make功能的最佳方法是什么

更新

这似乎是一个可行的方法:

“模式规则始终被视为分组目标…无论它们是否使用:或&:分隔符”


模式规则的分组目标一直存在(您不需要
&:
为此,这是它们的默认工作方式)。在2020年1月发布的GNU make 4.3中引入了针对非模式规则的带有
&:
的分组目标

没有GNU make 3.0。如果你在MacOS上有默认的GNU make,你就有GNU make 3.81之类的东西。你永远不会得到更新的版本,因为苹果永远不会添加GPLv3下的GNU软件版本,所以在MacOS上,你只能使用旧bash、旧make等。当然,你可以使用自制或macports自行安装更新的版本(或者自己构建)

使用静态模式规则是行不通的。命名是不幸的,但静态模式规则实际上只是编写显式规则的快捷方式,而不是模式规则,并且它们不支持分组目标

如果您不能使用真正的模式规则(您的输出和输入通过它们的文件名的某些公共部分不相关),并且您不能使用GNU make 4.3,那么您可以使用这个习惯用法;如果您的规则是这样的:

t1 t2 t3 ... : p1 p2 p3 ...
        command that builds all of t1 t2 t3 ...
然后您可以将其更改为:

t1 t2 t3 ... : .sentinel ;

.sentinel: p1 p2 p3 ...
        command that builds all of t1 t2 t3 ...
        @touch $@
不要忘记
.sentinel
后面的分号。或者,如果您愿意,您可以为该规则执行类似的操作:它相当于:

t1 t2 t3 ... : .sentinel
        @: do nothing

是shell的“不做任何事情”操作符)当然,您还需要第二条规则。

在哪里可以找到不支持分组目标的make版本?我觉得这些东西已经存在很久了。还是这些非GNU版本的
make
?GNU make v3.0在我的新Mac上,看起来v4.3是一个有分组目标的版本: