makefile - 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
我很困惑为什么添加到特定规则的先决条件会导致匹配一般规则。
解决方案
抱歉,当我建议您提交错误时,我没有足够仔细地阅读您的问题,并且对应该匹配的先决条件感到困惑,但是您想知道为什么初始规则不匹配。
这不是错误:这是由于文档中的以下声明:
但是请注意,其先决条件实际存在或被提及的规则始终优先于具有必须通过链接其他隐式规则建立的先决条件的规则。
我真的很抱歉,这完全是我不仔细阅读的不好:(。
推荐阅读
- node.js - 使用临时消息不工作的松弛回复 response_url
- python - 即使安装了依赖项,app.py 上的 Flask 导入错误
- html - Colgroup 和 Col 在桌面上不可见
- javascript - 如何编写函数以便在未定义参数时省略代码?
- internet-explorer - Internet Explorer 是否有超时设置?
- javascript - mousedown 事件未触发 - 带有 vue 的 fabric.js
- r - 如何在 R 中将 2 列转换为 2 行?
- c - pipe() 数据不会传输到子进程
- kotlin - Kotlin,VSCode 中所有内容的未解决参考
- c++ - Valgrind 检测未释放的堆内存使用情况