Makefile使用@echo报missing separator错误,如何正确打印xv6的TOOLPREFIX变量?
Makefile打印变量的正确方案
错误核心原因
Makefile语法规定,@echo这类Shell执行命令属于目标构建规则(Recipe),必须依附在某个目标定义下,不能直接写在全局无归属的位置,这是你调整位置、加Tab/去@都报错的根本原因:
- 无Tab放在全局:Makefile无法识别该行类型,报
missing separator错误 - 加Tab放在全局:Makefile识别为构建规则,但找不到对应的归属目标,报
recipe commences before first target错误 - 放在文件底部无归属目标:和全局放置逻辑一致,同样触发语法错误
三种可行实现方案
方案1:全局直接打印(最适配你的需求)
直接使用Makefile内置的info函数,不需要依附目标,直接把原来的echo行替换成下面的内容,放在你原来的第34行位置即可:
$(info ============= $(TOOLPREFIX) =================)
Makefile解析到该行时会直接打印变量值,无额外输出,也不会触发语法报错。
方案2:嵌入现有目标执行
如果你需要用Shell的echo命令(比如后续要扩展Shell逻辑),可以把命令放到xv6默认的all目标的构建规则最开头,注意行首必须是Tab字符(不能是多个空格):
# 找到Makefile里的all目标定义,修改为如下格式 all: xv6.img fs.img @echo "============= $(TOOLPREFIX) =================" # 原有all目标的其他构建命令保持不动
运行任意make命令触发all目标时,就会先打印变量值。
方案3:单独定义打印目标
如果你需要只打印变量、不执行其他构建操作,可以在Makefile任意位置新增一个自定义目标:
print-toolprefix: @echo "============= $(TOOLPREFIX) ================="
之后执行make print-toolprefix命令,就会单独输出TOOLPREFIX的变量值。
注意:如果使用方案2、3时仍然报分隔符错误,请检查命令行首是否为真正的Tab字符,部分编辑器默认会将Tab自动转换为空格,不符合Makefile的语法要求。
内容的提问来源于stack exchange,提问作者zzzhhh
相关产品推荐
相关产品推荐

