GNU make 不匹配最短的词干

GNU make not matching shortest stem

为什么这个 makefile 中没有匹配最短的词干?

foo/%/baz:
    @echo "Prereq - stem $*"

foo/%/baz/thing.txt: foo/%/baz
    @echo "Good match - stem $*"

foo/%:
    @echo "Bad match - stem $*"

这是输出:

> make foo/bar/baz/thing.txt
Bad match - stem bar/baz/thing.txt

我希望 make 匹配更具体(较短的词干)foo/%/baz/thing.txt 而不是 foo/%

这不是版本 3.81 问题(其他两个类似的 SO 问题就是这种情况)。

> make --version            
GNU Make 4.2.1

我可以通过以下任一方式实现预期的行为:

删除更通用的规则

foo/%/baz:
    @echo "Prereq - stem $*"

foo/%/baz/thing.txt: foo/%/baz
    @echo "Good match - stem $*"
> make foo/bar/baz/thing.txt
Prereq - stem bar
Good match - stem bar

正在从更具体的规则中删除先决条件

foo/%/baz:
    @echo "Prereq - stem $*"

foo/%/baz/thing.txt:
    @echo "Good match - stem $*"

foo/%:
    @echo "Bad match - stem $*"
> make foo/bar/baz/thing.txt
Good match - stem bar

我很困惑为什么添加到特定规则的先决条件会导致匹配一般规则。

抱歉,当我建议您提交错误时,我没有足够仔细地阅读您的问题,并且很困惑这是应该匹配的先决条件,但您想知道为什么初始规则不匹配。

这不是错误:这是由于文档中的 this statement

Note however, that a rule whose prerequisites actually exist or are mentioned always takes priority over a rule with prerequisites that must be made by chaining other implicit rules.

真的很抱歉,完全是我没看仔细:(.