Makefile中使用eval函数遇问题:无法为SOURCES等变量赋值
解决Makefile中eval执行变量赋值不生效的问题
你遇到的问题核心原因是__add_sources定义里的赋值语句带有前导空格,Makefile会将带前导空格的行识别为shell命令执行,而非变量赋值操作,因此eval执行时无法正确更新SOURCES和OBJECTS变量。
修正后的代码
首先调整__add_sources的定义,去掉前导空格并简化冗余逻辑:
rwildcard = $(wildcard $(addprefix $1,$2)) $(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2)) define __add_sources SOURCES += $(call rwildcard,$(realpath $1)/,*.c *.S) OBJECTS = $$(addprefix $(OBJDIR)/,$$(addsuffix .o,$$(subst $(realpath $1)/,$2,$$(filter $(realpath $1)/%,$$(SOURCES))))) endef
然后直接用eval调用即可:
_ = $(eval $(call __add_sources,src,))
关键修正点说明
- 移除前导空格:Makefile的变量赋值语句必须顶格书写,前导空格会被判定为规则的命令行,eval执行时会尝试将其当作shell命令运行,而非设置变量。
- 删除冗余的
_SOURCES变量:原代码中$(SOURCES: %= %)只是单纯复制SOURCES变量,完全没有必要,直接使用$$(SOURCES)即可。 - 优化路径过滤逻辑:将
$(call rwildcard,$$(_SOURCES))替换为$$(filter $(realpath $1)/%,$$(SOURCES)),因为SOURCES中已经是查找完成的文件路径,直接过滤当前目录下的源文件即可,避免重复调用rwildcard函数。
修正后执行eval调用,SOURCES会正确追加指定目录下的源文件,OBJECTS也会被重新计算为对应的目标文件路径。
内容的提问来源于stack exchange,提问作者NotYourFox
相关产品推荐
相关产品推荐

