为何无执行动作时Make不展开依赖中的stem?如何解决?
为什么
make bar-aa失败?原因与解决办法 问题原因
Make对模式规则的处理有明确区分:
- 带命令的模式规则(比如
foo-%: dep-%后跟着@echo in foo $*):这是完整的生成规则,明确告知Make通过构建依赖+执行命令来生成目标。即使目标文件不存在,Make也会执行规则完成构建。 - 不带命令的模式规则(比如
bar-%: dep-%):这类规则仅用于声明目标与依赖的关系,但没有定义如何从依赖生成目标。此时Make会默认认为目标是实际存在的文件,或能通过其他隐式规则从依赖转换生成。
你的场景中bar-aa不是实际文件,也没有其他规则能从dep-aa生成bar-aa,所以Make判定没有可用的生成规则,直接报错。
解决办法
针对这种仅需触发依赖构建、无需生成实际文件的场景,有两种常用方案:
方案1:添加空命令
给bar-%规则添加一行空命令@:,明确告诉Make这是一个可执行的生成规则,执行完依赖构建后无需额外操作:
foo-%: dep-% @echo in foo $* bar-%: dep-% @: dep-%: @echo in dep $*
执行make bar-aa会输出:
in dep aa
方案2:声明为伪目标
通过.PHONY声明所有bar-*为伪目标,告诉Make这些目标不是实际文件,无需检查存在性,直接执行依赖构建:
.PHONY: bar-% foo-%: dep-% @echo in foo $* bar-%: dep-% dep-%: @echo in dep $*
同样能正常执行make bar-aa并触发dep-aa的构建。
扩展到多依赖场景
对于你提到的多依赖模式(比如foo-%: abc-% def-% xyz-%),如果规则无需生成实际文件,同样可以用上述两种方法解决:要么给规则添加空命令,要么将目标声明为伪目标,确保Make只会触发所有依赖的构建流程。
内容的提问来源于stack exchange,提问作者deitch
相关产品推荐
相关产品推荐

