c++ - 如何将 SYSTEM header 与 CMake 和 clang-tidy 一起使用?

标签 c++ cmake clang-tidy

我正在尝试在我的 CMake (3.17.1) 项目中使用 clang-tidy,但它在 Catch2 测试库 header 上崩溃。将 Catch2 设置为系统 header 似乎没有帮助。为 clang-tidy 调用的命令包含作为系统包含目录的 Catch2 的路径,但仍会为其打印诊断信息。在尝试隔离它时,我发现这实际上不适用于 clang-tidy:

clang-tidy src.cpp -- -Isystem/Path/to/header

导致根本找不到 header 。我在某处学到的(现在找不到)是让它实际上变成了 clang-tidy 的两个 --extra-arg 参数:

clang-tidy --extra-arg=-Isystem --extra-arg=/Path/to/header src.cpp

但这并不适用于任何地方。在 Windows 上我能够使它工作,但在 Linux 上它从来没有以任何形式工作(一起,分开,在 -- 之后)。如何在 Linux 上将 -isystem header 与 clang-tidy 一起使用?这是非常困惑和不一致的。此外,如何使用 CMake 做到这一点?

我有这个:

cmake_minimum_required(VERSION 3.10)
set(CMAKE_CXX_CLANG_TIDY clang-tidy)

add_library(Catch2 STATIC Catch2/Catch2.cpp Catch2/include/Catch2/catch.hpp)
target_include_directories(Catch2 SYSTEM PUBLIC Catch2/include)

add_executable(SomeTest SomeTest/test.cpp)
target_link_libraries(Catch2)

生成的命令行相当复杂(为了可读性,包装是我的):

cmake 
-E __run_co_compile 
--tidy="clang-tidy-10;--extra-arg-before=--driver-mode=g++"
--source=../Sometest/test.cpp
-- 
/usr/bin/clang++-10
-isystem ../Catch2/include 
-g
-std=gnu++17
-MD
-MT CMakeFiles/SomeTest.dir/projects/SomeTest/test.cpp.o 
-MF CMakeFiles/SomeTest.dir/projects/SomeTest/FileTest.cpp.o.d 
-o CMakeFiles/SomeTest.dir/projects/SomeTest/test.cpp.o 
-c 
../projects/SomeTest/test.cpp

在输出中有来自 Catch2 的警告,因此 include 中的 system 似乎被忽略了。我试图通过 CMAKE_CXX_CLANG_TIDY 属性强制执行 --extra-arg:

设置(CMAKE_CXX_CLANG_TIDY clang-tidy --extra-arg=-isystem --extra-arg=../Catch2/include)

但这似乎也无济于事。

最佳答案

我正在关注 your repro如 LLVM bugtracker 上发布的那样。

您所做的一切都是正确的:也就是说,将 Catch2 标记为系统包含 SYSTEMclang-tidy 的行为也正确:它只检查你的源文件 test.cpp 并没有完全检查 catch.hpp,只有宏扩展。

问题是 Catch2 的版本过时了。 hicpp-vararg 警告已 silenced从 Catch2 2.12.2 开始,因此您至少需要更新到该版本。此外,hicpp-vararg 报告的核心问题显然是 fixed预计此更改将出现在 clang-tidy 11 版本中。

关于c++ - 如何将 SYSTEM header 与 CMake 和 clang-tidy 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61196994/

相关文章:

clang - clang 如何检查重定义?

c++ - C++中的函数名宏

c++ - CMake 和 Window .Lib 文件

CMake添加-Dlibname_EXPORTS编译定义

cmake 不会在自定义命令中复制文件

macos - 如何在 macOS 上安装 clang-tidy?

c++ - 使用迭代器删除元素,不知道 vector

java - JNI如何访问Java对象(整数)

java - 而(真);当不在 void 中时,循环会抛出无法访问的代码

c++ - 铛整洁用static_cast替换reinterpret_cast