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