在不同平台上检测铿锵声

时间:2014-09-25 01:24:54

标签: regex cmake micro-optimization

面对为不同供应商解析clang版本的问题clang --version|head -1

Apple LLVM version 6.0 (clang-600.0.54) (based on LLVM 3.5svn) => 3.5
FreeBSD clang version 3.4.1 (tags/RELEASE_34/dot1-final 208032) 20140512 => 3.4.1
clang version 3.5.0 (tags/RELEASE_350/rc2) => 3.5.0

现在有这个正则表达式

match: (clang version|based on LLVM)\ (\d+)(\.\d+)(\.\d+)?
to \2\3\4

我需要从结果匹配() - (clang version|based on LLVM)中排除\1

2 个答案:

答案 0 :(得分:2)

好的,因为你使用的工具是基于PCRE的,所以这种模式应该有效:

(?m)(?:^Apple .*)?\K \d+(?:\.\d+){1,2}

(?m)在现实生活中没用,因为你只测试了一行,所以你可以删除它。

\K会从匹配结果中删除左侧匹配的所有内容。

如果您使用其他语言/工具\K功能不可用,您可以使用捕获组从整个匹配结果中提取所需信息:

(?:^Apple .*)? ([0-9]+(?:[.][0-9]+){1,2})

使用cmake:

string(REGEX REPLACE "(^Apple .*)? ([0-9]+([.][0-9]+){1,2}).*" "\\2" CLANG_VERSION "${_clang_version_info}")

答案 1 :(得分:2)

你的问题看起来好像你希望CMake的正则表达式处理类似于Perl,但它却完全不同。

在CMake语法中,以下内容应该符合您的要求:

if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
  execute_process(COMMAND clang --version COMMAND head -1 OUTPUT_VARIABLE ClangVersionLine)
  string(REGEX MATCH "(clang version|based on LLVM) ([0-9]\\.[0-9]\\.?[0-9]?)" UnusedVar "${ClangVersionLine}")
  set(ClangVersion "${CMAKE_MATCH_2}")
  message("ClangVersion - ${ClangVersion}")
endif()