我正在尝试为我的 Makefile 创建一个通用的构建模板,就像他们在eval 文档中讨论的那样。
我遇到了 GNU Make 3.80 的一个已知错误。当 $(eval) 计算超过 193 个字符的行时,Make 崩溃并出现“虚拟内存耗尽”错误。
我拥有的导致问题的代码如下所示。
SRC_DIR = ./src/
PROG_NAME = test
define PROGRAM_template
$(1)_SRC_DIR = $$(SRC_DIR)$(1)/
$(1)_SRC_FILES = $$(wildcard $$($(1)_SRC_DIR)*.c)
$(1)_OBJ_FILES = $$($(1)_SRC_FILES):.c=.o)
$$($(1)_OBJ_FILES) : $$($(1)_SRC_FILES) # This is the problem line
endef
$(eval $(call PROGRAM_template,$(PROG_NAME)))
当我运行这个 Makefile 时,我得到
gmake: *** virtual memory exhausted. Stop.
预期的输出是 ./src/test/ 中的所有 .c 文件都被编译成 .o 文件(通过隐式规则)。
问题是 $$($(1)_SRC_FILES) 和 $$($(1)_OBJ_FILES) 一起超过 193 个字符(如果有足够的源文件)。
我尝试在只有 2 个 .c 文件的目录上运行 make 文件,它工作正常。只有当 SRC 目录中有许多 .c 文件时,我才会收到错误消息。
我知道 GNU Make 3.81 修复了这个错误。不幸的是,我没有权限或能力在我正在使用的系统上安装更新版本。我被困在3.80。
那么,有什么解决方法吗?也许将 $$($(1)_SRC_FILES) 拆分并在评估中单独声明每个依赖项?