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