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

问题描述 投票:0回答:1

考虑这个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

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

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

makefile gnu-make
1个回答
1
投票

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

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

(显式)双冒号规则的设计原则是根据哪些先决条件已更改来选择配方。这意味着他们总是彼此独立。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.