如何在CMake(Windows)中检索用户环境变量
我知道如何使用如何在CMake(Windows)中检索用户环境变量,windows,environment-variables,cmake,Windows,Environment Variables,Cmake,我知道如何使用 $ENV{EnvironmentVariableName} 但我无法检索特定于用户的环境变量。是否可能以及如何实现?您需要导出变量。例如在Linux中: export EnvironmentVariableName=foo 未报告的变量在CMAKE中为空。环境变量(使用系统属性修改)仅在创建新的子shell时传播到子shell 如果在更改用户环境变量时打开了命令行提示符(DOS或cygwin),则它们不会显示 更改用户设置后,需要打开新的命令行提示符 Unix/Linux中的
$ENV{EnvironmentVariableName}
但我无法检索特定于用户的环境变量。是否可能以及如何实现?您需要导出变量。例如在Linux中:
export EnvironmentVariableName=foo
未报告的变量在CMAKE中为空。环境变量(使用系统属性修改)仅在创建新的子shell时传播到子shell
如果在更改用户环境变量时打开了命令行提示符(DOS或cygwin),则它们不会显示
更改用户设置后,需要打开新的命令行提示符
Unix/Linux中的等效方法是在.bash\u rc中添加一行:您需要启动一个新的shell来获取值。将变量添加到CMake脚本中
可以使用cmake调用在行上传递变量:
FOO=1 cmake
或者通过在BASH中导出变量:
export FOO=1
然后,您可以使用以下方法在cmake脚本中拾取它:
$ENV{FOO}
您还可以通过跨平台方式调用自身来完成此操作:
cmake -E env EnvironmentVariableName="Hello World" cmake ..
env[--unset=NAME]。。。[名称=值]。。。命令[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}")
参考
IF($ENV{COVERAGE})。。。END()
,调用:COVERAGE=1 cmake..
。当然,我不检查内容,也不知道是否会。但是,无论定义与否,它都适用于测试!如果在前几行中定义了变量,则确实需要导出。只有在同一行上定义的变量不需要导出,但问题是我们无法推断您是以这种方式还是另一种方式进行导出。这是Google首次在CMake中检索环境变量。这个问题已经包含了答案,这可能有点奇怪,但在我看来不应该删除它。@Ludwik因为它回答了用户特定的环境变量在CMake脚本中不可用的问题。部分问题是“用户特定的环境变量”和“普通机器范围的环境变量”之间的分离是一个非常特定于Windows的概念。类Unix系统不关心环境变量的设置位置;它们都是一样的。例如:message($ENV{WINDIR})
显示C:\Windows
(注意它不是写在%WINDIR%)对于Windows,您还可以运行SET var\u name=var\u value
在当前DOS会话中设置环境变量,或者SETX var\u name var\u value
永久设置它:请参阅和。可能也很有趣。对于Unix/Linux,您通常也可以运行source~/.bashrc
来重新运行修改后的.bashrc
文件,并将新值放入当前会话中。