为了调试复杂的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
都不起作用(如果目标名称只是普通字符串,它们会按预期工作!
不过,我找到了解决方法(来源(。当.SECONDARY:
与没有关联目标一起使用时,这实际上将所有中间目标转换为.SECONDARY
,从而解决了问题。