繁体   English   中英

仅将 clang-tidy 与 header CMake 项目一起使用

[英]Using clang-tidy with a header only CMake project

我正在开发一个仅 header 的库,并希望使用 clang-tidy 来确保我遵循“C++ 核心指南” https://isocpp.ZBF215181B514052215181B514052215181B51405221437B3D4F6B7LinesGuio3/CppCorelinesGuio3

无论我尝试什么,我似乎都无法在 header 唯一的库上工作(可能是因为在使用该库之前没有真正编译过)......但是必须有一些解决方法才能使这项工作正常工作. 肯定有人写了一个 header 唯一的库,他们想在上面使用 clang-tidy。

为了尝试简化这个问题,我做了一个小测试项目来尝试让它工作。 这个项目只有两个文件。 一个 CMakeLists.txt 文件和一个 header 文件。

CMakeLists.txt:

cmake_minimum_required(VERSION 3.11.4)

project(my_project LANGUAGES CXX)

# This does not seem to work at all for header only libraries
# I even tried messing with the "-header-filter" parameter and had no luck
set(CMAKE_CXX_CLANG_TIDY clang-tidy;-checks=-*,cppcoreguidelines-*)

add_library(my_project INTERFACE)

target_include_directories(my_project
  INTERFACE
    $<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/include>
    $<INSTALL_INTERFACE:include>
)

包括/my_project.hpp:

#include <iostream>

// I know it is bad to do this in a header file.
// This is intentional to give clang-tidy something to catch
using namespace std;

template <int N>
void print()
{
    for (int i = 0; i < N; ++i)
    {
        cout << "Hello, world!" << endl;
    }
}

当我运行 CMake 时:

mkdir build
cd build
cmake ..
cmake --build .

我没有从 clang-tidy 得到 output。 如何使 clang-tidy 解析 header 仅库并报告潜在问题?

默认情况下, clang-tidy不会检查您的 header 文件。 因此,有必要使用-header-filter=.*来指定 header 文件的根路径。

不冗长clang-tidy output 并不意味着它没有执行。 该配置缺少-header-filter=.* ,但即使使用该标志,当您执行cmake --build. ,它没有 output 什么。 但是,如果您使用grep (例如)在构建路径中查找该命令,您应该会得到类似的内容:

❯ grep -nrw '.' -e "clang-tidy"
./CMakeFiles/my_project.dir/build.make:63:  $(CMAKE_COMMAND) -E __run_co_compile --tidy="clang-tidy;-checks=-*,cppcoreguidelines-*;-header-filter=.*" --source=/home/markoshorro/tmp/tidy/my_project.cpp -- /usr/bin/c++  $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/my_project.dir/my_project.cpp.o -c /home/markoshorro/tmp/tidy/my_project.cpp

这意味着考虑了clang-tidy命令。 实际上,以您的示例为例:

❯ clang-tidy my_project.hpp
❯

即,我什么也得不到。 看看这个例子(即使你的例子对我来说很好); 只是clang-tidy没有什么可报告的。

以下命令对我有用:

find . -type f \( -name "*.hpp" -o -name "*.cpp" \) \
   -exec clang-tidy -p . \
   --header-filter="/home/user/clang-tidy-include-headers/header.hpp" {} \;

它查找 header 和 CPP 文件,将它们传递给 clang-tidy。 参数--header-filter=接受 header 文件路径的正则表达式。

在您的情况下,它将是:

find . -type f \( -name "*.hpp" -o -name "*.cpp" \) \
   -exec clang-tidy -p . \
   --header-filter="include/" {} \;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM