Я пытаюсь использовать clang-tidy
в моем проекте CMake (3.17.1), однако он падает в заголовке библиотеки теста Catch2
. Установка Catch2 в качестве системного заголовка, похоже, не помогает. Команда, вызванная для clang-tidy, содержит путь к Catch2
в качестве системного каталога включения, но для него все еще распечатывается диагностика. Пытаясь изолировать его, я обнаружил, что на самом деле это не работает с 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)
, но, похоже, это тоже не сработало.