在make中能否判断环境变量是否已定义?
Makefile环境变量检测方案
首先纠正一个常见认知误区:make 启动时会默认将父Shell中已导出的所有环境变量自动加载为内部变量,常规的 ifdef 本身就可以识别这类环境变量,只是无法区分变量是来自系统环境还是Makefile内部自定义。
如果需要不同精度的检测,可以选择以下两种方案:
- 方案1:粗略检测变量是否存在(不区分来源,兼容环境变量)
直接使用ifdef即可,前提是对应环境变量在启动make前已经通过export命令导出到Shell环境:
# 示例:检测变量MY_ENV是否存在 ifdef MY_ENV $(info 已检测到变量MY_ENV,值为:$(MY_ENV)) else $(info 未检测到变量MY_ENV) endif
- 方案2:精准检测变量是否来自系统环境
如果需要排除Makefile内部自定义同名变量的干扰,用origin函数判断变量来源是否为environment即可:
# 示例:精准判断MY_ENV是否为系统环境变量 ifeq ($(origin MY_ENV), environment) $(info MY_ENV是已导出的系统环境变量,值为:$(MY_ENV)) else $(info MY_ENV不是系统环境变量,要么未定义要么是Makefile内部定义变量) endif
如果需要检测空值的环境变量(即变量已定义但值为空),可以使用如下写法:
ifneq ($(origin MY_ENV), undefined) $(info 变量MY_ENV已定义,哪怕值为空也会触发本条逻辑) endif
注意:未通过
export导出的Shell变量属于Shell本地变量,不会传递给make子进程,任何方式都无法在Makefile中检测到这类变量。
内容的提问来源于stack exchange,提问作者bob.sacamento
相关产品推荐
相关产品推荐

