Makefile调用自定义函数执行ifeq字符串对比出现语法错误如何解决?
问题根因
你出现报错的核心原因是混淆了Make语法和Shell语法的执行层级:你将Make专属的ifeq条件判断块写在了define定义的函数内部,该函数在test规则中被call展开后,ifeq相关的所有语句都会被Make当作要执行的Shell命令直接传递给Shell解释器。Shell本身不识别ifeq语法,所以直接抛出解析错误,和KEYWORD的赋值、对比写法没有关系。
两种可行修复方案
方案1:使用Make级别的条件函数,在展开阶段完成判断
用Make内置的if+filter函数替代ifeq块,逻辑在Make展开函数时就执行,不会传递给Shell:
KEYWORD=Nothing define myFunc $(if $(filter Apple,$(KEYWORD)),echo "You have found the key",echo "Try again") endef test: $(call myFunc)
执行时不管是make test KEYWORD=Apple还是make test KEYWORD="Apple"都可以正常运行,Shell传递参数时会自动去掉引号,Make拿到的KEYWORD值都是纯字符串Apple。
方案2:完全使用Shell层面的条件判断
所有逻辑都用Shell语法实现,注意字符串对比用=而非整数对比的-eq,如果要在Shell语句中使用Shell变量,需要对$转义避免被Make提前解析:
KEYWORD=Nothing define myFunc if [ "$(KEYWORD)" = "Apple" ]; then echo "You have found the key" else echo "Try again" fi endef test: $(call myFunc)
之前尝试方案失败的原因
- 调整
ifeq的对比值、逗号后空格:没有解决ifeq被传给Shell执行的根本问题,所以无效 - 调整命令行赋值的引号:Shell执行make命令前就会把引号剔除,你传
KEYWORD="Fork"和KEYWORD=Fork,Make拿到的KEYWORD值完全相同,不会有任何区别 - 尝试Shell语法时用了
-eq:-eq是Shell专属的整数对比运算符,用于字符串对比本身就会报错,所以无效
内容的提问来源于stack exchange,提问作者Ringularity
相关产品推荐
相关产品推荐

