没有食谱的makefile模式规则

时间:2010-09-16 16:29:15

标签: makefile rules

我正在观察make的一个有趣的行为,我想知道除了gmake中的错误之外是否还有合理的解释。

假设我们在makefile中有以下内容:

%-animal:
        echo "$* is an animal"

%-fox: %-fox-animal

%-wolf: %-wolf-animal

最后两个目标之间的差异是“%-wolf”没有任何配方,“%-fox”有一个空配方(即只是一行开头有一个标签)。

当我们尝试执行规则时,会发生以下情况:

[root@cv19 tmp]# make freddy-animal
echo "freddy is an animal"
freddy is an animal
[root@cv19 tmp]# make freddy-wolf
make: *** No rule to make target `freddy-wolf'.  Stop.
[root@cv19 tmp]# make freddy-fox
echo "freddy-fox is an animal"
freddy-fox is an animal

即具有配方(虽然是空配方)的模式规则起作用,但不起作用的模式规则起作用。我错过了它应该工作的方式吗?

1 个答案:

答案 0 :(得分:12)

完全没有食谱的模式规则被记录为与提供食谱的食物有很大不同,甚至是空食谱。相反,他们cancel any pre-existing implicit rule

  

您可以通过定义具有相同目标和先决条件但没有配方的模式规则来取消内置隐式规则。

因此,你的“% - 狼”模式实际上用于取消% - 狼 - 动物 - >的任何现有隐式规则。 % - 狼。而且无论如何都没有。