Как я могу игнорировать все предупреждения cmake dev из подкаталогов?

Я использую несколько внешних библиотек, которые включены как подмодули git, используя add_subdirectory команда. Некоторые из них используют старые версии cmake и выдают предупреждения о политиках CMP0048 и CMP0077.

Есть ли способ отключить все предупреждения cmake для этих библиотек?

Я попытался явно установить политику OLD до включения проектов, но это не помогло.

Я предпочел бы не редактировать какие-либо файлы в подмодуле git, потому что тогда будут дополнительные шаги, когда кто-то должен будет клонировать репо моего проекта и собрать его на своей машине.

1 ответ

Я знаю, что это старые вопросы, но если кто-то наткнется на ту же проблему, вот мои выводы.

Почему ваши попытки не сработали?

Установка политик перед вызовом не будет работать, потому что cmake_minimum_required() неявно устанавливает определенный набор политик, в зависимости от требуемой версии, который может переопределить установленные политики. Кроме того, их явное значение не имеет никакого эффекта, даже если они не были переопределены, поскольку нет разницы междупотому что это значение по умолчанию для этой версии или потому что оно было задано явно. Предупреждение выдается в обоих случаях, потому что, как указано в документации каждой политики, старое поведение устарело по определению.

Возможные решения

Я могу придумать следующие решения:

  1. Используйте недокументированную переменную, который также устанавливается при передачев командной строке (см. 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 и вряд ли куда-нибудь денется.

  2. Задайте для CMAKE_POLICY_DEFAULT_CMP<NNNN> значение:

            set(CMAKE_POLICY_DEFAULT_CMP0048 "NEW")
    set(CMAKE_POLICY_DEFAULT_CMP0077 "NEW")
    add_subdirectory(...)
    

    Обратите внимание, что это не только отключает предупреждения, но и изменяет то, как CMake обрабатывает затронутыефайлы. Это может нарушить сборку ваших внешних библиотек!

  3. Используйте CMAKE_PROJECT__INCLUDE или одну из связанных с ней переменных, чтобы внедрить некоторый код CMake в сборку внешних библиотек. Затем введенный код может вызватьпереопределить политику. Обратите внимание, что, как и решение 2., это может привести к поломке сборки!

  4. Вместо подмодуля 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 будет самым простым решением.

Другие вопросы по тегам