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.21.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.21/policy/CMP0114.html