Makefile目标模式匹配异常:为何make foo_bar/bar执行报错?
问题:Makefile模式规则匹配失败排查
编写的Makefile规则
%_file: touch $@ foo_%: %_file bar: foo_bar
执行命令后的报错
>make foo_bar make: *** No rule to make target 'foo_bar'. Stop. >make bar make: *** No rule to make target 'foo_bar', needed by 'bar'. Stop.
用户疑问
我刻意未添加.PHONY规则,因为我知道伪目标的依赖始终按字面量解析,不理解为何上述命令无法正常执行,请问我遗漏了什么?
问题原因与解决方法
问题出在命令行的缩进格式上。Makefile有严格的语法要求:规则中的命令行必须以Tab键开头,而你当前的touch $@前面用的是空格缩进。
当Make解析%_file规则时,由于命令行没有用Tab开头,它会判定这个规则没有定义任何可执行命令。后续尝试生成foo_bar时,需要先通过%_file规则生成依赖bar_file,但因为该规则没有有效命令,Make无法创建bar_file,整个规则链因此断裂,最终报错找不到目标。
只需将touch $@前面的空格替换为Tab键,修正后的Makefile如下:
%_file: touch $@ foo_%: %_file bar: foo_bar
此时执行make foo_bar或make bar即可正常运行:Make会先通过%_file规则生成bar_file,再基于foo_%规则(依赖bar_file已存在)认定foo_bar满足要求,完成构建流程。
内容的提问来源于stack exchange,提问作者mcwyrm
相关产品推荐
相关产品推荐

