c++ - 使用带有仅 header 的 CMake 项目的 clang-tidy

标签 c++ cmake llvm clang-tidy

我正在开发一个仅限头文件的库,并希望使用 clang-tidy 来确保我遵循“C++ 核心指南”https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines
无论我尝试什么,我似乎都无法在仅包含头文件的库上使用 clang-tidy(可能是因为在使用该库之前没有真正编译任何内容)......但必须有一些解决方法才能使这项工作正常进行.当然,其他人已经编写了一个只有头文件的库,他们想在其上使用 clang-tidy。
为了尝试简化这个问题,我做了一个小测试项目来尝试让它工作。这个项目只有两个文件。一个 CMakeLists.txt 文件和一个头文件。
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;
    }
}
当我使用以下命令运行 C​​Make 时:
mkdir build
cd build
cmake ..
cmake --build .
我没有从 clang-tidy 得到任何输出。如何使 clang-tidy 仅解析 header 库并报告潜在问题?

最佳答案

默认情况下,clang-tidy will not检查你的头文件。因此,有必要使用 -header-filter=.* , 以指定头文件的根路径。
不详细 clang-tidy输出并不意味着它没有执行。缺少该配置 -header-filter=.* ,但即使有那个标志,当你执行 cmake --build . 时,它不输出任何东西。但是,如果您在构建路径中使用 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
❯
即,我什么也得不到。看看this example (尽管你的例子对我来说似乎很好);只是clang-tidy没有什么可报告的。

关于c++ - 使用带有仅 header 的 CMake 项目的 clang-tidy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65350841/

相关文章:

c++ - 如何在另一个类中创建一个类的参数化构造函数作为数据成员?

c++ - cmake:为静态库的调试构建添加 "d"后缀

garbage-collection - 我可以将 OCaml GC 与 LLVM GC 接口(interface)一起使用吗?

namespaces - CMake:强制命名空间和库文件名之间的关系

c++ - 无法使用 CMake 和 ncurses 进行编译

objective-c - 这个: _Pragma ("clang assume_nonnull begin")是什么意思

python - LLVM IR 到 Python 编译器

c++ - 使用 ostream 从另一个类的结构访问数据

java - 类的对象作为类内的实例变量

C++ XQuery 引擎 - zorba 或 XQilla 或其他