GNU make重启时能否保留全部或部分指定变量的内容?
GNU Make重启保留变量的解决方法
问题原因
普通Make变量仅在当前make运行上下文生效,make重启重新解析Makefile时不会保留之前上下文的普通变量值,因此重启后读取会出现未定义的情况。
最优解决方案:通过MAKEFLAGS传递变量
GNU make重启时会自动继承MAKEFLAGS中的变量定义,相当于把变量作为命令行参数传递给新的make进程,不受环境变量限制,兼容性最好。
基础用法示例
# 仅第一次运行时执行赋值和变量传递逻辑 ifeq ($(MAKE_RESTARTS),) TEST_VAR := hello # 把变量追加到MAKEFLAGS中,重启时自动携带 export MAKEFLAGS += TEST_VAR=$(TEST_VAR) endif # 重启后可正常读取变量值 $(if $(MAKE_RESTARTS),$(info 重启后TEST_VAR值为: $(TEST_VAR)))
场景适配:存储构建启动时间计算耗时
如果要存储启动时间这类动态生成的值,可直接按以下写法实现:
ifeq ($(MAKE_RESTARTS),) # 第一次运行时生成Unix时间戳 BUILD_START := $(shell date +%s) export MAKEFLAGS += BUILD_START=$(BUILD_START) endif # 示例:构建目标打印总耗时 all: @echo "构建总耗时:$$(( $(shell date +%s) - $(BUILD_START) )) 秒"
可选方案:导出为环境变量
如果你的构建环境没有特殊的环境变量隔离限制,也可以直接把变量导出为环境变量,重启时会继承环境变量值:
ifeq ($(MAKE_RESTARTS),) export TEST_VAR := hello endif
注意事项
- 所有变量赋值逻辑必须放在
ifeq ($(MAKE_RESTARTS),)的判断块内,仅在第一次运行时执行,避免重启后重新赋值覆盖旧值 - 如果变量值包含空格、特殊符号,需要用单引号包裹值,比如
TEST_VAR:='hello world',避免MAKEFLAGS解析出错
内容的提问来源于stack exchange,提问作者vjalle
相关产品推荐
相关产品推荐

