添加@echo语句后Makefile报‘missing separator’错误求助
解决Makefile中添加echo导致的"missing separator"错误
问题根源
你定义的bootimage-to-kernel宏是用来返回依赖目标路径的,它被作为add-dependency的参数使用,属于Make的解析阶段逻辑,而非规则的命令执行阶段。你添加的@echo "test"是Shell命令,只能在规则的命令块(需要Tab缩进)中使用,放在宏里会破坏依赖定义的语法结构,导致Make解析时抛出missing separator错误。
解决方案
方案1:用Make内置函数替代Shell echo
把@echo换成Make的$(info)函数,它会在Make解析阶段输出信息,不会干扰依赖定义:
define bootimage-to-kernel $(info "test") $(if $(BOARD_KERNEL_BINARIES),\ $(PRODUCT_OUT)/$(subst .img,,$(subst boot,kernel,$(notdir $(1)))),\ $(INSTALLED_KERNEL_TARGET)) endef
方案2:在宏外部添加调试输出
如果不想修改宏本身,可以在调用宏的foreach循环中单独添加调试逻辑,确保宏只负责返回路径:
$(foreach b,$(INSTALLED_BOOTIMAGE_TARGET), \ $(info Processing boot image: $(b)) \ $(eval $(call add-dependency,$(b),$(call bootimage-to-kernel,$(b)))) \ )
关键说明
- Make宏分为两种:一种是用来生成命令的(需要Tab缩进命令),另一种是用来计算值/路径的(纯Make表达式)。你的
bootimage-to-kernel属于后者,不能包含Shell命令。 @echo是Shell命令,必须出现在规则的命令部分(以Tab开头),否则会被Make当作规则语法的一部分,触发格式错误。
内容的提问来源于stack exchange,提问作者Gooberpatrol66
相关产品推荐
相关产品推荐

