【发布时间】:2021-12-25 10:28:09
【问题描述】:
从 GNU make 执行代码生成器。生成器生成多个文件(取决于输入),并且仅在文件内容发生变化时才触及这些文件。因此需要使用哨兵目标来记录生成器的执行时间:
GEN_READY : $(gen_input_files)
gen.exe $(gen_input_files)
touch GEN_READY
$(gen_output_files): GEN_READY
它工作得很好,除非生成的文件被删除,但哨兵文件留在原地。由于哨兵在那里,并且它是最新的,因此不会再次执行生成器。 在这种情况下,强制 make 重新运行生成器的正确解决方案是什么?
【问题讨论】:
-
如果您有 Make 4.3,您可以尝试分组目标。如果不是,您可以考虑按档案对它们进行分组,并声明诸如 target.tar:prerequisite.tar 之类的规则。从输入文件哈希生成哨兵文件名是一种效果很好的技术,但可能需要比注释更长的时间来解释......有任何偏好吗?
-
感谢您的想法。我现在正在尝试分组目标。除了 4.3+ 之外,这可能是一个问题,我在链接规则时遇到了另一个问题。虽然可能可以修复。档案听起来很有趣,我从未尝试过的功能,看着它。哈希在这里肯定太复杂了。
-
Automake 手册对handling tools that produce multiple outputs 进行了相对冗长的讨论,包括使用标记文件。尽管有其来源,但讨论对于各种
make实现是通用的,而不是特定于 Automake。我想你会觉得它值得一读。 -
这绝对是有趣且有用的信息,非常感谢。最终的解决方案可能不适用于 GNU make。它非常复杂,使用递归 make 调用,并且不确定如何测试许多生成的文件。
-
从 2007 年开始,有一个 Ask Mr. Make article 关于在 GNU Make 中使用原子规则和哨兵文件。
标签: makefile gnu-make code-generation