Как использовать заголовки SYSTEM с CMake и clang-tidy? - PullRequest
2 голосов
/ 14 апреля 2020

Я пытаюсь использовать 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)

, но, похоже, это тоже не сработало.

...