【问题标题】:Trigger missing dependencies in (parallel) GNU make by changing order of execution通过更改执行顺序触发(并行)GNU make 中缺少的依赖项
【发布时间】:2014-04-11 23:59:48
【问题描述】:

假设我有一个 Makefile:

a.out:
    sleep 3
    touch a.out a1

b.out:
    cat a1 > b.out

c.out: a.out b.out
    cat a.out b.out > c.out

make c.out通常会成功,因为 a.out 的命令在 b.out 的命令之前执行。但是make b.out 会失败(在一个干净的目录中),make -j c.out 也会失败。

由于在现实生活中很少有sleep 3,因此该错误只会非常随机地显示,我正在寻找一种方法以更高的概率消除此类错误。一个想法是颠倒“在同一级别”的目标的执行顺序:由于测试套件通常会触发第一代 a.out,然后是 b.out,如果生成的是第一个 b.out,则错误会表面。

在 GNU make 中有没有办法做到这一点?

【问题讨论】:

  • make b.out (在一个干净的目录中)将非常可靠地失败。解决方案 (b.out: a.out) 将解决 c.out 故障。那么有什么问题呢?
  • @Beta 问题是什么:如何以更高的概率找到那些错误,以便make -j 不会给出 schrödinbugs。
  • OP 问题最好表述为“如何发现 GNU make 中目标的依赖关系之间未说明的依赖关系?”

标签: gnu-make


【解决方案1】:

Paul Smith 在help-make@gnu.org 上回复说,当前的 GNU make 无法做到这一点。

【讨论】:

    【解决方案2】:

    目标依赖项的单一重新排序最有可能揭示目标依赖项之间未声明的依赖项是目标依赖项的反向排序

    您可以通过使用条件执行的依赖部分测试Makefile 来实现反向排序,例如:

    a.out: b.out
    

    对于更长的依赖列表,这将是:

    a.out: b.out
    b.out: d.out
    d.out: e.out
    :
    :
    

    【讨论】:

      猜你喜欢
      • 2023-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-05
      • 1970-01-01
      • 2015-05-09
      • 1970-01-01
      相关资源
      最近更新 更多