考虑此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
的规则被执行。
最终,我正在尝试处理有两种可能的方法来达成目标的情况。一个很便宜,但并不总是能工作,而另一个很贵,但总是能工作。当目标已过期时,我基本上想先尝试第一种方法,然后在第一种方法失败的情况下退回到第二种方法(仅)。鉴于双冒号规则似乎无法实现这一目标,我该怎么办?
答案 0 :(得分:1)
为什么即使第一个规则比b的规则都新,这两个规则也要被执行?
请记住,在执行配方时 make
仅检查退出代码。 从不不关心目标文件是否已创建,甚至不提及其时间戳。
(显式)双冒号规则的设计目的是根据已更改先决条件的方式选择配方。这意味着它们始终彼此独立。
我基本上想尝试第一种方法,如果那不起作用,请改用另一种方法,但是两种方法都会执行。
通过“或”命令使用单个配方,例如./script1 || ./script2