GNU Makefile:防止中间文件被删除的单个规则的多个输出

前端之家收集整理的这篇文章主要介绍了GNU Makefile:防止中间文件被删除的单个规则的多个输出前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这是 here的一个问题的延续.问题是有一个规则从单个输入生成多个输出,并且该命令是耗时的,所以我们宁愿避免重新计算.现在还有一个额外的扭曲,我们希望保持文件不被删除为中间文件,并且规则涉及通配符以允许参数.

解决方案建议是我们设定了以下规则:

file-a.out: program file.in
    ./program file.in file-a.out file-b.out file-c.out

file-b.out: file-a.out
    @

file-c.out: file-b.out
    @

然后,调用make file-c.out创建两个,我们避免与-j开关并行运行make的问题.到目前为止都很好.

问题是如下.因为上述解决方案在DAG中设置了一个链,所以考虑不同;文件file-a.out和file-b.out被视为中间文件,并且在文件c.out准备好之后,它们默认情况下被删除为不必要的.

一种避免这种情况的方法在这里被提到,它包括将file-a.out和file-b.out添加为目标的依赖关系.SECONDARY,它们不会被删除.不幸的是,这并不能解决我的情况,因为我的规则使用通配符;具体来说,我的规则看起来更像这样:

file-a-%.out: program file.in
    ./program $* file.in file-a-$*.out file-b-$*.out file-c-$*.out

file-b-%.out: file-a-%.out
    @

file-c-%.out: file-b-%.out
    @

以便可以传递文件名中包含的参数,例如运行

make file-c-12.out

提供文档的解决方案是将这些隐式规则添加到.PRECIoUS的依赖关系列表中,从而保持这些文件不被删除.

具有.PRECIoUS的解决方案可以起作用,但是当规则失败并且文件不完整时也可以防止这些文件删除.有没有其他方法来做这项工作?

解决这个问题的一个难点是定义一个没有先决条件的目标.SECONDARY,即,

.SECONDARY:

通知所有文件应被视为次要的,因此不会被删除,除非当make被中断或规则失败.不幸的是,这不允许选择一个使用通配符的规则子集来工作,所以我认为这只是一个黑客(即使它很有用).

解决方法

最简单的事情
file-a-%.out file-b-%.out file-c-%.out: program file.in
    ./program $* file.in file-a-$*.out file-b-$*.out file-c-$*.out

会做你想做的事情

(具有多个目标的模式规则与正在要求的多个目标的正常规则不同,请参见here.参见make manual中的野牛示例)

原文链接:https://www.f2er.com/c/115012.html

猜你在找的C&C++相关文章