保留中间文件的 Makefile 规则
Makefile rule to keep intermediate files
为了调试复杂的 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
并解决了问题。
为了调试复杂的 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
并解决了问题。