【问题标题】:cmake string token inclusion checkcmake 字符串令牌包含检查
【发布时间】:2015-04-16 10:24:32
【问题描述】:

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

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

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

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

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

如果(匹配正则表达式) 如果给定的字符串或变量的值与给定的正则表达式匹配,则为真。
如果(少) 如果给定字符串或变量的值是有效数字且小于右边的数字,则为真。
如果(更大) 如果给定字符串或变量的值是有效数字并且大于右边的数字,则为真。
如果(等于) 如果给定的字符串或变量的值是有效数字并且等于右边的数字,则为真。
如果(无压力) 如果给定字符串或变量的值按字典顺​​序小于右侧的字符串或变量,则为真。
如果(更大) 如果给定字符串或变量的值按字典顺​​序大于右侧的字符串或变量,则为真。
如果(STREQUAL) 如果给定的字符串或变量的值在字典上等于右侧的字符串或变量,则为真。

【问题讨论】:

  • 您列出的其中一种方法将成为最终答案,但如果没有您正在寻找的令牌和正在搜索的字符串的明确示例,没有人能够指导你再靠近一点。

标签: string cmake string-comparison


【解决方案1】:

if(<variable|string> MATCHES regex) 可能就是您要查找的内容。

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

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

与:

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

【讨论】:

  • 对于我必须做的,这工作正常:if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  • 而且由于首字母可以是大写或小写:if(CMAKE_CXX_COMPILER_ID MATCHES "(C|c?)lang")
  • @Pietro 那是因为,虽然记录不充分,但当搜索的字符串 包含 在解析的字符串中时, MATCHES 会返回 true。这至少是我的经验,在几个案例中进行了测试,但文档在这方面还远未明确。
  • @Antonio,这是因为正则表达式在不包含开始/结束标记时会查看正则表达式是否匹配字符串中的任何位置。在这种情况下,“AppleClang”最后包含“Clang”,所以这是真的。确实,这在 CMake 的文档 (cmake.org/cmake/help/latest/command/…) 中没有详细记录,但它对于正则表达式来说是相当标准的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-13
  • 1970-01-01
  • 1970-01-01
  • 2011-11-09
  • 2013-05-18
  • 1970-01-01
  • 2018-01-06
相关资源
最近更新 更多