如何检查是否在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()
是正确的语法,任何地方都没有 $。
我在我的 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()
是正确的语法,任何地方都没有 $。