【问题标题】:How can I create a fallback rule in GNU make?如何在 GNU make 中创建回退规则?
【发布时间】:2019-04-01 10:38:00
【问题描述】:

考虑这个makefile:

default: c

a:: b
    touch a

a:: b
    ls -lt a b
    touch a

c: a
    touch c

输出是这样的:

$ touch b
$ make
touch a
ls -lt a b
-rw-r--r-- 1 tkcook tkcook 0 Apr  1 11:32 a
-rw-r--r-- 1 tkcook tkcook 0 Apr  1 11:31 b
touch a
touch c

我知道双冒号规则允许对同一个目标执行多个规则,但它们仍然都依赖于比要触发的目标更新的先决条件。因此,在这种情况下,我预计a 在执行第一条规则后比b 更新会阻止第二条规则的配方运行,但相反,两个用于生成a 的规则都会被执行。

最终,我正在尝试处理一种情况,即有两种可能的方法来制作目标。一种非常便宜但并不总是有效,而另一种非常昂贵但总是有效。当目标过时时,我基本上想先尝试第一种方法,如果第一种方法失败,然后(仅)回退到第二种方法。鉴于双冒号规则似乎没有实现这一点,我能做些什么呢?

【问题讨论】:

  • 文档没有明确说明,但您的实验似乎表明make 执行某种直接或间接的时间戳缓存。那么,我不确定您到底在问我们什么,因为您似乎已经回答了自己的问题。 FWIW,我确实注意到您的用例不在文档考虑的用例之列。
  • 好吧,我认为问题的最后一部分表明了我想要实现的目标。如果出于某种原因,a 的第一个配方中的 touch 失败,则应运行第二个配方,否则仅应运行第一个配方。

标签: makefile gnu-make


【解决方案1】:

为什么执行 a 的两个规则都执行,即使第一个执行的 a 比 b 更新?

请记住,在执行配方时 make 只检查退出代码。它从不关心目标文件是否已创建,甚至不提及它们的时间戳。

(显式)双冒号规则的设计目的是根据先决条件的变化来选择配方。这意味着它们始终相互独立。

我基本上想尝试第一种方法,如果这不起作用,请改用另一种方法,但两种方法都会执行。

使用带有“or-ed”命令的单个配方,例如./script1 || ./script2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-02
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    相关资源
    最近更新 更多