GNU Make执行eval调用模板报错recipe commences before first target如何解决?
问题根因
- 核心诱因是
this_template模板定义内部的行首存在未被注意的制表符(TAB字符):GNU Make语法中,所有以TAB开头的行都会被默认判定为某个目标的构建菜谱;当你通过$(eval)展开模板时,这些带TAB前缀的变量赋值行被直接插入到Makefile的执行上下文里,此时上下文还未声明任何目标,就直接触发了「recipe commences before first target」的报错。 - 补充说明:
define定义的多行模板会完整保留每一行的行首空白字符,你写模板时不小心加在变量赋值前的TAB不会被自动忽略,会原封不动出现在展开结果中。
验证方案
可以在util/make.mk的eval行前新增一行调试代码,打印模板展开后的原始内容确认行首字符:
$(info 展开后的模板内容:$(call this_template,UTIL,$(VAR1),plutil,$(VAR2)))
运行make后即可直观看到展开内容里的行首是否存在TAB。
修复方法
将this_template内部所有变量赋值行开头的TAB全部替换为空格即可,普通变量赋值不需要行首TAB前缀,只有真正的目标构建菜谱才需要使用TAB前缀。
内容的提问来源于stack exchange,提问作者Daniel Walker
相关产品推荐
相关产品推荐

