MacOS下通过Make目标导出环境变量并跨目标访问的方法
解决Make目标间共享环境变量的问题
你的写法问题在于:Make会为目标里的每一行命令单独启动一个子shell,export命令只在当前行的子shell中生效,shell结束后变量就消失了,其他目标根本访问不到。下面给你两种可行的解决方案:
方案1:全局声明可继承的环境变量
如果变量值可以提前确定(或通过shell命令预生成),直接在Makefile开头用export关键字定义,这样所有目标的shell命令都能继承这个变量:
# 直接定义并导出全局环境变量 export MY_ENV_VAR = $(shell echo "Bang") .PHONY: exporttest other-target exporttest: # 注意shell里的$要写成$$,避免被Make解析 echo $$MY_ENV_VAR other-target: # 其他目标也能访问到这个变量 echo $$MY_ENV_VAR
方案2:动态生成变量并传递给后续目标
如果需要在某个目标里动态生成变量值,再让其他目标使用,可以借助Make的eval指令先把变量设为Make变量,再导出:
.PHONY: set-variable use-variable set-variable: # 动态生成变量值并导出 $(eval MY_ENV_VAR := $(shell echo "Bang")) $(eval export MY_ENV_VAR) # 依赖set-variable目标,确保变量先被设置 use-variable: set-variable echo $$MY_ENV_VAR
如果只是在同一个目标的多个命令里共享变量,把命令放在同一个子shell里即可(用分号或反斜杠连接):
.PHONY: exporttest exporttest: # 同一个子shell里执行,变量持续有效 export MY_ENV_VAR=$(shell echo "Bang"); \ echo $$MY_ENV_VAR; \ echo "变量还能用:$$MY_ENV_VAR"
你同事的Mac上能生效,大概率是他把export和使用变量的命令放在了同一个子shell里,或者用了全局导出的写法,变量才没有随子shell结束而消失。
内容的提问来源于stack exchange,提问作者noob-dev
相关产品推荐
相关产品推荐

