热不依赖于 GNU Make 依赖的原子创建?

Hot to not rely on atomic creation of dependencies with GNU Make?

在我的构建系统中,一些 header 文件是自动生成的。他们的一代需要一些时间。生成器首先在文件系统中创建一个空文件,然后写入内容 - 所以有一小段时间 window 在此期间文件存在并且是空的。

这会导致并行构建错误:进程 A 需要 header file.h 并启动其生成命令。进程B需要相同的文件;如果它似乎在提到的时间 window 期间开始编译,编译器会发现依赖关系,获取空的 header 并在编译错误时中止。

解决此类问题的正确方法是什么?我正在寻找 GNU Make 的解决方案,但也非常感谢一般注意事项。

您还没有制作完整的故事。 简单地告诉它是什么配方制作了有问题的 header 文件, 并且您的并行构建开始工作。

如果同一配方同时构建多个 header,这可能有点棘手。 在 make 中编码的唯一方法是使用纯模式规则, 我不喜欢那些 (您希望模式仅匹配您的显式 header 列表,不再匹配)。 然而不可避免的是, headers 不会以相同的时间戳结束 (ls -l -t --full-time), 所以你可以假装它们是一个接一个地制作的。

素描:

# Headers created by the recipe are h0.h h1.h h2.h

h0.h: h1.h
h1.h: h2.h
h2.h:
    recipe line 1
    recipe line 2

现在当 make 想要编译包含 h1.hf.c 时(比方说), 它意识到它必须等待 h2.h 由它的配方构建, 然后才开始编译 f.c.