有 2 个目标,每个目标都有特定的先决条件和一个命令来构建它们,我们可以使用这个 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 知道不要同时构建两者的唯一方法是它们是否链接在一起,并且当它们链接在一起时您会得到这个结果。 至少,我想不出有什么办法可以避免。