Makefile规则保存中间文件

时间:2015-06-23 08:29:02

标签: makefile gnu-make

要调试复杂的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。当然,这不是一个表演者,但我想明白:)

1 个答案:

答案 0 :(得分:4)

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

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