Как использовать заголовки SYSTEM с CMake и clang-tidy?

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

но это, похоже, тоже не помогает.


person Resurrection    schedule 13.04.2020    source источник
comment
Из любопытства, повезет ли вам больше, если вы скажете clang-tidy использовать базу данных компиляции? CMake может генерировать их автоматически, и clang-tidy будет использовать те же самые флаги, которые вы использовали бы для построения.   -  person Stephen Newell    schedule 14.04.2020
comment
@StephenNewell Я включил базу данных компиляции в CMake и использовал ее с clang-tidy вручную (например, clang-tidy ../SomeTest/test.cpp) из каталога, в котором находятся команды компиляции json. Его подобрали нормально, и в нем есть тот же заголовок -isystem. Интересно, что на этот раз заголовок все же исправен, но по-прежнему игнорируется system, поскольку он все равно печатает предупреждения для заголовка.   -  person Resurrection    schedule 14.04.2020
comment
@StephenNewell Как выясняется, проблема не универсальна, но, похоже, специфична для заголовка Catch2 (и, возможно, аналогичного использования макросов). -isystem в основном работает, когда я пытаюсь его смоделировать, и даже для Catch2 по большей части. Однако некоторые предупреждения все равно просачиваются через него, несмотря ни на что (к сожалению, из макроса REQUIRE). Я отправил сообщение об ошибке в LLVM: bugs.llvm.org/show_bug.cgi?id= 45528   -  person Resurrection    schedule 14.04.2020


Ответы (1)


Я слежу за вашим воспроизведением, опубликованным в системе отслеживания ошибок LLVM.

Вы все делаете правильно: то есть помечаете Catch2 как системное включение с помощью SYSTEM. clang-tidy также ведет себя правильно: он проверяет только исходный файл test.cpp и не проверяет полностью catch.hpp, только расширение макроса.

Проблема в устаревшей версии Catch2. hicpp-vararg предупреждение было отключено в Catch2 2.12.2, поэтому вам необходимо обновить его до по крайней мере та версия. Более того, очевидно, что основная проблема, о которой сообщил hicpp-vararg, была исправлена ​​, и ожидается, что это изменение будет присутствовать в лязгнула приборка 11 выпуска.

person Ave Milia    schedule 07.10.2020