首页 > 解决方案 > GNU make 不匹配最短的词干

问题描述

为什么这个 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

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

标签: makefilegnu-make

解决方案


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

这不是错误:这是由于文档中的以下声明

但是请注意,其先决条件实际存在或被提及的规则始终优先于具有必须通过链接其他隐式规则建立的先决条件的规则。

我真的很抱歉,这完全是我不仔细阅读的不好:(。


推荐阅读