【问题标题】:What is the correct way of providing header-filter for clang-tidy in Cmake?在 Cmake 中为 clang-tidy 提供 header-filter 的正确方法是什么?
【发布时间】:2020-07-14 23:58:29
【问题描述】:

我的项目将 Clang-tidy 配置设置如下

set(CMAKE_CXX_CLANG_TIDY "clang-tidy;-checks=google-*,cppcoreguidelines-*;")

但是,我注意到它正在检查甚至不在当前存储库中的所有文件,例如

/opt/ros/melodic/include/ros/console.h

以及子模块的所有 .h/.hpp 文件...

我尝试添加一个正则表达式来过滤目标 .h 文件,但无法正常工作... 我已经给出了单个 .hpp 文件的绝对路径,但它仍在评估 /opt/ros/melodic/include 文件...

我可以举个关于 header-filter 的例子吗?

我假设如果 hpp 在过滤器中,clang-tidy 会检查相应的 cpp 文件。我说的对吗?

【问题讨论】:

  • 这可能有点晚了,但因为我今天得到了一个指向这个问题的链接,上面写着“我们可以这样实现吗?”问题,我会尽快回答......它不起作用。一点也不... -_- 显然,clang-tidy 用于正则表达式 ERE POSIX,它不支持环视,也不包含模式检查。 another Stackoverflow question 中也提到了这一点。目前 LLVM 社区(近 4 年)有一张公开票来处理这个话题([见这里](reviews.llvm
  • ^ LLVM 社区公开票的正确链接:reviews.llvm.org/D34654

标签: c++ cmake clang clang-tidy


【解决方案1】:

你可以看看这个例子。那是我的承诺。 https://github.com/cocos2d/cocos2d-x/pull/19928

这就是我使用正则表达式禁用两个目录的 clang-tidy 检查的方法。

'^((?!/cocos2d-x/external/|/cocos/scripting/).)*$'

它禁用了对external 目录和cocos/scripting 目录的clang-tidy 检查。

我创建了一个 python 脚本来测试正则表达式是否按预期工作。

#!/usr/bin/env python
import re

files = [ 
"/home/john/cocos2d-x/external/openssl/include/linux/openssl/bio.h",
"/home/john/cocos2d-x/external/tiff/include/linux/tiff.h",
"/home/john/git/cocos/cocos2d-x/cocos/scripting/lua-bindings/auto/lua_cocos2dx_3d_auto.cpp"
"/home/john/cocos2d-x/external/json/stringbuffer.h",
"/home/john/cocos2d-x/cocos/base/ccUtils.h",
"/home/john/git/cocos/cocos2d-x/cocos/scripting/js-bindings/precheader.cpp",
"/home/john/cocos2d-x/cocos/physics/CCPhysicsBody.cpp",
"/home/john/cocos2d-x/tests/cpp-tests/Classes/ActionsEaseTest/ActionsEaseTest.cpp",
"/home/john/cocos2d-x/templates/cpp-template-default/Classes/AppDelegate.cpp",
"/home/john/git/cocos/cocos2d-x/cocos/scripting/js-bindings/proj.android/CMakeLists.txt",
]

pattern = '^((?!/cocos2d-x/external/|/cocos/scripting/).)*$'

for file in files:
    m = re.search(pattern, file)
    if m:
        print m.group(0)

运行这个python文件,输出是

/home/john/cocos2d-x/cocos/base/ccUtils.h
/home/john/cocos2d-x/cocos/physics/CCPhysicsBody.cpp
/home/john/cocos2d-x/tests/cpp-tests/Classes/ActionsEaseTest/ActionsEaseTest.cpp
/home/john/cocos2d-x/templates/cpp-template-default/Classes/AppDelegate.cpp

可以修改正则表达式和python测试脚本看看是否有效。

【讨论】:

  • 你是用哪个整洁的版本做的?我的类似产品适用于 clang-tidy-6,但不适用于 9+。
  • BASH 不支持“环视”(lookahead and lookbehind),我很确定 clang-tidy 使用 bash 正则表达式。
【解决方案2】:

以下是一个最小的 C++ 代码,在头过滤器处理方面与 clang-tidy 中正在发生的事情等效。

#include <llvm/Support/Regex.h>
#include <llvm/ADT/StringRef.h>
#include <iostream>

int main(int argc, char**)
{
  llvm::StringRef re_str = R"(my_fancy_regex_string_goes_here)";
  llvm::Regex re(re_str);
  if(not re.isValid())
  {
    std::cout << "invalid regex" << std::endl;
    return -1;
  }

  llvm::StringRef file_str = "path_to_the_problematic_file";
  if(not re.match(file_str)){
    std::cout << "does not match" << std::endl;
  } else {
    std::cout << "matches" << std::endl;
  }
}

我编译如下(MacOS 12.0.1):

clang++  llvm_re_test.cpp  $(llvm-config --cxxflags --ldflags --libs --system-libs)

一旦你的正则表达式在这种简约代码上运行良好,它就可以在 clang-tidy 上运行良好。

【讨论】:

    猜你喜欢
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-10
    相关资源
    最近更新 更多