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

Lar*_*lke 96 windows cmake environment-variables

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

$ENV{EnvironmentVariableName}
Run Code Online (Sandbox Code Playgroud)

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

Cam*_*mer 78

将变量放入CMake脚本中

您可以使用cmake调用在行上传递变量:

FOO=1 cmake
Run Code Online (Sandbox Code Playgroud)

或者通过在BASH中导出变量:

export FOO=1
Run Code Online (Sandbox Code Playgroud)

然后你可以使用以下命令在cmake脚本中获取它:

$ENV{FOO}
Run Code Online (Sandbox Code Playgroud)


Flo*_*ian 8

您还可以调用本身以跨平台方式执行此操作:

cmake -E env EnvironmentVariableName="Hello World" cmake ..
Run Code Online (Sandbox Code Playgroud)

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

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


注意,这可能只是第一次工作.如果CMake使用其中一个连续构建重新配置(您只需调用eg 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}")
Run Code Online (Sandbox Code Playgroud)

参考


小智 5

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

export EnvironmentVariableName=foo
Run Code Online (Sandbox Code Playgroud)

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

  • 您不必导出它们!示例:CMakeLists.txt ``IF($ENV{COVERAGE}) ... END()``,调用:``COVERAGE=1 cmake ..``。当然,我不检查内容,也不知道是否会。但它确实适用于测试是否已定义! (5认同)
  • 如果您在前面的行中定义了变量,那么您确实需要导出。只有在同一行定义的变量不需要导出,但问题是我们无法推断您是否以一种方式或另一种方式进行导出。 (2认同)