为啥make无法获取环境变量

Posted

技术标签:

【中文标题】为啥make无法获取环境变量【英文标题】:Why make cannot pick up environment variables为什么make无法获取环境变量 【发布时间】:2016-04-05 21:31:16 【问题描述】:

我已经测试了一些 make 并且 shell 中的环境变量问题不在 Make 文件中。我想知道我的设置有什么问题。我在我的 mac os、redhat 和 Ubuntu 上进行了测试。他们都有相同的行为。我想知道任何人都可以帮助解决这个问题。

GNU Make 4.1

这是我最简单的make文件:

ifdef $(HOME)
 $(info $$HOME is $(HOME))
else
 $(info $$HOME is undefined)
endif

all :
    echo do nothing

当我在终端输入 make 时

$HOME is undefined
echo do nothing
do nothing

回声 $HOME

/Users/myusername

这是 make 手册中的定义https://www.gnu.org/software/make/manual/html_node/Environment.html

make 中的变量可以来自 make 运行的环境。 make 在启动时看到的每个环境变量都会转换为具有相同名称和值的 make 变量。但是在 makefile 中的显式赋值,或者使用命令参数,会覆盖环境。

【问题讨论】:

实际上我正在测试我在 $HOME/.bash_profile 中定义的另一个环境变量。我忘了做出口。如果我回显 $MYVARABLE 但不在 make 内部,则该变量可见。我在这里通过给出额外的'$'来测试我的虚拟make文件中的环境变量时犯了另一个错误。感谢丹的回答。 您在这里链接到 make 3.79.1 文档有什么原因吗?特别是因为链接是old-gnu URL,并且您专门使用了 much 比那更新版本的 make? (确切地说是十四年半。) 没有特别的原因。我刚刚在 google 上进行了搜索,这是 google 搜索中的第一项。肯定是make的大部分用户都是专家,他们不再阅读较新的手册。所以老版本得到了最多的宣传。 可能是因为我之前搜索过它,但我得到了*** GNU make 页面,并且以前从未见过 Google 在该站点上返回任何内容。 【参考方案1】:

我相信您不应该在 ifdef 块中获取 HOME 变量的值。 GNU make 会将其评估为

ifdef /your/home/directory

这显然没有定义为变量。请尝试以下操作:

ifdef HOME
    $(info $$HOME is $(HOME))
else        
    $(info $$HOME is undefined)
endif

【讨论】:

正确,语法是ifdef VAR_NAME 而不是ifdef VAR_VALUE。有关详细信息,请参阅手册中的Syntax of Conditionals。

以上是关于为啥make无法获取环境变量的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能在 cmd 中设置环境变量。无法使用 azcopy 从 S3 复制

Makefile引用与环境变量

安装了jdk ,配置了环境变量,都正确,为啥无法识别Java文件?

tcl文件无法获取通过代码设置的环境变量[关闭]

无法在 Django 设置文件中获取环境变量

Makefile中要引用一个系统环境变量该怎么办