gpt4 book ai didi

保留中间文件的 Makefile 规则

转载 作者:行者123 更新时间:2023-12-01 12:34:24 34 4
gpt4 key购买 nike

为了调试复杂的 XSLT 转换,我将其分为几个部分:首先构建 %.1.xml,然后使用它构建 %.2.xml ,最后构建 %.3.xml。一切正常,但如果我要求 Make 构建最后一个,Make 总是会删除中间的 %.1.xml%.2.xml,而我宁愿保留它们。我已尝试将所有 .xml 文件标记为 .PRECIOUS,因此:

.PRECIOUS: %.xml

但这似乎不起作用。 (我也尝试使用 %.1.xml%.2.xml,但这也不起作用。然后我尝试将它们标记为 .SECONDARY 以相同的方式和相同的负面结果。它不删除中间文件的唯一方法是文件已经存在;在这种情况下,它只会重建它们。但是如果文件不存在, 它总是删除它们。

我错过了什么?

GNU Make 4.1。

更新:Makefile,>>>代表TAB:

sample-%.1.xml: sample-%.0.xml job.1.xslt job.xslt
>> xsltproc $(filter %.1.xslt,$^) $(filter %.xml,$^) > $@
sample-%.2.xml: sample-%.1.xml job.2.xslt job.xslt
>> xsltproc $(filter %.2.xslt,$^) $(filter %.xml,$^) > $@
sample-%.3.xml: sample-%.2.xml job.3.xslt job.xslt
>> xsltproc $(filter %.3.xslt,$^) $(filter %.xml,$^) > $@
.SECONDARY: %.xml # or .PRECIOUS: %.xml

它工作正常,根据需要重建所有内容或构建中间文件,但是当被要求构建 .3.xml.1.xml.2 .xml 不存在,它构建它们然后在最后删除。如果.1.xml存在,而.2.xml不存在,它将全部重建并删除.2.xml。当然,这不是一个表演障碍,但我想了解 :)

最佳答案

我设法重现了这个问题,但仅限于使用基于模式的目标名称!遗憾的是,.SECONDARY.PRECIOUS 都无法在模式中聚合更多目标(如果目标名称只是纯字符串,它们会按预期工作!)。

不过我找到了解决方法 ( source )。当 .SECONDARY: 与没有关联的目标一起使用时,这实际上会将 ALL 中间目标转换为 .SECONDARY 并解决了问题。

关于保留中间文件的 Makefile 规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30997638/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com