我正在尝试在我的 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 标记为系统包含 SYSTEM
。 clang-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/