Makefile中基于变量值条件调用函数失败的问题求助
Makefile条件判断失效问题
我编写Makefile时,希望当传入的VALUE值属于预定义列表时执行指定函数,代码如下:
test: VALUES=A B C test: $(eval FOUND=$(filter $(VALUE),$(VALUES))) ifneq ($(FOUND),"") $(call myFunction,arg1,arg2) endif # do other things...
执行命令make VALUE=A test后,$(call myFunction,arg1,arg2)从未被触发。试过去掉eval,也试过用bash条件语句,但后者无法调用Makefile自身的call函数。
问题根源
- 作用域不匹配:规则命令行里的
eval是在Make执行阶段赋值变量FOUND,但ifneq是在Make解析阶段执行的,此时FOUND还未被赋值,判断逻辑自然失效。 - 引号冗余导致匹配失败:
ifneq ($(FOUND),"")中的双引号是多余的,filter返回的是无引号的字符串,和带引号的空串永远无法匹配。
解决办法
方案1:将变量定义与判断放在规则上下文(推荐)
直接在规则中定义FOUND变量,让ifneq在解析阶段就能拿到正确值,同时去掉多余引号:
test: VALUES=A B C test: FOUND=$(filter $(VALUE),$(VALUES)) test: ifneq ($(FOUND),) $(call myFunction,arg1,arg2) endif # do other things...
方案2:用Make内置$(if)函数直接判断
在命令行内使用$(if)函数完成条件判断,无需依赖eval,避免作用域问题:
test: VALUES=A B C test: $(if $(filter $(VALUE),$(VALUES)),$(call myFunction,arg1,arg2)) # do other things...
方案3:全局预定义列表变量
如果VALUES无需局限于单个规则,可以提前全局定义,简化代码:
VALUES := A B C test: ifneq ($(filter $(VALUE),$(VALUES)),) $(call myFunction,arg1,arg2) endif # do other things...
内容的提问来源于stack exchange,提问作者Zerta
相关产品推荐
相关产品推荐

