如何检查是否在cmake中设置了环境变量

How do I check if an environment variable is set in cmake

我在我的 bash 配置文件中设置了一个环境变量,这样我就可以在终端中看到它了。 .

blah/builds$ echo $THING

thingy

如何在 cmake 消息中显示它并检查它是否已设置?我尝试了以下方法,但它只是将内容显示为空白并跳过 if 语句的主体

message("THING:" $ENV{THING})
if(DEFINED ENV{THING})
    message(STATUS "THING environment variable defined")
    # some more commands
endif()

您的 CMake 代码是正确的。问题很可能是您在 shell 中只 设置了 环境变量,但没有 导出 它。 运行 调用 cmake 之前的以下内容:

export THING

替换

if(DEFINED ENV{THING})

if(DEFINED $ENV{THING})

您在变量前漏掉了一个“$”。

我这样做了,但没有用。 CMake 无法检测到它。

export THING

但这一个是可行的。

export THING=on

也许我应该始终为环境变量提供默认值。

顺便说一句,您可以通过以下CMake代码检查环境字符串。

if( $ENV{THING} STREQUAL "on")
    message(STATUS "THING = " $ENV{THING})
endif()

完全了解 export 的作用以及环境的一般运作方式,我仍然对这种形式的 WTF 满口苦恼:

IF(DEFINED $ENV{THING})

但在这种形式下效果很好:

IF(DEFINED ENV{THING})

注意 $ 遗漏。


N.B。您可以使用 cmake -P:

快速测试
[~] cat > test-env.cmake << 'EOF'
IF(DEFINED ENV{FOOBAR})
    MESSAGE(STATUS "FOOBAR env seen: --[$ENV{FOOBAR}]--")
ELSE()
    MESSAGE(STATUS "WTF")
ENDIF()
EOF
[~]
[~] FOOBAR=test cmake -P test-env.cmake
-- FOOBAR env seen: --[test]--

它表现如此怪异的原因,和往常一样是遗留问题。 IF 曾经在旧的 CMake 中做一些疯狂的事情;他们在 CMake 3.1 中修复了这个问题——以向后兼容的方式——使用 CMP0054,你必须明确启用它:

CMAKE_MINIMUM_REQUIRED(VERSION 3.1)
PROJECT(...)

CMAKE_POLICY(SET CMP0054 NEW) #-- fixes IF() with quoted args
CMAKE_POLICY(SET CMP0057 NEW) #-- enables IF(.. IN_LIST ..)

明确一点:正如https://cmake.org/cmake/help/latest/command/if.html所说:

if (DEFINED ENV{THING})
  # do stuff
endif()

是正确的语法,任何地方都没有 $。