由于两个目标各自具有特定的先决条件,并且只有一个命令来构建它们,因此我们可以使用此 makefile
a.target: a.req
build_a_and_b
b.target: b.req
build_a_and_b
但是如果需要构建 2 个目标,则该命令将运行两次。
我发现在最近的 make 中存在分组目标,其中考虑到生成多个目标的命令:
a.target b.target &: a.src b.src
build_a_and_b
这解决了上述问题,但引入了新的异常:如果没有目标是过时的,但a.src
比 更新,则b.target
命令会按不应运行的方式运行,因为b.target
仅依赖于b.src
。当然,在切换 a 和 b 角色时也存在相同的错误。
当目标比其自身的源旧时,如何才能仅执行一次命令?
不幸的是,没有办法对分组目标执行此操作。对于分组目标,所有先决条件都会合并到两个目标中,无论您如何定义它们。
如果您不关心并行构建,您可以简单地定义两个规则,第一个运行的规则将更新另一个规则,然后 make 将看到第二个规则已更新并且不会再次运行该配方。
如果你想进行并行构建,那么这实际上是不可能的,因为 make 知道不同时构建两者的唯一方法是将它们链接在一起,而当将它们链接在一起时会得到此结果。至少,我想不出避免这种情况的方法。