tjw*_*992 7 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>
)
Run Code Online (Sandbox Code Playgroud)
包括/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;
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行 CMake 时:
mkdir build
cd build
cmake ..
cmake --build .
Run Code Online (Sandbox Code Playgroud)
我没有从 clang-tidy 中得到任何输出。如何制作 clang-tidy 仅解析标头库并报告潜在问题?
默认情况下,clang-tidy 不会检查你的头文件。因此,有必要使用-header-filter=.*, 来指定头文件的根路径。
不详细的clang-tidy输出并不意味着它没有执行。该配置丢失-header-filter=.*,但即使使用该标志,当您执行时cmake --build .,它也不会输出任何内容。但是,如果您在构建路径中查找该命令grep(例如),您应该得到类似以下内容的内容:
\xe2\x9d\xaf grep -nrw \'.\' -e "clang-tidy"\n./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\n\nRun Code Online (Sandbox Code Playgroud)\n这意味着clang-tidy命令被考虑。实际上,用你的例子:
\xe2\x9d\xaf clang-tidy my_project.hpp\n\xe2\x9d\xaf\nRun Code Online (Sandbox Code Playgroud)\n即,我什么也没得到。看看这个例子(尽管你的例子对我来说似乎很好);只是clang-tidy没有什么可报告的。
以下命令对我有用:
find . -type f \( -name "*.hpp" -o -name "*.cpp" \) \
-exec clang-tidy -p . \
--header-filter="/home/user/clang-tidy-include-headers/header.hpp" {} \;
Run Code Online (Sandbox Code Playgroud)
它查找头文件和 CPP 文件,将它们传递给 clang-tidy。该参数--header-filter=接受头文件路径的正则表达式。
在你的情况下它将是:
find . -type f \( -name "*.hpp" -o -name "*.cpp" \) \
-exec clang-tidy -p . \
--header-filter="include/" {} \;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4276 次 |
| 最近记录: |