热不依赖于 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.h
的 f.c
时(比方说),
它意识到它必须等待 h2.h
由它的配方构建,
然后才开始编译 f.c
.
在我的构建系统中,一些 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.h
的 f.c
时(比方说),
它意识到它必须等待 h2.h
由它的配方构建,
然后才开始编译 f.c
.