cmake字符串标记包含检查

Pie*_*tro 9 string cmake string-comparison

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

在我的例子中,我想知道编译器的名称是否包含字符串"Clang"(例如"clang","AppleClang",...).到目前为止我能做的就是:

if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
...
elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "AppleClang")
...
Run Code Online (Sandbox Code Playgroud)

我想要一种更灵活的方法,比如检查子串的存在.

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

if(MATCHES regex)如果给定的字符串或变量的值与给定的正则表达式匹配,则为True.
if(LESS)如果给定字符串或变量的值是有效数字且小于右边的值,则为True.
if(GREATER)如果给定的字符串或变量的值是有效数字且大于右侧的值,则为True.
if(EQUAL)如果给定的字符串或变量的值是有效数字且等于右边的值,则为真.
if(STRLESS)如果给定字符串或变量的值在字典上小于右侧的字符串或变量,则为True.
if(STRGREATER)如果给定字符串或变量的值在词典上大于右侧的字符串或变量,则为True.
if(STREQUAL)如果给定字符串或变量的值在字典上等于右侧的字符串或变量,则为True.

Fra*_*ser 18

if(<variable|string> MATCHES regex) 可能会是你想要的.

在这种特殊情况下(假设你正在做的块内的同一件事ClangAppleClang),那么你可以取代:

if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
...
elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "AppleClang")
...
Run Code Online (Sandbox Code Playgroud)

有:

if(CMAKE_CXX_COMPILER_ID MATCHES "^(Apple)?Clang$")
Run Code Online (Sandbox Code Playgroud)

  • @Pietro这是因为,尽管记录不完整,但当搜索到的字符串在解析后的字符串中包含*时,MATCHES返回true.这至少是我的经验,在几个案例中进行了测试,但在这方面文档还远未明确. (4认同)
  • 对于我必须做的事情,这很好用:`if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")` (2认同)