【发布时间】:2020-06-21 05:14:41
【问题描述】:
为什么这个 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 问题一样)。
- when multiple pattern rules match a target
- Makefile implicit rule matching - prefix length not affecting match
> 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
我很困惑为什么添加到特定规则的前置条件会导致匹配一般规则。
【问题讨论】:
-
你能制作你使用的 gnu 版本吗?它会更容易排除故障
-
我的帖子中有一个代码 sn-p 显示版本
4.2.1 -
这对我来说似乎是一个错误。您应该考虑通过 bug-make@gnu.org 或在 Savannah savannah.gnu.org/bugs/?func=additem&group=make 报告它
-
谢谢。只是想在提交错误报告之前确认这不是我的用户错误。这是:savannah.gnu.org/bugs/index.php?58639