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


104

我知道如何使用CMAKE检索普通的机器范围环境变量

$ENV{EnvironmentVariableName}

但我无法检索用户特定的环境变量。有可能吗?


2
我认为您应该删除此问题,因为给定答案没有任何帮助。
汤姆·布里托

11
这是Google第一个关于如何在CMake中检索环境变量的信息。问题已经包含答案可能有点奇怪,但是不应删除IMO。
安德烈亚斯·哈弗堡

2
当答案完全是“没有”时,这个问题和答案怎么会有这么多的否决?
路德维克

3
@Ludwik,因为它回答了在CMake脚本中用户特定的环境变量不可用的问题。
罗伯特

3
问题的部分原因是“用户特定的环境变量”和“普通的计算机范围内的环境变量”之间的分裂是一个非常特定于Windows的概念。类似于Unix的系统不在乎在何处设置环境变量。他们都是一样的。
詹姆斯·摩尔

Answers:


83

将变量放入CMake脚本

您可以在带有cmake调用的行上传递变量:

FOO=1 cmake

或通过在BASH中导出变量:

export FOO=1

然后,您可以使用以下命令在cmake脚本中进行拾取:

$ENV{FOO}

13

您也可以调用 本身以跨平台的方式做到这一点:

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}")

参考


4

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

export EnvironmentVariableName=foo

未导出的变量在CMAKE中为空。


5
您不必导出它们!示例:CMakeLists.txt IF($ENV{COVERAGE}) ... END(),调用:COVERAGE=1 cmake ..。当然,我不检查内容,也不知道是否可以。但是它肯定可以用于测试是否已定义!
Janus Troelsen

1
如果在前几行定义变量,则确实需要导出。仅在同一行上定义的变量不需要导出,但是我们无法推断出您是以一种方式还是另一种方式进行导出的问题。
亚历克西斯·威尔克

1

(使用“系统属性”修改的)环境变量仅在创建新的子Shell时传播到子Shell。

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

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

Unix / Linux中的等效项是在.bash_rc中添加一行:您需要启动新的shell来获取值。


对于Windows,您还可以运行SET var_name=var_value以在当前DOS会话中设置环境变量,或SETX var_name var_value将其永久设置:请参见setsetx设置本地可能也很有趣。
WillC

对于Unix / Linux,通常还可以运行source ~/.bashrc以重新运行修改后的.bashrc文件,并将新值添加到当前会话中。
WillC
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.