Makefile 如何在GNU make中创建回退规则?

Makefile 如何在GNU make中创建回退规则?,makefile,gnu-make,Makefile,Gnu Make,考虑这个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 我知道双冒号

考虑这个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
的两条规则都会执行

最终,我试图处理一种情况,在这种情况下,有两种可能的方式来确定目标。一个非常便宜但不总是有效,而另一个非常昂贵但总是有效。当目标已过时时,我基本上希望先尝试第一种方法,然后在第一种方法失败时返回到第二种方法。考虑到双冒号规则似乎无法实现这一点,我可以做些什么来替代呢

尽管第一条规则生成的a比b新,为什么两条规则都要执行

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

设计(显式)双冒号规则的目的是根据哪些先决条件发生了更改来选择配方。这意味着它们总是相互独立的

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

使用带有“或ed”命令的单一配方,如
/script1 | |./script2

尽管第一条规则生成的a比b新,为什么两条规则都要执行

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

设计(显式)双冒号规则的目的是根据哪些先决条件发生了更改来选择配方。这意味着它们总是相互独立的

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


使用带有“或ed”命令的单一配方,如
/script1 | |./script2

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