【发布时间】: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失败,则应运行第二个配方,否则仅应运行第一个配方。