You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,))

关键修正点说明

  1. 移除前导空格:Makefile的变量赋值语句必须顶格书写,前导空格会被判定为规则的命令行,eval执行时会尝试将其当作shell命令运行,而非设置变量。
  2. 删除冗余的_SOURCES变量:原代码中$(SOURCES: %= %)只是单纯复制SOURCES变量,完全没有必要,直接使用$$(SOURCES)即可。
  3. 优化路径过滤逻辑:将$(call rwildcard,$$(_SOURCES))替换为$$(filter $(realpath $1)/%,$$(SOURCES)),因为SOURCES中已经是查找完成的文件路径,直接过滤当前目录下的源文件即可,避免重复调用rwildcard函数。

修正后执行eval调用,SOURCES会正确追加指定目录下的源文件,OBJECTS也会被重新计算为对应的目标文件路径。

内容的提问来源于stack exchange,提问作者NotYourFox

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 11:00:05