GNU make中如何使用变量值作为函数名完成call调用?
Makefile 动态遍历列表调用函数解决方案
问题根因
Make 内置的$(call)属于Make预展开阶段执行的操作,会在整个目标的recipe被完整传递给Shell执行前就完成计算。而你代码里的$$comp是Shell层面的变量,要等到Shell实际运行循环的时候才会被赋值,此时Make早就结束了call的解析流程,根本拿不到$$comp对应的实际值,自然无法正确调用对应函数。
你遇到的语法报错也是同理:$(call $$comp)展开后是无效的残缺内容,传给Shell后缺少合法的语句结束标记,才会抛出unexpected end of file错误;写死函数名时$(call FUNCTION)能正常展开为完整的命令行,补充分号和续行符后Shell就能正常解析。
解决方法:用Make层面的遍历替代Shell循环
最稳妥的实现方式是把遍历逻辑放在Make层处理,直接用foreach函数遍历处理后的列表,逐个调用目标函数,完全避开展开时机冲突,示例代码如下:
# 预先定义你要调用的各业务函数(样例) define func1 @echo "执行函数 func1" echo "func1 生成的内容" >> target.txt endef define func2 @echo "执行函数 func2" echo "func2 生成的内容" >> target.txt endef # 替换为你自己的LIST变量即可 LIST := src/func1.c src/func2.c .PHONY: GEN_BAT GEN_BAT: $(foreach comp,$(basename $(notdir $(LIST))),$(call $(comp));)
这种写法不需要处理Shell循环的续行符,所有函数调用都由Make直接解析,不会出现语法适配问题。
内容的提问来源于stack exchange,提问作者user3691935
相关产品推荐
相关产品推荐

