Spec-Zone.ru › CMake

CMP0168

Добавлено в версии 3.30.

Модуль FetchContent реализует действия напрямую, а не через отдельную под-сборку.

В CMake 3.29 и более ранних версиях FetchContent реализуется как отдельная под-сборка. Для этого требовалось конфигурировать отдельный проект и использовать инструмент сборки. Такой подход может быть очень медленным с некоторыми генераторами и операционными системами. В CMake 3.30 и более поздних версиях предпочтительно напрямую выполнять загрузку, обновление и применение исправлений в рамках основного проекта.

Поведение NEW имеет следующие особенности:

  • Под-сборка не используется. Все операции выполняются непосредственно на этапе конфигурирования CMake основного проекта. При запуске в режиме скрипта CMake наличие инструмента сборки не требуется.
  • Генераторные выражения и переменные GNU Make вида $(SOMEVAR) не поддерживаются. Их не следует использовать ни в одном аргументе команд FetchContent_Declare() или FetchContent_Populate().
  • Все параметры LOG_... и USES_TERMINAL_..., параметр QUIET и переменная FETCHCONTENT_QUIET игнорируются. Вывод FetchContent всегда включается в вывод конфигурирования основного проекта. Это также означает, что теперь учитывается уровень ведения журнала сообщений (см. CMAKE_MESSAGE_LOG_LEVEL и --log-level). Уровень журнала сообщений по умолчанию должен быть сопоставим с использованием QUIET при настройке политики OLD, за исключением того, что теперь будут выводиться предупреждения.
  • Параметры PREFIX, TMP_DIR, STAMP_DIR, LOG_DIR и DOWNLOAD_DIR и соответствующие им свойства каталогов игнорируются. Модуль FetchContent управляет этими расположениями самостоятельно.
  • cmake --fresh удалит файлы меток и скриптов, используемые для отслеживания и получения зависимости. Это приведёт к повторному выполнению этапов загрузки, обновления и применения исправлений для зависимости. Каталог, используемый для загрузок, не затрагивается параметром cmake --fresh, поэтому ранее загруженные файлы для метода загрузки URL можно использовать повторно.

Поведение OLD имеет следующие особенности:

  • Для выполнения этапов загрузки, обновления и применения исправлений всегда используется под-сборка. Инструмент сборки должен быть доступен, даже если команда FetchContent_Populate() используется в режиме скрипта CMake.
  • Можно использовать генераторные выражения и переменные GNU Make вида $(SOMEVAR), хотя такое использование почти всегда неуместно. Они вычисляются в под-сборке, поэтому им недоступна какая-либо информация из основной сборки.
  • Поддерживаются все параметры ведения журнала, управления терминалом и каталогами, связанные с этапами загрузки, обновления или применения исправлений.
  • Если используется параметр QUIET или переменной FETCHCONTENT_QUIET присвоено значение true, предупреждения не будут отображаться в выводе.
  • Параметр cmake --fresh не влияет на файлы меток или скриптов зависимости. Ранее выполненные этапы будут запущены повторно, только если изменились сведения о зависимости.

С большой вероятностью пользователи могут задать переменной CMAKE_POLICY_DEFAULT_CMP0168 значение NEW, чтобы глобально переключиться на поведение NEW, пока проект и его зависимости не будут обновлены для использования настройки политики NEW по умолчанию. Проекты обычно не используют возможности, которые больше не поддерживаются в поведении NEW, и даже такие проекты часто продолжают нормально работать, когда эти параметры игнорируются. Перед глобальной установкой этого поведения проверьте, не используют ли вызовы FetchContent_Declare() или FetchContent_Populate() игнорируемые параметры таким образом, который изменит наблюдаемое поведение, кроме случаев, когда временные или созданные внутренними средствами файлы размещаются в других каталогах.

Эта политика введена в CMake версии 3.30. Её можно задать с помощью cmake_policy() или cmake_minimum_required(). Если она не задана, CMake не выводит предупреждение и использует поведение OLD.

Примечание

Поведение OLD политики по определению устарело и может быть удалено в будущей версии CMake.

© 2000–2026 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/latest/policy/CMP0168.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API