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_policy() или cmake_minimum_required(). Если она не установлена, CMake выдает предупреждение и использует поведение OLD.
Примечание
Поведение OLD политики является deprecated by definition и может быть удалено в будущих версиях CMake.
© 2000–2024 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.29/policy/CMP0114.html