如何在Makefile执行目标前从文件导入键值对变量?
解决Makefile预加载键值对变量的问题
问题根源
你之前的写法无效,是因为Make的export语法和shell的export逻辑不同:Make的export是用来标记Make变量传递到子shell,而非直接执行shell风格的export KEY=value命令。你直接把cat .p4config的结果传给Make的export,Make无法解析这种格式,自然不会把变量注入到目标的shell环境中。
方案一:将.p4config转为Make变量再全局导出
这种方法会在Make解析阶段就加载变量,所有后续目标的子shell都会继承这些变量:
# 把.p4config里空格分隔的键值对拆成每行一个,再逐个转为Make变量 define load_p4_vars $(foreach line,$(shell tr ' ' '\n' < .p4config),$(eval $(line))) endef $(load_p4_vars) # 标记这些变量,让子shell环境可以访问 export P4PORT P4CLIENT test: env > env.log
tr ' ' '\n' < .p4config:把原文件中的空格替换为换行,让每个键值对单独成行foreach + eval:遍历处理后的每行内容,让Make将其定义为自身的变量export:标记这些Make变量,确保后续目标的子shell能读取到
方案二:仅在目标的shell命令中临时加载变量
如果不需要变量全局生效,只在特定目标执行前加载,可以直接在shell层面处理:
test: # 将.p4config转为每行一个键值对,再加载到当前shell环境 . <(tr ' ' '\n' < .p4config) && env > env.log
<(tr ...):通过进程替换生成临时的每行一个键值对的文件.(等价于source):将临时文件中的变量加载到当前shell,执行env时就能捕获到这些变量
验证效果
执行make test后,打开env.log就能看到P4PORT和P4CLIENT已出现在环境变量列表中。
内容的提问来源于stack exchange,提问作者Guy Kedem
相关产品推荐
相关产品推荐

