【问题标题】:Hot to not rely on atomic creation of dependencies with GNU Make?不依赖于使用 GNU Make 原子创建依赖项很热吗?
【发布时间】:2016-07-05 07:36:21
【问题描述】:

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

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

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

【问题讨论】:

  • 你能不能生成一个给它另一个名字的文件,然后在它完全生成后重命名。
  • 工具坏了。它不应该那样做。但是在生成该文件的规则完成之前,并行 make 不应启动列出文件先决条件的作业。您是否正确设置了规则和先决条件?

标签: c++ c makefile dependencies gnu-make


【解决方案1】:

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

如果同一个配方一次构建多个标头,这可能会有点棘手。 在 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.hf.c(比如说), 它意识到它必须等待 h2.h 由它的配方构建, 然后才开始编译f.c

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    • 2015-05-09
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多