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.23.3 выдает предупреждение, когда политика не установлена, и использует поведение OLD. Используйте команду cmake_policy() для явного ее установки в OLD или NEW.
© 2000–2022 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.23/policy/CMP0114.html