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

lea*_*vst 28 bash cmake environment-variables

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

blah/builds $ echo $ THING

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

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

uli*_*tko 15

完全export了解环境的一般功能和工作原理后,我仍然对这种形式的WTF感到满意:

IF(DEFINED $ENV{THING})
Run Code Online (Sandbox Code Playgroud)

但它在这种形式下工作正常:

IF(DEFINED ENV{THING})
Run Code Online (Sandbox Code Playgroud)

注意$遗漏。


注意,您可以使用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]--
Run Code Online (Sandbox Code Playgroud)

它表现得如此怪异的原因是一如既往的传统。IF以前在较老的CMake中做疯狂的事情;他们使用CMP0054(以向后兼容的方式)在CMake 3.1中修复了此问题,您必须明确启用它:

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 ..)
Run Code Online (Sandbox Code Playgroud)

  • @TarmoPikaro 让我恭敬地拒绝。如果你问我,我通常**阅读**其中的答案和代码,并且从不直接复制粘贴代码(因为这是非常糟糕的工程)。你应该注意你所读的内容。您应该能够自己“打出四个单词”。 (4认同)

kyn*_*nan 11

你CMake代码是正确的.问题很可能是您只在shell中设置环境变量但未导出它.在调用之前运行以下命令cmake:

export THING
Run Code Online (Sandbox Code Playgroud)


Jan*_*ans 6

只是要清楚:正如https://cmake.org/cmake/help/latest/command/if.html所说:

if (DEFINED ENV{THING})
  # do stuff
endif()
Run Code Online (Sandbox Code Playgroud)

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