Я пытаюсь использовать clang-tidy
в своем проекте CMake (3.17.1), однако он дает сбой в заголовке тестовой библиотеки Catch2
. Установка Catch2 в качестве системного заголовка, похоже, не помогает. Команда, вызываемая для clang-tidy, содержит путь к Catch2
как системному каталогу include, но для него все еще печатается диагностика. Пытаясь изолировать его, я обнаружил, что это не работает с clang-tidy:
clang-tidy src.cpp -- -Isystem/Path/to/header
Это приводит к тому, что заголовок вообще не обнаруживается. То, что я где-то узнал (не могу найти сейчас), заключалось в том, чтобы вместо этого сделать на самом деле два --extra-arg
параметра clang-tidy:
clang-tidy --extra-arg=-Isystem --extra-arg=/Path/to/header src.cpp
Однако это работает не везде. В Windows мне удалось заставить его работать, но в Linux он никогда не работал ни в какой форме (вместе, по отдельности, после --
). Как использовать заголовки -isystem
с clang-tidy
в Linux? Это очень запутанно и непоследовательно. Кроме того, как это сделать с помощью 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, поэтому system
во включении, по-видимому, просто игнорируется. Я попытался заставить --extra-arg
через свойство CMAKE_CXX_CLANG_TIDY
:
set(CMAKE_CXX_CLANG_TIDY clang-tidy --extra-arg=-isystem --extra-arg=../Catch2/include)
но это, похоже, тоже не помогает.
clang-tidy
использовать базу данных компиляции? CMake может генерировать их автоматически, иclang-tidy
будет использовать те же самые флаги, которые вы использовали бы для построения. - person Stephen Newell   schedule 14.04.2020clang-tidy ../SomeTest/test.cpp
) из каталога, в котором находятся команды компиляции json. Его подобрали нормально, и в нем есть тот же заголовок-isystem
. Интересно, что на этот раз заголовок все же исправен, но по-прежнему игнорируетсяsystem
, поскольку он все равно печатает предупреждения для заголовка. - person Resurrection   schedule 14.04.2020-isystem
в основном работает, когда я пытаюсь его смоделировать, и даже для Catch2 по большей части. Однако некоторые предупреждения все равно просачиваются через него, несмотря ни на что (к сожалению, из макросаREQUIRE
). Я отправил сообщение об ошибке в LLVM: bugs.llvm.org/show_bug.cgi?id= 45528 - person Resurrection   schedule 14.04.2020