提问人:Pietro 提问时间:2/16/2015 最后编辑:Pietro 更新时间:3/6/2015 访问量:32485
CMake 字符串令牌包含检查
cmake string token inclusion check
问:
在 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。
答:
37赞
Fraser
2/17/2015
#1
if(<variable|string> MATCHES regex)
可能就是你要找的。
在这种特殊情况下(假设你在块内做同样的事情 for 和 ),那么你可以替换:Clang
AppleClang
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/...),但它是正则表达式的标准。
评论