Makefile条件语法错误与缺失分隔符问题求助
两段Makefile代码的错误分析与修复
第一段代码的问题
核心错误是ifneq中的filter函数语法违规,同时存在变量展开的细节问题:
filter函数的标准语法是$(filter 匹配模式..., 目标文本),你在$(1)后多写了一个逗号,导致filter参数格式非法,进而让ifneq的条件判断语法失效,触发invalid syntax in conditional错误。$$(info in if $(LIBNAME))中的$(LIBNAME)会在call阶段直接展开,但此时LIBNAME还未定义,应改为$$(LIBNAME)才能在eval执行时正确解析。
修正后的代码:
MAINSUFFIX := -ktest define install_shared_library ifneq ($$(filter hello hello1,$(1)),) LIBNAME := $(1)$$(MAINSUFFIX).lib $$(info in if $$(LIBNAME)) else $$(info in else) endif endef $(eval $(call install_shared_library,lvvm))
第二段代码的问题
你把Shell脚本直接放到了Makefile的顶层逻辑中,但Makefile仅会在规则的命令行(Tab缩进的行)中执行Shell代码。用eval展开后,Shell的if语句被Makefile当作自身语法解析,不符合Makefile的规则格式,因此触发missing separator错误。
以下是两种修复方案:
方案1:放入规则命令中执行
MAINSUFFIX := -ktest define install_shared_library if [ "$(1)" = "hello" -o "$(1)" = "hello1" ]; then \ LIBNAME="$(1)$(MAINSUFFIX).lib"; \ echo "test1: $$LIBNAME"; \ else \ echo "test else"; \ fi endef # 通过规则的Tab缩进命令执行Shell逻辑 all: $(call install_shared_library,lvvm)
方案2:用shell函数在解析阶段执行
MAINSUFFIX := -ktest define install_shared_library $$(shell if [ "$(1)" = "hello" -o "$(1)" = "hello1" ]; then \ LIBNAME="$(1)$(MAINSUFFIX).lib"; \ echo "test1: $$LIBNAME"; \ else \ echo "test else"; \ fi) endef $(eval $(call install_shared_library,lvvm))
内容的提问来源于stack exchange,提问作者vam
相关产品推荐
相关产品推荐

