为何该Makefile未按预期运行?添加call才生效的原因
Makefile变量展开与函数调用的区别
原写法失效的原因
原代码中foo := $($(func) $(bar))的展开逻辑是:
- 先展开
$(func)得到sort,展开$(bar)得到a d b g q c; - 此时整个表达式变为
$(sort a d b g q c),但这不符合Makefile的语法规则——普通$()变量展开的括号内只能是单一变量名,这里的sort a d b g q c是带空格的字符串,不存在同名变量,因此展开结果为空,最终foo的值是空字符串,执行echo $(foo)自然只输出echo。
修改后生效的原因
$(call $(func), $(bar))是Makefile专门用于间接调用函数的内置语法:
- 它会把第一个参数解析为函数名(这里就是
sort); - 将后续参数(
$(bar)展开后的a d b g q c)传递给该函数; - 最终执行
sort内置函数对参数排序,得到a b c d g q并赋值给foo,所以执行echo $(foo)能输出预期内容。
补充说明:如果直接写$(sort a d b g q c)是可以正常调用排序函数的,但当函数名通过变量(如$(func))间接引用时,必须用$(call)来明确分隔函数名和参数,否则Makefile会把整个内容当作变量名处理,无法识别为函数调用。
内容的提问来源于stack exchange,提问作者mueller tee
相关产品推荐
相关产品推荐

