如何在CMake(Windows)中检索用户环境变量

120

我知道如何在 CMAKE 中检索常规的机器范围环境变量,方法如下:

$ENV{EnvironmentVariableName}

我无法检索特定于用户的环境变量。这可能吗?如果可以,应该如何操作?


13
这是在CMake中检索环境变量的第一个Google搜索结果。也许问题已经包含了答案,但我认为不应该删除它。 - Andreas Haferburg
4
因为它解决了用户特定环境变量在CMake脚本中不可用的问题,所以需要@Ludwik。 - Robert
3
问题的一部分在于,“用户特定环境变量”和“正常机器全局环境变量”的区分是一个非常特定于Windows的概念。类Unix系统不关心环境变量设置在哪里; 它们都是相同的。 - James Moore
示例:message($ENV{WINDIR}) 显示 C:\Windows(请注意,它不是写成%WINDIR%)。 - Gabriel Devillers
4个回答

105

将变量传递给CMake脚本

您可以在cmake调用的命令行上传递变量:

FOO=1 cmake

或通过在BASH中导出变量:

export FOO=1

然后您可以在cmake脚本中使用以下语句来选择它:

$ENV{FOO}

这是我迄今为止找到的最好建议,但如果你正在使用PowerShell,可能会感到困惑。CMake正在寻找使用$Env:<变量名>设置的变量。 $Env:HOME = $HOME; cmake ... - Lucian Thorr

18
您还可以通过调用本身以跨平台的方式进行此操作。
cmake -E env EnvironmentVariableName="Hello World" cmake ..

env [--unset=NAME]... [NAME=VALUE]... COMMAND [ARG]...

在修改后的环境中运行命令。


请注意,这可能只有第一次有效。如果 CMake 在连续构建之一时重新配置(例如您只调用 make,其中一个 CMakeLists.txt 已更改并且 CMake 再次运行生成过程),则用户定义的环境变量可能不再存在(与系统范围的环境变量相比)。 因此,我将那些用户定义的环境变量转换为 CMake 缓存变量中的变量:

cmake_minimum_required(VERSION 2.6)

project(PrintEnv NONE)

if (NOT "$ENV{EnvironmentVariableName}" STREQUAL "")
    set(EnvironmentVariableName "$ENV{EnvironmentVariableName}" CACHE INTERNAL "Copied from environment variable")
endif()

message("EnvironmentVariableName = ${EnvironmentVariableName}")

参考资料


5

您需要导出变量。例如在Linux中:

export EnvironmentVariableName=foo

CMAKE中未导出的变量为空。


5
你不需要将它们导出!例如:CMakeLists.txt中的IF($ENV{COVERAGE}) ... END(),调用时使用COVERAGE=1 cmake ..。尽管我没有检查内容,并且不知道它是否有效,但肯定适用于测试其是否被定义! - Janus Troelsen
2
如果您在前面的行上定义了变量,则确实需要使用“export”。只有在同一行上定义的变量不需要“export”,但我们无法推断您是哪种方式。 - Alexis Wilke

1

环境变量(您可以使用系统属性进行修改)仅在创建新的子shell时传播到子shell。

如果您在更改用户环境变量时打开了命令行提示符(DOS或cygwin),则它们不会显示出来。

您需要在更改用户设置后打开一个新的命令行提示符。

在Unix / Linux中,相当于添加一行到您的.bash_rc:您需要启动一个新的shell才能获取值。


对于Windows系统,您也可以运行SET var_name=var_value来在当前DOS会话中设置环境变量,或者使用SETX var_name var_value来永久设置它:请参见setsetxset local也可能很有趣。 - WillC
对于Unix/Linux系统,您通常可以运行source ~/.bashrc来重新运行修改后的.bashrc文件,并将新值加载到当前会话中。 - WillC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接