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