没有配方的makefile模式规则

没有配方的makefile模式规则,makefile,rules,Makefile,Rules,我正在观察make的一个有趣行为,我想知道除了gmake中的一个bug之外,是否还有一个合理的解释 假设makefile中有以下内容: %-animal: echo "$* is an animal" %-fox: %-fox-animal %-wolf: %-wolf-animal 最后两个目标之间的区别在于“%-wolf”没有任何配方,“%-fox”有一个空配方(即,只有一行开头有一个选项卡) 当我们尝试执行规则时,会发生以下情况: [root@cv19 tmp]# m

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

假设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

i、 有配方(尽管是空配方)的模式规则有效,没有配方的模式规则无效。我是不是在它的工作方式上遗漏了什么?

完全没有配方的模式规则被记录为与提供配方的规则(甚至是空的)有很大不同的含义。相反,他们:

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


因此,您的“%-wolf”模式实际上用于取消%-wolf animal->%-wolf的任何现有隐式规则。反正也没有一个。

你所谓的“食谱”,叫“制定规则”。因此,它的信息与您认为它应该做的是一致的:freddy wolf有一条规则,但没有“生成freddy wolf”的规则。@reinierpost:GNU make 3.82版本包括一个epic documentation search/replace,为用于更新规则目标的命令集创建术语“recipe”。所以(1)这不仅仅是m1tk4的术语,(2)这对我来说也是一个惊喜。见@John Marshall:hmmm的r1.51。。。很高兴知道,谢谢。(我在3.81上,直到Cygwin更新它。)如何获得模式先决条件规则的预期效果?