没有配方的Makefile模式规则

13

我正在观察 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

也就是说,具有配方(即使是空配方)的模式规则有效,而没有配方的不起作用。我在理解它应该如何工作方面是否遗漏了什么?


你所称之为“recipe”,我们称之为“制作规则”。因此,它的信息与您认为它应该执行的相符:有一个freddy-wolf的规则,但没有“制作 freddy-wolf”的规则。 - reinierpost
2
@reinierpost:GNU Make 3.82版本包含了一次史诗般的文档搜索/替换,创建了“recipe”这个术语来表示用于更新规则目标的一组命令。因此,(1)这不仅仅是m1tk4的术语,(2)这对我来说也是一个惊喜。请参见http://cvs.savannah.gnu.org/viewvc/make/doc/make.texi?root=make&view=log的r1.51。 - John Marshall
@John Marshall:嗯...好的,知道了,谢谢。(在Cygwin更新之前我使用的是3.81版本。) - reinierpost
1个回答

16
没有任何配方的模式规则说明其含义与提供配方(即使是空配方)的规则截然不同。相反,它们会取消任何现有的隐式规则。因此,您的“%-wolf”模式实际上用于取消任何现有的%-wolf-animal -> %-wolf 的隐式规则。而且本来就没有这样的规则。请参见此处了解更多信息。

如何获得模式前提条件规则的所需效果? - RexYuan
2
我讨厌make,这就是为什么。它充满了毫无意义的、基于异常的规则。为什么target: pre-reqs可以这样工作,但pattern-target: pre-reqs却不行?! - Pod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接