没有食谱的makefile模式规则

m1t*_*tk4 9 makefile rules

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

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

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

%-fox: %-fox-animal

%-wolf: %-wolf-animal
Run Code Online (Sandbox Code Playgroud)

最后两个目标之间的差异是"%-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
Run Code Online (Sandbox Code Playgroud)

iethe模式规则有一个配方(虽然是空的)工作,那个没有.我错过了它应该工作的方式吗?

Joh*_*all 12

根本没有食谱的模式规则被记录为与提供食谱的食物有很大不同,甚至是空食谱.相反,他们取消任何预先存在的隐式规则:

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

因此,你的"%-wolf"模式实际上用于取消%-wolf-animal - > % - wolf的任何现有隐式规则.反正没有人.

  • 我讨厌make,这种事情就是原因。它充满了荒谬的、基于例外的规则。为什么 `target: pre-reqs` 会以一种方式工作,而 `pattern-target: pre-reqs` 会以另一种方式工作?! (2认同)