ExternalProject
Создание пользовательских целей для сборки проектов во внешних деревьях
-
ExternalProject_Add -
Функция
ExternalProject_Addсоздаёт пользовательскую цель для управления этапами загрузки, обновления/патчинга, конфигурации, сборки, установки и тестирования внешнего проекта:ExternalProject_Add(<name> [<option>...])
Общие параметры:
-
DEPENDS <projects>... - Цели, от которых зависит проект
-
PREFIX <dir> - Корневой каталог для всего проекта
-
LIST_SEPARATOR <sep> - Разделитель, заменяемый на «;» в командных строках
-
TMP_DIR <dir> - Каталог для хранения временных файлов
-
STAMP_DIR <dir> - Каталог для хранения отметки времени этапов
-
EXCLUDE_FROM_ALL 1 - Цель «all» от неё не зависит
Параметры этапа загрузки:
-
DOWNLOAD_NAME <fname> - Имя файла для сохранения (если это не конец URL)
-
DOWNLOAD_DIR <dir> - Каталог для хранения загруженных файлов
-
DOWNLOAD_COMMAND <cmd>... - Команда для загрузки дерева исходного кода
-
DOWNLOAD_NO_PROGRESS 1 - Отключить сообщения о прогрессе загрузки
-
CVS_REPOSITORY <cvsroot> - CVSROOT репозитория CVS
-
CVS_MODULE <mod> - Модуль для проверки из репозитория CVS
-
CVS_TAG <tag> - Тег для проверки из репозитория CVS
-
SVN_REPOSITORY <url> - URL репозитория Subversion
-
SVN_REVISION -r<rev> - Ревизия для проверки из репозитория Subversion
-
SVN_USERNAME <username> - Имя пользователя для проверки и обновления Subversion
-
SVN_PASSWORD <password> - Пароль для проверки и обновления Subversion
-
SVN_TRUST_CERT 1 - Доверять сертификату сайта сервера Subversion
-
GIT_REPOSITORY <url> - URL репозитория git
-
GIT_TAG <tag> - Имя ветки git, идентификатор коммита или тег
-
GIT_REMOTE_NAME <name> - Необязательное имя удалённого хранилища, по умолчанию
origin -
GIT_SUBMODULES <module>... - Git подмодули, которые нужно обновить, все, если пусто
-
GIT_SHALLOW 1 - Указать Git клонировать с
--depth 1. Используйте, когдаGIT_TAGне указан или когда он задаёт ветку, чтобы загрузить только вершину ветки без остальной её истории. -
GIT_PROGRESS 1 - Заставить Git клонировать с
--progress. Для больших проектов этап клонирования ничего не выводит, что может создать видимость зависания сборки. Этот параметр заставляет Git выводить информацию о прогрессе во время клонирования, чтобы показывать текущий прогресс. -
GIT_CONFIG <option>... - Заставить Git клонировать с
--config <option>. Используйте дополнительные параметры конфигурации при клонировании проекта (key=valueкак ожидается %%%CODE_BLOCK_34%%). -
HG_REPOSITORY <url> - URL репозитория mercurial
-
HG_TAG <tag> - Имя ветки mercurial, идентификатор коммита или тег
-
URL /.../src.tgz [/.../src.tgz]... - Полный путь или URL(ы) исходного кода. Несколько URL разрешены как зеркала.
-
URL_HASH ALGO=value - Хеш файла по URL
-
URL_MD5 md5 - Эквивалентно URL_HASH MD5=md5
-
HTTP_USERNAME <username> - Имя пользователя для загрузки
-
HTTP_PASSWORD <username> - Пароль для загрузки
-
HTTP_HEADER <header> - HTTP заголовок для загрузки. Подпараметр можно повторять несколько раз.
-
TLS_VERIFY <bool> - Проверять сертификат для https
-
TLS_CAINFO <file> - Путь к файлу сертификата доверенной стороны
-
TIMEOUT <seconds> - Время, разрешённое на загрузку файла
-
DOWNLOAD_NO_EXTRACT 1 - Только загрузить файл и не разархивировать; полный путь к загруженному файлу доступен как
<DOWNLOADED_FILE>.
Параметры этапа обновления/патчинга:
-
UPDATE_COMMAND <cmd>... - Команда для обновления рабочей области исходного кода
-
UPDATE_DISCONNECTED 1 - Никогда не обновлять автоматически из удалённого репозитория
-
PATCH_COMMAND <cmd>... - Команда для применения патча загруженного исходного кода
Параметры этапа конфигурации:
-
SOURCE_DIR <dir> - Исходный каталог, который будет использован для сборки
-
SOURCE_SUBDIR <dir> - Путь к CMakeLists.txt относительно
SOURCE_DIR -
CONFIGURE_COMMAND <cmd>... - Команда для конфигурации дерева сборки
-
CMAKE_COMMAND /.../cmake - Указать альтернативную программу cmake
-
CMAKE_GENERATOR <gen> - Указать генератор для локальной сборки
-
CMAKE_GENERATOR_PLATFORM <platform> - Имя платформы, специфичное для генератора
-
CMAKE_GENERATOR_TOOLSET <toolset> - Имя набора инструментов, специфичное для генератора
-
CMAKE_ARGS <arg>... - Аргументы командной строки CMake. Эти аргументы передаются в командную строку CMake и могут содержать аргументы, отличные от значений кеша; см. также
CMake Options. Аргументы в формате-Dvar:string=onвсегда передаются в командную строку и поэтому не могут быть изменены пользователем. Аргументы могут использоватьgenerator expressions. -
CMAKE_CACHE_ARGS <arg>... - Начальные аргументы кеша в формате
-Dvar:string=on. Эти аргументы записываются в скрипт предварительной загрузки, который заполняет кеш CMake; см. такжеcmake -C. Это позволяет обойти ограничения длины командной строки. Эти аргументыset()с помощью аргументаFORCE, и поэтому не могут быть изменены пользователем. Аргументы могут использоватьgenerator expressions. -
CMAKE_CACHE_DEFAULT_ARGS <arg>... - Начальные значения аргументов кеша по умолчанию в формате
-Dvar:string=on. Эти аргументы записываются в скрипт предварительной загрузки, который заполняет кеш CMake; см. такжеcmake -C. Это позволяет обойти ограничения длины командной строки. Эти аргументы могут быть использованы в качестве значения по умолчанию, которое будет установлено, если предварительное значение не найдено в кеше, и пользователь может его изменить позже. Аргументы могут использоватьgenerator expressions.
Параметры этапа сборки:
-
BINARY_DIR <dir> - Указать расположение каталога сборки
-
BUILD_COMMAND <cmd>... - Команда для запуска локальной сборки
-
BUILD_IN_SOURCE 1 - Использовать каталог исходного кода для каталога сборки
-
BUILD_ALWAYS 1 - Файл отметки времени не используется, этап сборки всегда выполняется
-
BUILD_BYPRODUCTS <file>... - Файлы, которые будут сгенерированы командой сборки, но время их изменения может или не может быть обновлено последующими сборками.
Параметры этапа установки:
-
INSTALL_DIR <dir> - Префикс установки, который будет помещён в заполнитель
<INSTALL_DIR>. Это фактически не настраивает внешний проект для установки по указанному префиксу. Для этого нужно передать соответствующие аргументы в этап конфигурации внешнего проекта, например, с помощью<INSTALL_DIR> -
INSTALL_COMMAND <cmd>... - Команда для запуска установки внешнего проекта после его сборки. Это происходит только во время сборки вызывающего проекта. Чтобы установить файлы из внешнего проекта вместе с локально собранными файлами, необходимо добавить отдельный локальный вызов
install()для извлечения файлов из одного из деревьев внешнего проекта.
Параметры этапа тестирования:
-
TEST_BEFORE_INSTALL 1 - Добавить этап тестирования, выполняемый до этапа установки
-
TEST_AFTER_INSTALL 1 - Добавить этап тестирования, выполняемый после этапа установки
-
TEST_EXCLUDE_FROM_MAIN 1 - Основная цель не зависит от этапа тестирования
-
TEST_COMMAND <cmd>... - Команда для запуска тестирования
Параметры для ведения логов вывода:
-
LOG_DOWNLOAD 1 - Оборачивает загрузку в скрипт для ведения логов вывода
-
LOG_UPDATE 1 - Оборачивает обновление в скрипт для ведения логов вывода
-
LOG_CONFIGURE 1 - Оборачивает конфигурацию в скрипт для ведения логов вывода
-
LOG_BUILD 1 - Оборачивает сборку в скрипт для ведения логов вывода
-
LOG_TEST 1 - Оборачивает тестирование в скрипт для ведения логов вывода
-
LOG_INSTALL 1 - Оборачивает установку в скрипт для ведения логов вывода
Этапы могут получить прямой доступ к терминалу, если это возможно. С генератором
Ninjaэто помещает этапы вconsolepool. Параметры:-
USES_TERMINAL_DOWNLOAD 1 - Предоставить терминальный доступ для загрузки.
-
USES_TERMINAL_UPDATE 1 - Предоставить терминальный доступ для обновления.
-
USES_TERMINAL_CONFIGURE 1 - Предоставить терминальный доступ для конфигурации.
-
USES_TERMINAL_BUILD 1 - Предоставить терминальный доступ для сборки.
-
USES_TERMINAL_TEST 1 - Предоставить терминальный доступ для тестирования.
-
USES_TERMINAL_INSTALL 1 - Предоставить терминальный доступ для установки.
Дополнительные параметры:
-
STEP_TARGETS <step-target>... - Генерировать пользовательские цели для этих этапов
-
INDEPENDENT_STEP_TARGETS <step-target>... - Генерировать пользовательские цели для этих этапов, которые не зависят от других внешних проектов, даже если зависимость установлена
Параметры
*_DIRопределяют каталоги для проекта, с вычислением по умолчанию следующим образом. Если параметрPREFIXзадан дляExternalProject_Add()или свойство каталогаEP_PREFIXустановлено, тогда внешний проект собирается и устанавливается в указанном префиксе:TMP_DIR = <prefix>/tmp STAMP_DIR = <prefix>/src/<name>-stamp DOWNLOAD_DIR = <prefix>/src SOURCE_DIR = <prefix>/src/<name> BINARY_DIR = <prefix>/src/<name>-build INSTALL_DIR = <prefix>
В противном случае, если свойство каталога
EP_BASEустановлено, компоненты внешнего проекта хранятся в указанном базовом каталоге:TMP_DIR = <base>/tmp/<name> STAMP_DIR = <base>/Stamp/<name> DOWNLOAD_DIR = <base>/Download/<name> SOURCE_DIR = <base>/Source/<name> BINARY_DIR = <base>/Build/<name> INSTALL_DIR = <base>/Install/<name>
Если
PREFIX,EP_PREFIX, илиEP_BASEне указаны, по умолчаниюPREFIXустанавливается в<name>-prefix. Относительные пути интерпретируются относительно каталога сборки, соответствующего каталогу исходного кода, в котором вызываетсяExternalProject_Add.Если
SOURCE_SUBDIRустановлено, иCONFIGURE_COMMANDне указано, команда конфигурации запустит CMake сCMakeLists.txt, расположенным в относительном пути, указанном вSOURCE_SUBDIR, относительноSOURCE_DIR. ЕслиSOURCE_SUBDIRне задано, используетсяSOURCE_DIR -
Если
SOURCE_DIRявно задан как существующая директория, проект будет скомпилирован из неё. В противном случае необходимо указать шаг загрузки, используя один из параметровDOWNLOAD_COMMAND,CVS_*,SVN_*, илиURL. ПараметрURLможет ссылаться на локальную директорию или архив исходных кодов, или на удалённый архив (например,http://.../src.tgz).Если
UPDATE_DISCONNECTEDустановлен, шаг обновления не выполняется автоматически при сборке основного целевого объекта. Шаг обновления всё ещё может быть добавлен как целевой шаг и вызван вручную. Это полезно, если вы хотите позволить сборку проекта при отсутствии подключения к сети (возможно, вам всё ещё потребуется сеть для шага загрузки). По умолчанию эта опция отключена. Свойство директорииEP_UPDATE_DISCONNECTEDможет быть использовано для изменения значения по умолчанию для всех внешних проектов в текущей директории и её поддиректориях.
-
ExternalProject_Add_Step -
Функция
ExternalProject_Add_Stepдобавляет пользовательский шаг к внешнему проекту:ExternalProject_Add_Step(<name> <step> [<option>...])
Параметры:
-
COMMAND <cmd>... - Командная строка, вызываемая этим шагом
-
COMMENT "<text>..." - Текст, отображаемый при выполнении шага
-
DEPENDEES <step>... - Шаги, от которых зависит этот шаг
-
DEPENDERS <step>... - Шаги, которые зависят от этого шага
-
DEPENDS <file>... - Файлы, от которых зависит этот шаг
-
BYPRODUCTS <file>... - Файлы, которые будут сгенерированы этим шагом, но время их последнего изменения может или не может быть обновлено последующими сборками.
-
ALWAYS 1 - Файл метки отсутствует, шаг всегда выполняется
-
EXCLUDE_FROM_MAIN 1 - Основной целевой объект не зависит от этого шага
-
WORKING_DIRECTORY <dir> - Рабочая директория для команды
-
LOG 1 - Обернуть шаг в скрипт для логирования вывода
-
USES_TERMINAL 1 - Предоставить шагу прямой доступ к терминалу, если это возможно.
Командная строка, комментарий, рабочая директория и побочные продукты каждого стандартного и пользовательского шага обрабатываются для замены маркеров
<SOURCE_DIR>,<SOURCE_SUBDIR>,<BINARY_DIR>,<INSTALL_DIR>, и<TMP_DIR>соответствующими значениями свойств. -
Любой встроенный шаг, который указывает <step>_COMMAND cmd..., или пользовательский шаг, который указывает COMMAND cmd..., может указать дополнительные командные строки в формате COMMAND cmd.... Во время сборки команды будут выполняться в порядке их указания, и сборка прервётся, если одна из команд завершится с ошибкой. Например:
... BUILD_COMMAND make COMMAND echo done ...
указывает на выполнение make и затем echo done во время шага сборки. Сохраняется ли текущая рабочая директория между командами, не определено. Поведение операторов оболочки, таких как &&, не определено.
Аргументы к параметрам <step>_COMMAND или COMMAND могут использовать generator expressions.
-
ExternalProject_Get_Property -
Функция
ExternalProject_Get_Propertyизвлекает свойства целевых объектов внешнего проекта:ExternalProject_Get_Property(<name> [prop1 [prop2 [...]]])
Она сохраняет значения свойств в переменных с тем же именем. Имена свойств соответствуют именам ключевых аргументов функции
ExternalProject_Add.
-
ExternalProject_Add_StepTargets -
Функция
ExternalProject_Add_StepTargetsгенерирует пользовательские целевые объекты для перечисленных шагов:ExternalProject_Add_StepTargets(<name> [NO_DEPENDS] [step1 [step2 [...]]])
Если NO_DEPENDS установлено, целевой объект не будет зависеть от зависимостей всего проекта. Это обычно безопасно использовать для шагов загрузки, обновления и исправления, которые не требуют обновления и компиляции всех зависимостей. Использование NO_DEPENDS для других стандартных шагов может нарушить параллельные сборки, поэтому следует этого избегать. Для пользовательских шагов следует рассмотреть, требуется ли выполнение пользовательских команд, что зависимости были настроены, скомпилированы и установлены.
Если STEP_TARGETS или INDEPENDENT_STEP_TARGETS установлено, то ExternalProject_Add_StepTargets автоматически вызывается в конце соответствующих вызовов ExternalProject_Add_Step. Передайте STEP_TARGETS или INDEPENDENT_STEP_TARGETS явно отдельным вызовам ExternalProject_Add, или неявно всем вызовам ExternalProject_Add путём установки свойств директорий EP_STEP_TARGETS и EP_INDEPENDENT_STEP_TARGETS. Версия аргумента INDEPENDENT и свойства вызовет ExternalProject_Add_StepTargets с аргументом NO_DEPENDS.
Если STEP_TARGETS и INDEPENDENT_STEP_TARGETS не установлены, клиенты всё ещё могут вручную вызвать ExternalProject_Add_StepTargets после вызова ExternalProject_Add или ExternalProject_Add_Step.
Эта функциональность предназначена для удобного независимого управления шагами, указывая целевые объекты в командной строке сборки. Например, вы можете отправлять данные в панель мониторинга подпроекта, где хотите запустить часть конфигурации сборки, затем отправить данные в панель мониторинга, затем часть сборки, затем тесты. Если вы вызываете пользовательский целевой объект, который зависит от шага в середине цепочки зависимостей шагов, все предыдущие шаги также будут выполнены, чтобы убедиться, что всё обновлено.
Например, чтобы управлять шагами конфигурации, сборки и тестирования независимо для каждого вызова ExternalProject_Add в вашем проекте, напишите следующую строку перед любыми вызовами ExternalProject_Add в вашем файле CMakeLists.txt.
set_property(DIRECTORY PROPERTY EP_STEP_TARGETS configure build test)
-
ExternalProject_Add_StepDependencies -
Функция
ExternalProject_Add_StepDependenciesдобавляет зависимости для шагов внешнего проекта:ExternalProject_Add_StepDependencies(<name> <step> [target1 [target2 [...]]])
Эта функция заботится о настройке зависимостей на уровне целевых объектов и файлов и гарантирует, что параллельные сборки не будут нарушены. Её следует использовать вместо
add_dependencies()при добавлении зависимостей для некоторых целевых объектов шагов, сгенерированных функциейExternalProject.
© 2000–2019 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.9/module/ExternalProject.html