CMP0114
Новая в версии 3.19.
ExternalProject шаги полностью принимают свои шаги.
Опция ExternalProject_Add() STEP_TARGETS и функция ExternalProject_Add_StepTargets() могут использоваться для создания целей сборки для отдельных шагов внешнего проекта.
В CMake 3.18 и ниже цели шагов имеют некоторые ограничения:
- Цели шагов всегда зависят от целей, именованных опцией
ExternalProject_Add()DEPENDS, даже если не все шаги их нуждаются. Для того, чтобы позволить создавать цели шагов без этих зависимостей, можно использовать опциюExternalProject_Add()INDEPENDENT_STEP_TARGETSили опциюExternalProject_Add_StepTargets()NO_DEPENDS. Однако добавление таких "независимых" целей шагов имеет смысл только для определенных шагов, таких какdownload,update, иpatch, поскольку они не нуждаются ни в каких зависимостях от внешнего проекта. Кроме того, не имеет смысла создавать независимые цели шагов для шагов, которые зависят от зависимых шагов. Такие правила не налагаются, и проекты, которые их не соблюдают, могут генерировать системы сборки с запутанным и специфичным для генератора поведением. -
Цели шагов содержат копии пользовательских команд, реализующих их шаги, которые отделены от копий в основной цели, созданной
ExternalProject_Add(), и основная цель не зависит от целей шагов. При параллельной сборке, которая одновременно выполняет основную цель и цели шагов, несколько копий команд шагов могут выполняться одновременно и конкурировать друг с другом.Кроме того, до политики
CMP0113, цели шагов, генерируемые Генераторами Makefile, также содержат все пользовательские команды, от которых зависит их шаг. Это может привести к повторному выполнению этих шагов даже в последовательной сборке.
В CMake 3.19 и выше модуль ExternalProject предпочитает пересмотренный дизайн для решения этих проблем:
-
Каждый шаг классифицируется как "независимый", если он не зависит от других целей, именованных опцией
ExternalProject_Add()DEPENDS. По умолчанию предварительно определенные шаги автоматически классифицируются:- Шаги
download,update, иpatchявляются независимыми. - Шаги
configure,build,test, иinstallне являются.
Для пользовательских шагов команда
ExternalProject_Add_Step()предоставляет опциюINDEPENDENT, чтобы отметить их как независимые. Ошибкой является маркировка шага как независимого, если он зависит от других шагов, которые не являются независимыми. Обратите внимание, что это использование термина "независимый" относится только к независимости от внешних целей и ортогонально зависимостям шага от других шагов. - Шаги
- Цели шагов, созданные опцией
ExternalProject_Add()STEP_TARGETSили функциейExternalProject_Add_Step(), теперь независимы тогда и только тогда, когда их шаги отмечены как независимые. ОпцияExternalProject_Add()INDEPENDENT_STEP_TARGETSи опцияExternalProject_Add_StepTargets()NO_DEPENDSбольше не допускаются. -
Цели шагов, при создании, полностью отвечают за хранение пользовательских команд, реализующих их шаги. Основная цель, созданная
ExternalProject_Add(), зависит от целей шагов, а цели шагов зависят друг от друга. Зависимости на уровне целей соответствуют зависимостям на уровне файлов, используемым пользовательскими командами для каждого шага.Когда используется опция
ExternalProject_Add()UPDATE_DISCONNECTEDилиTEST_EXCLUDE_FROM_MAIN, или опцияExternalProject_Add_Step()EXCLUDE_FROM_MAINиспользуется для пользовательского шага, некоторые цели шагов могут быть созданы автоматически. Они необходимы для хранения шагов, на которые обычно ссылается основная цель и разнесённые цели шагов.
Политика CMP0114 обеспечивает совместимость для проектов, которые не были обновлены, чтобы ожидать нового поведения. Поведение OLD для этой политики заключается в использовании описанного выше поведения из 3.18 и ниже. Поведение NEW для этой политики заключается в использовании описанного выше поведения, предпочтительного в 3.19 и выше.
Эта политика была введена в CMake версии 3.19. CMake версии 3.20.0-rc3 предупреждает, когда политика не установлена, и использует OLD поведение. Используйте команду cmake_policy(), чтобы установить её в OLD или NEW явно.
© 2000–2021 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.20/policy/CMP0114.html