CMake 字符串令牌包含检查

cmake string token inclusion check

提问人:Pietro 提问时间:2/16/2015 最后编辑:Pietro 更新时间:3/6/2015 访问量:32485

问:

在 cmake 中,如何检查字符串令牌是否包含在另一个字符串中?

就我而言,我想知道编译器的名称是否包含字符串“Clang”(例如“clang”、“AppleClang”等)。到目前为止,我所能做的就是:

if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
...
elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "AppleClang")
...

我想要一种更灵活的方法,例如检查是否存在子字符串。

这是我可以在文档中找到的内容:

if( 匹配正则表达式) 如果给定字符串或变量的值与给定的正则表达式匹配,则为 True。
if( 少 ) 如果给定字符串或变量的值是有效数字且小于右侧的值,则为 True。
if( 更大 ) 如果给定字符串或变量的值是有效数字且大于右侧的值,则为 True。
if( 相等 ) 如果给定字符串或变量的值是有效数字且等于右侧的值,则为 True。
if( 无 STRLESS ) 如果给定字符串或变量的值在字典上小于右侧的字符串或变量,则为 True。
if( STRGREATER ) 如果给定字符串或变量的值在字典上大于右侧的字符串或变量,则为 True。
如果( STREQUAL ) 如果给定字符串或变量的值在字典上等于右侧的字符串或变量,则为 True。

字符串 cmake 字符串比较

评论

0赞 kdopen 2/17/2015
您列出的方法之一将是最终答案,但是如果没有您正在寻找的令牌和您正在搜索的字符串的明确示例,没有人能够更密切地指导您。

答:

37赞 Fraser 2/17/2015 #1

if(<variable|string> MATCHES regex)可能就是你要找的。

在这种特殊情况下(假设你在块内做同样的事情 for 和 ),那么你可以替换:ClangAppleClang

if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
...
elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "AppleClang")
...

跟:

if(CMAKE_CXX_COMPILER_ID MATCHES "^(Apple)?Clang$")

评论

3赞 Pietro 2/17/2015
对于我必须要做的,这工作正常:if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
0赞 Pietro 2/17/2015
由于首字母可以是大写或小写:if(CMAKE_CXX_COMPILER_ID MATCHES "(C|c?)lang")
4赞 Antonio 3/6/2015
@Pietro这是因为,尽管记录得不好,但当搜索到的字符串包含在解析的字符串中时,MATCHES 返回 true。这至少是我的经验,在几个案例中进行了测试,但在这方面的文档还远不清楚。
0赞 Bronzdragon 5/8/2020
@Antonio,这是因为当正则表达式不包含开始/结束标记时,它们将查看正则表达式是否与字符串中的任何位置匹配。在这种情况下,“AppleClang”末尾包含“Clang”,所以这是真的。的确,这在 CMake 的文档中没有详细记录(cmake.org/cmake/help/latest/command/...),但它是正则表达式的标准。