【问题标题】:How to retrieve a user environment variable in CMake (Windows)如何在 CMake (Windows) 中检索用户环境变量
【发布时间】:2010-10-15 23:15:45
【问题描述】:

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

$ENV{EnvironmentVariableName}

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

【问题讨论】:

  • 这是关于如何在 CMake 中检索环境变量的 Google 首次点击。问题已经包含答案可能有点奇怪,但它不应该被删除 IMO。
  • @Ludwik 因为它解决了用户特定环境变量在 CMake 脚本中不可用的问题。
  • 部分问题在于“用户特定环境变量”和“正常机器范围的环境变量”之间的划分是一个非常特定于 Windows 的概念。类 Unix 系统不关心环境变量的设置位置;它们都是一样的。
  • 例:message($ENV{WINDIR})显示C:\Windows(注意不是写成%WINDIR%)

标签: windows environment-variables cmake


【解决方案1】:

将变量添加到您的 CMake 脚本中

您可以在 cmake 调用的行上传递一个变量:

FOO=1 cmake

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

export FOO=1

然后您可以在 cmake 脚本中使用:

$ENV{FOO}

【讨论】:

    【解决方案2】:

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

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

    参考

    【讨论】:

      【解决方案3】:

      您需要导出变量。以 Linux 为例:

      export EnvironmentVariableName=foo
      

      CMAKE 中未导出的变量为空。

      【讨论】:

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

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

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

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

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

      【讨论】:

      • 对于 Windows,您还可以运行 SET var_name=var_value 来设置当前 DOS 会话中的环境变量,或者运行 SETX var_name var_value 来永久设置它:参见 setsetxset local 也可能很有趣。
      • 对于 Unix/Linux,您通常也可以运行 source ~/.bashrc 以重新运行修改后的 .bashrc 文件并将新值获取到当前会话中。
      猜你喜欢
      • 2013-05-21
      • 1970-01-01
      • 2015-08-20
      • 2020-06-08
      • 1970-01-01
      • 2017-05-10
      • 2023-03-11
      • 2015-06-23
      • 1970-01-01
      相关资源
      最近更新 更多