加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 05:17:18 所属栏目:百科 来源:网络整理
导读:这是 here的一个问题的延续.问题是有一个规则从单个输入生成多个输出,并且该命令是耗时的,所以我们宁愿避免重新计算.现在还有一个额外的扭曲,我们希望保持文件不被删除为中间文件,并且规则涉及通配符以允许参数. 解决方案建议是我们设定了以下规则: file-a.
这是 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中的野牛示例)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读