Как я могу игнорировать все предупреждения cmake dev из подкаталогов?
Я использую несколько внешних библиотек, которые включены как подмодули git, используя add_subdirectory
команда. Некоторые из них используют старые версии cmake и выдают предупреждения о политиках CMP0048 и CMP0077.
Есть ли способ отключить все предупреждения cmake для этих библиотек?
Я попытался явно установить политику OLD
до включения проектов, но это не помогло.
Я предпочел бы не редактировать какие-либо файлы в подмодуле git, потому что тогда будут дополнительные шаги, когда кто-то должен будет клонировать репо моего проекта и собрать его на своей машине.
1 ответ
Я знаю, что это старые вопросы, но если кто-то наткнется на ту же проблему, вот мои выводы.
Почему ваши попытки не сработали?
Установка политик перед вызовом не будет работать, потому что cmake_minimum_required() неявно устанавливает определенный набор политик, в зависимости от требуемой версии, который может переопределить установленные политики. Кроме того, их явное значение не имеет никакого эффекта, даже если они не были переопределены, поскольку нет разницы между
Возможные решения
Я могу придумать следующие решения:
Используйте недокументированную переменную
, который также устанавливается при передаче в командной строке (см. cmake.cxx). Поскольку вы, вероятно, не хотите, чтобы это повлияло на ваш проект и отключило все предупреждения разработчика, вам следует восстановить исходное значение после вызова: set(no_dev_warnings_backup "$CACHE{CMAKE_SUPPRESS_DEVELOPER_WARNINGS}") set(CMAKE_SUPPRESS_DEVELOPER_WARNINGS ON CACHE INTERNAL "" FORCE) add_subdirectory(...) set(CMAKE_SUPPRESS_DEVELOPER_WARNINGS ${no_dev_warnings_backup} CACHE INTERNAL "" FORCE)
Переменная может быть недокументированной и, следовательно, не такой надежной, как документированные переменные, но я бы не слишком беспокоился об этом. Он существует со времен CMake 2.x и вряд ли куда-нибудь денется.
Задайте для CMAKE_POLICY_DEFAULT_CMP<NNNN> значение
: set(CMAKE_POLICY_DEFAULT_CMP0048 "NEW") set(CMAKE_POLICY_DEFAULT_CMP0077 "NEW") add_subdirectory(...)
Обратите внимание, что это не только отключает предупреждения, но и изменяет то, как CMake обрабатывает затронутые
файлы. Это может нарушить сборку ваших внешних библиотек! Используйте CMAKE_PROJECT__INCLUDE или одну из связанных с ней переменных, чтобы внедрить некоторый код CMake в сборку внешних библиотек. Затем введенный код может вызвать
переопределить политику. Обратите внимание, что, как и решение 2., это может привести к поломке сборки! Вместо подмодуля git вы можете использовать FetchContent , который извлекает внешние библиотеки и вызывает
один их. С очень связан с ExternalProject, он позволяет исправлять извлеченные источники, поэтому вы можете исправить/настроить сборку внешних библиотек: include(FetchContent) find_package(Patch REQUIRED) FetchContent_Declare(myextlib GIT_REPOSITORY <url> GIT_TAG <tag_or_hash> PATCH_COMMAND "${Patch_EXECUTABLE}" -p1 < path/to/myextlib.patch ) FetchContent_MakeAvailable(myextlib)
Подробнее о дифференциалах и патчах можно прочитать здесь . В качестве альтернативы вы также можете использовать git apply в качестве команды исправления, поскольку вы все равно используете Git.
Рекомендации
Я бы порекомендовал либо 1, либо 4. Подход 4 является наиболее гибким, поскольку при необходимости вы можете улучшить сборку и в других аспектах, но он также является наиболее сложным, поскольку всякий раз, когда вы повышаете версию своих внешних библиотек, вы также необходимо позаботиться о своих исправлениях и проверить, работают ли они и т. д. Если вам не нужна такая гибкость и вы заботитесь только об отключении предупреждений, подход 1 будет самым простым решением.