如何在GNU make中创建后备规则?

时间:2019-04-01 10:38:00

标签: 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

我知道双冒号规则允许对同一目标执行多个规则,但是它们仍然全部取决于要触发的目标比目标新的先决条件。因此,在这种情况下,我希望在执行第一条规则后将ab更新会阻止运行第二条规则的配方,但是,这两个用于制作a的规则被执行。

最终,我正在尝试处理有两种可能的方法来达成目标的情况。一个很便宜,但并不总是能工作,而另一个很贵,但总是能工作。当目标已过期时,我基本上想先尝试第一种方法,然后在第一种方法失败的情况下退回到第二种方法(仅)。鉴于双冒号规则似乎无法实现这一目标,我该怎么办?

1 个答案:

答案 0 :(得分:1)

  

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

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

(显式)双冒号规则的设计目的是根据已更改先决条件的方式选择配方。这意味着它们始终彼此独立。

  

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

通过“或”命令使用单个配方,例如./script1 || ./script2