比较 CMakeLists.txt 中环境变量的值

use*_*689 3 cmake

如何比较 CMakeLists.txt 中环境变量的值?

回显 $CXX

/usr/local/bin/clang++
Run Code Online (Sandbox Code Playgroud)

因此,CXX 在我的 /etc/profile 中正确设置。然后,在 CMakeLists.txt 中我输入:

message(status "CXX is " ENV{CXX})
if(DEFINED ENV{CXX})
    message(status "CXX is defined and it is " ENV{CXX})
    if(ENV{CXX} STREQUAL "/usr/local/bin/clang++")
        message(status "which = /usr/local/bin/clang++")
    endif()
else()
    message(status "CXX is undefined")
endif()
Run Code Online (Sandbox Code Playgroud)

它输出

CXX is ENV{CXX}
CXX is defined and it ENV{CXX}
Run Code Online (Sandbox Code Playgroud)

我想修改它以便它输出

CXX is /usr/local/bin/clang++
CXX is defined and it is /usr/local/bin/clang++
which = /usr/local/bin/clang++
Run Code Online (Sandbox Code Playgroud)

...并且,作为旁注,我是否需要测试它是否已定义,或者我可以直接跳到 STREQUAL 吗?

...EQUAL 和 STREQUAL 之间有什么区别?

use*_*689 5

重新编写以按预期工作:

message(status "CXX is " $ENV{CXX})
if(DEFINED ENV{CXX})
    message(status "CXX is defined and it is " $ENV{CXX})
    if("$ENV{CXX}" STREQUAL "/usr/local/bin/clang++")
        message(status "which = /usr/local/bin/clang++")
    endif()
else()
    message(status "CXX is undefined")
endif()
Run Code Online (Sandbox Code Playgroud)

但更安全的方法如下,因为字符串中带有 $ 的变量包含另一个变量名称的值,将替换该另一个变量,而不是字符串。(即,如果变量 X 是“foo”,变量 Y 是“X”,则“${Y}”可能会被计算为“X”,但由于该变量名称存在,因此它实际上被计算为“foo”)

message(status "CXX is " $ENV{CXX})
if(DEFINED ENV{CXX})
    message(status "CXX is defined and it is " $ENV{CXX})
    if($ENV{CXX} MATCHES "/usr/local/bin/clang++")
        message(status "which = /usr/local/bin/clang++")
    endif()
else()
    message(status "CXX is undefined")
endif()
Run Code Online (Sandbox Code Playgroud)

笔记:

if(NOT...MATCHES...)
Run Code Online (Sandbox Code Playgroud)

不起作用。你可以有一个空的 if,所以你必须写:

if(...MATCHES...)
else()
Run Code Online (Sandbox Code Playgroud)