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

#cmake #cmake-modules #cmake-language

#cmake #cmake-modules #cmake-язык

Вопрос:

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

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

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

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

Ответ №1:

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

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

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

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

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

  1. Используйте недокументированную переменную CMAKE_SUPPRESS_DEVELOPER_WARNINGS , которая также устанавливается при передаче -Wno-dev в командной строке (см. cmake.cxx). Поскольку вы, вероятно, не хотите, чтобы это повлияло на ваш проект, и также отключили все предупреждения разработчика, вам следует восстановить исходное значение после add_subdirectory() вызова:

     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> в NEW :

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

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

  3. Используйте CMAKE_PROJECT__INCLUDE или одну из связанных с ней переменных, чтобы внедрить некоторый код CMake в сборку внешних библиотек. Затем введенный код может вызвать cmake_policy(SET CMP<NNNN> NEW) переопределение политики. Обратите внимание, что, как и в случае с решением 2., это может привести к сбою сборки!

  4. Вместо подмодуля git вы можете использовать fetchContent, который извлекает внешние библиотеки и вызывает add_subdirectory() одну из них. Поскольку 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 будет самым простым решением.