保留中间文件的Makefile规则

保留中间文件的Makefile规则,makefile,gnu-make,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,并产生相同的负面

为了调试复杂的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,
>
代表
选项卡

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
,从而解决了问题。

显示Makefile!:)我不能在一个简单的makefile中复制它。请创建一个独立的小示例并发布它。它有一些逻辑:左侧没有匹配右侧的模式,因此它会忽略它。我想通配符也可以。