热到不依赖于与GNU Make的依赖关系的原子创建

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

本文关键字:依赖 关系 创建 Make 依赖于 GNU      更新时间:2023-10-16

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

这会导致并行构建错误:进程 A 需要标头file.h并启动其生成命令。进程 B 需要相同的文件;如果它似乎在提到的时间窗口内开始编译,编译器将看到依赖项就位,获取空标头并在编译错误时中止。

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

你还没有给出完整的故事。只需告诉它什么配方使有问题的头文件,您的并行构建开始工作。

如果相同的配方同时构建多个标头,这可能有点棘手。在制作中对此进行编码的唯一方法是使用纯模式规则,我不喜欢那些(您希望模式仅与显式标头列表匹配,不再匹配)。不可避免地,标头不会以相同的时间戳结束( 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.h(例如)的f.c时,它意识到它必须等待h2.h由它的配方建立,然后才开始编译f.c.