C++ 如何将系统标题与CMake和clang tidy一起使用?

C++ 如何将系统标题与CMake和clang tidy一起使用?,c++,cmake,clang-tidy,C++,Cmake,Clang Tidy,我试图在我的CMake(3.17.1)项目中使用clangtidy,但是它在Catch2测试库头上崩溃。将Catch2设置为系统标头似乎没有帮助。为clang tidy调用的命令包含到Catch2的路径,作为系统包含目录,但仍为其打印诊断信息。在尝试隔离它时,我发现这实际上不适用于clang tidy: clangtidy src.cpp--Isystem/Path/to/header 这会导致根本找不到标题。我在某个地方学到的(现在找不到)是将它变成两个——额外的arg参数: clangtid

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

clangtidy src.cpp--Isystem/Path/to/header

这会导致根本找不到标题。我在某个地方学到的(现在找不到)是将它变成两个
——额外的arg
参数:

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

然而,这并不适用于任何地方。在Windows上,我可以让它工作,但在Linux上,它从来没有以任何形式工作过(在
--
之后一起工作,分开工作)。在Linux上,如何将
-isystem
头与
clangtidy
一起使用?这是非常混乱和不一致的。此外,如何使用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)
生成的命令行相当复杂(为了可读性,我需要包装):

在输出中有来自Catch2的警告,因此include中的
系统
似乎被忽略。我已尝试通过
CMAKE\u CXX\u CLANG\u TIDY
属性强制执行
--extra arg

set(CMAKE\u CXX\u CLANG\u TIDY CLANG TIDY--extra arg=-issystem--extra arg=../Catch2/include)

但这似乎也不起作用。

我在LLVM bugtracker上发布了以下内容

您所做的一切都是正确的:即,使用
system
将Catch2标记为system include
clang tidy
也正常运行:它只检查源文件
test.cpp
,不完全检查
catch.hpp
,只检查宏扩展


问题在于Catch2的过时版本<代码>hicpp vararg警告从Catch2 2.12.2开始生效,因此您需要至少更新到该版本。此外,显然,
hicpp vararg
报告的核心问题是,这一变化预计将出现在clang tidy 11版本中。

出于好奇,如果您告诉
clang tidy
使用编译数据库,您的运气会更好吗?CMake可以为您自动生成这些标记,
clang tidy
将利用与您用于构建的标记完全相同的标记。@StephenNewell我已经在CMake中启用了编译数据库,并从编译命令json所在的目录手动将其与clang tidy一起使用(例如,
clang tidy../SomeTest/test.cpp
)。它被很好地拾取,并且它确实包含相同的
-isystem
标题。有趣的是,这一次它确实发现头很好,但仍然忽略了
系统
,因为它会打印头的警告。@StephenNewell,因为事实证明,这个问题不是通用的,但似乎特定于Catch2头(可能还有类似的宏用法)。当我尝试模拟它时,
-isystem
主要起作用,甚至在大部分情况下对Catch2也起作用。然而,不管发生什么情况,一些警告仍然会通过它(不幸的是,来自
REQUIRE
macro)。我已向LLVM提交了一个错误:
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