我试图在我的CMake (3.17.1)项目中使用clang-tidy,但是它在Catch2测试库头上崩溃了。将Catch2设置为系统标头似乎没有什么帮助。为clang-tidy调用的命令包含Catch2的路径作为系统包含目录,但仍会打印其诊断信息。在尝试将其隔离时,我发现这实际上并不适用于clang-tidy:
clang-tidy src.cpp -- -Isystem/Path/to/header
这会导致根本找不到标头。我在某个地方学到的(现在找不到)是让它实际上是clang-tidy的两个--extra-arg参数:
clang-tidy --extra-arg=-Isystem --extra-arg=/Path/to/header src.cpp
然而,这并不是在所有地方都有效。在Windows上,我可以让它工作,但在Linux上,它从来没有以任何形式工作过(在--之后,在一起,分开)。如何在Linux上的clang-tidy中使用-isystem头?这是非常混乱和不一致的。此外,如何使用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:
set(CMAKE_CXX_CLANG_TIDY clang-tidy --extra-arg=-isystem --extra-arg=../Catch2/include)
但这似乎也没有起到作用。
发布于 2020-10-08 06:43:34
我正在关注LLVM bugtracker上发布的your repro。
您做的每件事都是正确的:即,用SYSTEM将Catch2标记为system include。clang-tidy的行为也是正确的:它只检查源文件test.cpp,而不完全检查catch.hpp,只检查宏的扩展。
问题出在Catch2的过时版本上。从Catch2 2.12.2开始,hicpp-vararg警告已被silenced,因此您需要至少更新到该版本。此外,很明显,hicpp-vararg报告的核心问题是fixed,这一变化预计将出现在clang-tidy 11版本中。
https://stackoverflow.com/questions/61196994
复制相似问题