如何避免将Make变量修改传递给子Make进程?
解决父Make进程变量修改传递给子Make的问题
问题背景
现有两个Makefile文件:
makefile1.mk
MYVARIABLE += change1 $(info var MYVARIABLE: $(MYVARIABLE)) all: make -f makefile2.mk
makefile2.mk
MYVARIABLE += change2 $(info var MYVARIABLE: $(MYVARIABLE)) all:
当前执行MYVARIABLE=term make -f makefile1.mk时,输出为:
var MYVARIABLE: term change1 var MYVARIABLE: term change1 change2
期望实现的输出是:
var MYVARIABLE: term change1 var MYVARIABLE: term change2
即阻止父Make对MYVARIABLE的修改传递给子Make进程。
问题原因
Make默认会将自身定义/修改后的变量导出到子进程的环境中,因此子Make会直接继承父Make中已经追加了change1的MYVARIABLE值,最终导致子Make中追加change2后得到term change1 change2。
解决方案
方案一:阻止父Make导出修改后的变量
在makefile1.mk中添加unexport MYVARIABLE,禁止将修改后的变量传递给子进程,让子Make直接继承原始的环境变量值:
MYVARIABLE += change1 $(info var MYVARIABLE: $(MYVARIABLE)) # 禁止将当前修改后的MYVARIABLE导出到子进程 unexport MYVARIABLE all: make -f makefile2.mk
方案二:保存原始变量值并显式传递给子Make
在父Make中先保存MYVARIABLE的原始环境值,调用子Make时显式传递该初始值:
# 保存从环境传入的原始MYVARIABLE值 MYVARIABLE_ORIGINAL := $(MYVARIABLE) MYVARIABLE += change1 $(info var MYVARIABLE: $(MYVARIABLE)) all: # 显式将原始值传递给子Make make -f makefile2.mk MYVARIABLE=$(MYVARIABLE_ORIGINAL)
验证效果
执行MYVARIABLE=term make -f makefile1.mk,输出将符合预期:
var MYVARIABLE: term change1 var MYVARIABLE: term change2
内容的提问来源于stack exchange,提问作者vfjpl
相关产品推荐
相关产品推荐

