保留中间文件的Makefile规则
为了调试复杂的XSLT转换,我将其分为几个部分:首先构建保留中间文件的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,并产生相同的负面
%.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中复制它。请创建一个独立的小示例并发布它。它有一些逻辑:左侧没有匹配右侧的模式,因此它会忽略它。我想通配符也可以。