如何从缓存/CLion 解决方法中默认设置 CMake 环境变量

How to default CMake environment variable from cache / CLion work-around

我正在尝试解决 CLion 无法处理环境变量的问题。

我所有的 CMake 文件都以这样的行开头:

cmake_minimum_required(VERSION 2.8.4)
include( $ENV{PROJECT_ROOT}/src/global_settings.cmake )
AssureOutOfSourceBuilds()

CLion 不知道如何读取提供全局包含的真实路径的环境变量。因此,CLion 完全无法找到当前目录之外的任何内容,并且会抛出错误。

有什么方法可以在 CMake 的缓存中为环境变量指定默认值吗?我相信 CLion 正确读取了 CMake 缓存。

关于如何克服 CLion 当前的弱点还有其他建议吗?谢谢

假设CLion正确读取CMake缓存,您可以尝试以下解决方法:

if (DEFINED ENV{PROJECT_ROOT})
    set (PROJECT_ROOT "$ENV{PROJECT_ROOT}" CACHE PATH "project root" FORCE)
endif()
include( ${PROJECT_ROOT}/src/global_settings.cmake )

set 命令使用环境变量的值创建缓存变量。缓存变量然后可以用作 $ENV{...} 表达式的替代品。 FORCE 选项可确保缓存变量与环境变量的值保持同步(如果已设置的话)。

事实证明,Clion 在 CMake 的缓存方面有一些异常行为。至少在我的所有测试中,Clion 都会在我设置时不断重置或清除缓存变量(PROJECT_ROOT,上面),因此@sakra 的解决方案并不可靠。为了对他的所有努力公平,我仍然将其投票为答案。

不过,我终于找到了解决这个问题的方法,在这里:https://youtrack.jetbrains.com/issue/CPP-188#comment=27-899992

Clion调用CMake时实际设置环境变量是一个技巧。以下是上面link的内容:

Here's an ugly work-around for people who need to pass environment or set cache variables via -D, in EAP build 140.1221.2. In Preferences -> Build, Execution, Deployment -> Toolchains, change the CMake executable from the bundled CMake executable to a shell script you define which calls an installed actual CMake executable.

Using the Bash shell, it might look like this:

#!/bin/sh
export SOMEPATH=/path/you/need 
/usr/local/bin/cmake "$@"

按照 Settings/Preferences - Build, Execution, Deployment - CMake 中的建议 here, since CLion 1.0 you can directly pass CMake options