在构建具有共同依赖项的目标时,GNU make 是否会受到竞争条件的影响?

Yal*_*ang 3 makefile gnu-make race-condition

我有一个简单的示例 makefile 来显示我的问题:

.PHONY: a.out b.out

all: a.out b.out

common:
    echo building common
    sleep 1
    touch common

a.out: common
    echo building a.out
b.out: common
    echo building b.out
Run Code Online (Sandbox Code Playgroud)

a.out & b.out 取决于 common,因此在进行并行构建时可能会出现竞争条件(common 生成两次)。

我确实 make -j4 并且没有遇到 common 被生成两次。我什至在 common 生成中添加了 sleep 语句,以使事情更具确定性。

那么可以说 GNU make 在构建公共依赖项时正确同步吗?

Mad*_*ist 5

是的,GNU make 的并行化支持正确地处理了这个问题(如果没有,它就不会很有用!)一般来说,如果你的 makefile 环境完全正确地声明了你的依赖关系图,那么无论并行作业的数量。

诀窍在于,对于某些类型的复杂环境,很难完全正确地声明依赖图。但是对于像上面这样的简单情况,没有问题。