ExternalProject
Команды
Определение внешнего проекта
-
ExternalProject_Add -
Функция
ExternalProject_Add()создаёт пользовательскую цель для управления загрузкой, обновлением/патчингом, настройкой, сборкой, установкой и тестированием внешнего проекта:ExternalProject_Add(<name> [<option>...])
Отдельные шаги в процессе могут управляться независимо (например, для отправки в CDash), и могут быть определены дополнительные пользовательские шаги, а также возможность управления зависимостями шагов. Структура каталогов, используемая для управления внешним проектом, также может быть настраиваемой. Функция поддерживает большое количество опций, которые могут быть использованы для настройки поведения внешнего проекта.
- Параметры каталогов:
-
В большинстве случаев, стандартная структура каталогов достаточна. Это в основном деталь реализации, которую обычно не нужно изменять в основном проекте. Однако в некоторых случаях контроль над структурой каталогов может быть полезным или необходимым. Параметры каталогов могут быть полезнее с точки зрения того, что основной проект может использовать команду
ExternalProject_Get_Property()для извлечения их значений, тем самым позволяя главному проекту ссылаться на артефакты сборки внешнего проекта.-
PREFIX <dir> -
Корневой каталог для внешнего проекта. За исключением случаев, указанных ниже, все остальные каталоги, связанные с внешним проектом, будут созданы в нём.
-
TMP_DIR <dir> -
Каталог для хранения временных файлов.
-
STAMP_DIR <dir> -
Каталог, в котором хранятся отметки времени каждого шага. Лог-файлы отдельных шагов также создаются здесь, если не переопределены параметром LOG_DIR (см. Параметры ведения журнала ниже).
-
LOG_DIR <dir> -
Каталог для хранения логов каждого шага.
-
DOWNLOAD_DIR <dir> -
Каталог, в котором хранятся загруженные файлы перед распаковкой. Этот каталог используется только методом загрузки URL, все другие методы загрузки используют
SOURCE_DIRнапрямую вместо этого. -
SOURCE_DIR <dir> -
Исходный каталог, в который будут распакованы загруженные содержимое, или, для методов загрузки, отличных от URL, каталог, в котором репозиторий должен быть проверено, клонирован и т.д. Если метод загрузки не указан, этот параметр должен указывать на существующий каталог, в котором внешний проект уже был распакован или клонирован/проверен.
Примечание
Если метод загрузки указан, любое существующее содержимое исходного каталога может быть удалено. Только метод загрузки URL проверяет, отсутствует ли этот каталог или он пуст, прежде чем начать загрузку, прекращая работу с ошибкой, если это не так. Все остальные методы загрузки безмолвно удаляют любое предыдущее содержимое исходного каталога.
-
BINARY_DIR <dir> -
Укажите расположение каталога сборки. Этот параметр игнорируется, если
BUILD_IN_SOURCEвключён. -
INSTALL_DIR <dir> -
Префикс установки, который будет помещён в
<INSTALL_DIR>заполнитель. Это не настраивает фактически внешний проект для установки по заданному префиксу. Это нужно сделать, передав соответствующие аргументы шагу конфигурации внешнего проекта, например, используя<INSTALL_DIR>.
Если любой из вышеперечисленных
..._DIRпараметров не указан, их значения вычисляются следующим образом. Если параметрPREFIXзадан или свойство каталога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> LOG_DIR = <STAMP_DIR>
В противном случае, если свойство каталога
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> LOG_DIR = <STAMP_DIR>
Если не указан
PREFIX,EP_PREFIX, илиEP_BASE, то по умолчаниюPREFIXустанавливается в<name>-prefix. Относительные пути интерпретируются относительноCMAKE_CURRENT_BINARY_DIRв момент вызоваExternalProject_Add(). -
- Параметры шага загрузки:
-
Метод загрузки может быть опущен, если используется параметр
SOURCE_DIRдля указания на существующий непустой каталог. В противном случае должен быть указан один из методов загрузки ниже (несколько методов загрузки не должны быть заданы) или предоставлен пользовательскийDOWNLOAD_COMMAND.-
DOWNLOAD_COMMAND <cmd>... -
Переопределяет команду, используемую для шага загрузки (
generator expressionsподдерживаются). Если этот параметр указан, все другие параметры загрузки будут проигнорированы. Передача пустой строки для<cmd>фактически отключает шаг загрузки. - Загрузка по URL
-
-
URL <url1> [<url2>...] -
Список путей и/или URL(ов) источника внешнего проекта. Если указано несколько URL-адресов, они будут проверяться по очереди до тех пор, пока один из них не будет успешным. URL-адрес может быть обычным путём в локальной файловой системе (в этом случае он должен быть единственным указанным URL-адресом) или любым загружаемым URL-адресом, поддерживаемым командой
file(DOWNLOAD). Путь локальной файловой системы может ссылаться на существующий каталог или архивный файл, а URL-адрес должен указывать на файл, который можно рассматривать как архив. Когда используется архив, он будет автоматически распакован, если параметрDOWNLOAD_NO_EXTRACTне запретит это. Тип архива определяется путём проверки фактического содержимого, а не логики, основанной на расширении файла. -
URL_HASH <algo>=<hashValue> -
Хэш загружаемого архивного файла. Аргумент должен иметь вид
<algo>=<hashValue>, гдеalgoможет быть любым из алгоритмов хэширования, поддерживаемых командойfile(). Указание этого параметра настоятельно рекомендуется для загрузок по URL, так как оно обеспечивает целостность загружаемого содержимого. Также используется как проверка для ранее загруженного файла, позволяя избежать соединения с удалённым местоположением, если в локальном каталоге уже есть файл из предыдущей загрузки, соответствующий заданному хэшу. -
URL_MD5 <md5> -
Эквивалентно
URL_HASH MD5=<md5>. -
DOWNLOAD_NAME <fname> -
Имя файла, которое следует использовать для загружаемого файла. Если не указано, имя файла определяется по окончанию URL-адреса. Этот параметр редко используется, имя по умолчанию обычно подходит, и обычно не используется вне кода, внутреннего для модуля
ExternalProject. -
DOWNLOAD_NO_EXTRACT <bool> -
Позволяет отключить этап извлечения загруженного содержимого путём передачи булевого значения true для этого параметра. Если этот параметр не указан, загруженное содержимое будет автоматически распаковано, если это необходимо. Если извлечение отключено, полный путь к загруженному файлу доступен в последующих шагах как
<DOWNLOADED_FILE>или как свойствоDOWNLOADED_FILEс помощью командыExternalProject_Get_Property(). -
DOWNLOAD_NO_PROGRESS <bool> -
Может быть использовано для отключения регистрации прогресса загрузки. Если этот параметр не указан, сообщения о прогрессе загрузки будут записываться в журнал.
-
TIMEOUT <seconds> -
Максимальное время, разрешённое для операций загрузки файлов.
-
HTTP_USERNAME <username> -
Имя пользователя для операции загрузки, если требуется аутентификация.
-
HTTP_PASSWORD <password> -
Пароль для операции загрузки, если требуется аутентификация.
-
HTTP_HEADER <header1> [<header2>...] -
Предоставляет произвольный список HTTP-заголовков для операции загрузки. Это может быть полезно для доступа к содержимому в системах, таких как AWS и т.д.
-
TLS_VERIFY <bool> -
Указывает, должна ли выполняться проверка сертификата для https URL-адресов. Если этот параметр не указан, поведение по умолчанию определяется переменной
CMAKE_TLS_VERIFY(см.file(DOWNLOAD)). Если и это не установлено, проверка сертификата не будет выполняться. В ситуациях, когдаURL_HASHнельзя предоставить, этот параметр может быть альтернативной мерой проверки. -
TLS_CAINFO <file> -
Укажите файл с сертификатами доверенных центров сертификации для использования, если
TLS_VERIFYвключён. Если этот параметр не указан, используется значение переменнойCMAKE_TLS_CAINFO(см.file(DOWNLOAD)) -
NETRC <level> -
Указывает, должен ли файл
.netrcиспользоваться для операции. Если этот параметр не указан, используется значение переменнойCMAKE_NETRC(см.file(DOWNLOAD)) Допустимые значения:-
IGNORED -
Файл
.netrcигнорируется. Это значение по умолчанию. -
OPTIONAL -
Файл
.netrcнеобязателен, и предпочтительна информация в URL-адресе. Файл будет просканирован для поиска любой информации, которая не указана в URL-адресе. -
REQUIRED -
Файл
.netrcнеобходим, и информация в URL-адресе игнорируется.
-
-
NETRC_FILE <file> -
Укажите альтернативный файл
.netrcвместо файла в вашем домашнем каталоге, если уровеньNETRCравенOPTIONALилиREQUIREDЕсли этот параметр не указан, используется значение переменнойCMAKE_NETRC_FILE(см.file(DOWNLOAD))
-
- Git
-
-
ПРИМЕЧАНИЕ: Для использования этого метода загрузки требуется версия git 1.6.5 или более поздняя.
-
GIT_REPOSITORY <url> -
URL репозитория git. Можно использовать любой URL, понимаемый командой
git. -
GIT_TAG <tag> -
Имя ветки, тега или хэш коммита Git. Обратите внимание, что имена веток и тегов обычно следует указывать как имена удалённых репозиториев (например,
origin/myBranchвместоmyBranch). Это гарантирует, что при перемещении тега или слиянии ветки на удалённом репозитории, локальное клонирование будет обновляться корректно. Однако, в целом, предпочтительнее указывать хэш коммита по ряду причин:- Если локальное клонирование уже содержит коммит, соответствующий хэшу, не требуется выполнять
git fetchдля проверки изменений при каждом повторном запуске CMake. Это может значительно ускорить процесс, если используются многие внешние проекты. - Использование конкретного хэша git гарантирует, что история основного проекта полностью прослеживается до определённой точки в эволюции внешнего проекта. Если используется имя ветки или тега, то вывод определённого коммита основного проекта не обязательно привязывает весь сборку к определённой точке в жизни внешнего проекта. Отсутствие такой детерминированной операции приводит к потере прослеживаемости и воспроизводимости в основном проекте.
Если
GIT_SHALLOWвключено,GIT_TAGработает только с именами веток и тегами. Хэш коммита недопустим. - Если локальное клонирование уже содержит коммит, соответствующий хэшу, не требуется выполнять
-
GIT_REMOTE_NAME <name> -
Необязательное имя удаленного репозитория. Если этот параметр не указан, он по умолчанию устанавливается в
origin. -
GIT_SUBMODULES <module>... -
Конкретные подмодули git, которые также должны быть обновлены. Если этот параметр не указан, все подмодули git будут обновлены. При установке
CMP0097вNEW, если это значение установлено на пустую строку, подмодули не инициализируются и не обновляются. -
GIT_SUBMODULES_RECURSE <bool> -
Укажите, нужно ли обновлять подмодули git (если они есть) рекурсивно, передав флаг
--recursiveкомандеgit submodule update. Если не указано, значение по умолчанию — включено. -
GIT_SHALLOW <bool> -
При включении этого параметра операция
git cloneбудет иметь параметр--depth 1. Это выполняет поверхностное клонирование, что позволяет избежать загрузки всей истории, а вместо этого извлекает только коммит, обозначенный параметромGIT_TAG. -
GIT_PROGRESS <bool> -
При включении этот параметр инструктирует операцию
git cloneсообщать о своём прогрессе, передавая ей параметр--progress. Без этого параметра шаг клонирования для больших проектов может казаться приостановленным, так как ничего не будет записано, пока операция клонирования не завершится. Хотя этот параметр может использоваться для отслеживания прогресса, чтобы избежать видимости приостановки сборки, он также может сделать сборку слишком шумной при использовании большого количества внешних проектов. -
GIT_CONFIG <option1> [<option2>...] -
Укажите список параметров конфигурации для передачи команде
git clone. Каждый указанный параметр будет преобразован в отдельный параметр--config <option>в командной строке командыgit clone, причем каждый параметр должен иметь видkey=value. -
GIT_REMOTE_UPDATE_STRATEGY <strategy> -
Когда
GIT_TAGотносится к удалённой ветке, этот параметр можно использовать для указания поведения шага обновления.<strategy>должен быть одним из следующих:-
CHECKOUT -
Игнорировать локальную ветку и всегда создавать ветку, указанную в
GIT_TAG. -
REBASE -
Попытаться выполнить слияние текущей ветки с веткой, указанной в
GIT_TAG. Если есть несохранённые локальные изменения, они будут сохранены временно, а затем восстановлены после слияния. Если слияние или восстановление сохранённых изменений завершатся неудачей, слияние будет прервано, и сборка завершится с ошибкой. ЕслиGIT_REMOTE_UPDATE_STRATEGYотсутствует, эта стратегия является стратегией по умолчанию, если стратегия по умолчанию не была переопределена с помощьюCMAKE_EP_GIT_REMOTE_UPDATE_STRATEGY(см. ниже). -
REBASE_CHECKOUT -
То же, что и
REBASE, за исключением того, что если слияние завершится неудачей, будет создан аннотированный тег в исходном положенииHEADдо слияния, а затем будет выбрана веткаGIT_TAGтак же, как и стратегияCHECKOUT. Сообщение, хранящееся в аннотированном теге, будет содержать информацию о том, что было предпринято, а имя тега будет включать отметку времени, поэтому каждый неудачный запуск будет добавлять новый тег. Эта стратегия гарантирует, что никакие изменения не будут потеряны, но обновления всегда должны быть успешными, еслиGIT_TAGотносится к валидному этапу, если нет несохранённых изменений, которые не могут быть восстановлены успешно.
Переменная
CMAKE_EP_GIT_REMOTE_UPDATE_STRATEGYможет быть установлена для переопределения стратегии по умолчанию. Эта переменная не должна настраиваться проектом, она предназначена для настройки пользователем. Она в первую очередь предназначена для использования в скриптах непрерывной интеграции для обеспечения того, что при переписывании истории в удалённой ветке сборка не получит непреднамеренных изменений или сбои из-за конфликтов при операциях слияния. -
-
- Subversion
-
-
SVN_REPOSITORY <url> -
URL репозитория Subversion.
-
SVN_REVISION -r<rev> -
Ревизия для выгрузки из репозитория Subversion.
-
SVN_USERNAME <username> -
Имя пользователя для выгрузки и обновления Subversion.
-
SVN_PASSWORD <password> -
Пароль для выгрузки и обновления Subversion.
-
SVN_TRUST_CERT <bool> -
Указывает, нужно ли доверять сертификату сайта сервера Subversion. При включении параметр
--trust-server-certпередаётся командам выгрузки и обновленияsvn.
-
- Mercurial
-
-
HG_REPOSITORY <url> -
URL репозитория mercurial.
-
HG_TAG <tag> -
Имя ветки, тега или идентификатор коммита Mercurial.
-
- CVS
-
-
CVS_REPOSITORY <cvsroot> -
CVSROOT репозитория CVS.
-
CVS_MODULE <mod> -
Модуль для выгрузки из репозитория CVS.
-
CVS_TAG <tag> -
Тег для выгрузки из репозитория CVS.
-
-
- Параметры шага обновления/патча:
-
При каждом повторном запуске CMake по умолчанию исходные файлы внешнего проекта будут обновляться, если метод загрузки поддерживает обновления (например, репозиторий git будет проверяться, если
GIT_TAGне ссылается на конкретный коммит).-
UPDATE_COMMAND <cmd>... -
Переопределяет шаг обновления метода загрузки пользовательской командой. Команда может использовать
generator expressions. -
UPDATE_DISCONNECTED <bool> -
При включении этот параметр пропускает шаг обновления. Однако он не предотвращает шаг загрузки. Шаг обновления всё ещё может быть добавлен как целевой шаг (см.
ExternalProject_Add_StepTargets()) и вызван вручную. Это полезно, если вы хотите позволить разработчикам создавать проект, будучи отключёнными от сети (хотя сеть всё ещё может потребоваться для шага загрузки).При наличии этого параметра рекомендуется сделать значение переменной кеша под управлением разработчика, а не встраивать его в код. Если этот параметр отсутствует, значение по умолчанию берётся из свойства каталога
EP_UPDATE_DISCONNECTED. Если и это не определено, обновления выполняются в обычном режиме. Свойство каталогаEP_UPDATE_DISCONNECTEDпредназначено как удобный способ управления поведениемUPDATE_DISCONNECTEDдля всей иерархии каталогов проекта и может быть более удобным способом предоставления разработчикам контроля над выполнением обновлений (предполагается, что проект также предоставляет переменную кеша или какой-либо другой удобный способ установки свойства каталога). -
PATCH_COMMAND <cmd>... -
Указывает пользовательскую команду для внесения исправлений в исходные файлы после обновления. По умолчанию команда исправлений не определена. Обратите внимание, что определение подходящей команды исправлений, которая работает надёжно, особенно для методов загрузки, таких как git, где изменение
GIT_TAGне отбрасывает изменения предыдущего исправления, но команда исправлений будет вызвана снова после обновления до нового тега, может быть довольно сложной.
-
- Параметры шага конфигурации:
-
Этап конфигурации выполняется после этапов загрузки и обновления. По умолчанию предполагается, что внешний проект является проектом CMake, но это можно переопределить при необходимости.
-
CONFIGURE_COMMAND <cmd>... -
Команда конфигурации по умолчанию выполняет CMake с параметрами, основанными на основном проекте. Для внешних проектов, не являющихся проектами CMake, необходимо использовать параметр
CONFIGURE_COMMAND, чтобы переопределить это поведение (generator expressionsподдерживаются). Для проектов, для которых не требуется этап конфигурации, укажите этот параметр со строкой-пустышкой в качестве команды для выполнения. -
CMAKE_COMMAND /.../cmake -
Укажите альтернативный исполняемый файл cmake для этапа конфигурации (используйте абсолютный путь). Это, как правило, не рекомендуется, так как желательно использовать одну и ту же версию CMake на протяжении всего процесса сборки. Этот параметр игнорируется, если пользовательская команда конфигурации была указана с помощью параметра
CONFIGURE_COMMAND. -
CMAKE_GENERATOR <gen> -
Переопределите генератор CMake, используемый для этапа конфигурации. Без этого параметра будет использован тот же генератор, что и для основной сборки. Этот параметр игнорируется, если пользовательская команда конфигурации была указана с параметром
CONFIGURE_COMMAND. -
CMAKE_GENERATOR_PLATFORM <platform> -
Передайте имя платформы, специфичное для генератора, команде CMake (см.
CMAKE_GENERATOR_PLATFORM). Указание этого параметра без параметраCMAKE_GENERATORявляется ошибкой. -
CMAKE_GENERATOR_TOOLSET <toolset> -
Передайте имя набора инструментов, специфичное для генератора, команде CMake (см.
CMAKE_GENERATOR_TOOLSET). Указание этого параметра без параметраCMAKE_GENERATORявляется ошибкой. -
CMAKE_GENERATOR_INSTANCE <instance> -
Передайте выбор экземпляра, специфичный для генератора, команде CMake (см.
CMAKE_GENERATOR_INSTANCE). Указание этого параметра без параметраCMAKE_GENERATORявляется ошибкой. -
CMAKE_ARGS <arg>... -
Указанные аргументы передаются в командную строку
cmake. Они могут быть любыми аргументами, которые понимает командаcmake, а не только значения кеша, определённые аргументами-D...(см. такжеCMake Options). Кроме того, аргументы могут использоватьgenerator expressions. -
CMAKE_CACHE_ARGS <arg>... -
Это альтернативный способ задания переменных кэша, когда проблемы с длиной командной строки могут стать проблемой. Аргументы должны быть в формате
-Dvar:STRING=value, которые затем преобразуются в команды CMakeset()с использованием параметраFORCE. Эти командыset()записываются в скрипт предварительной загрузки, который затем применяется с помощью опции командной строкиcmake -C. Аргументы могут использоватьgenerator expressions. -
CMAKE_CACHE_DEFAULT_ARGS <arg>... -
Это то же самое, что и параметр
CMAKE_CACHE_ARGS, за исключением того, что командыset()не включают ключевое словоFORCE. Это означает, что значения действуют только как начальные значения по умолчанию и не будут переопределять переменные, уже заданные в предыдущем запуске. Используйте этот параметр с осторожностью, так как это может привести к различным результатам в зависимости от того, запускается ли сборка с каталога свежей сборки или переиспользуются предыдущие результаты сборки.Если генератор CMake —
Green Hills MULTI, а не переопределен, параметры проекта по умолчанию для набора инструментов GHS и переменные кэша для настройки целевой системы будут перенесены во внешний проект. -
SOURCE_SUBDIR <dir> -
Если не указан параметр
CONFIGURE_COMMAND, этап конфигурации предполагает, что внешний проект имеет файлCMakeLists.txtв верхней части дерева исходных кодов (т. е. вSOURCE_DIR). ПараметрSOURCE_SUBDIRможно использовать для указания альтернативной директории в дереве исходных кодов для использования в качестве корня дерева исходных кодов CMake. Это должен быть относительный путь, который будет интерпретироваться как относительный кSOURCE_DIR. КогдаBUILD_IN_SOURCE 1указан, используетсяBUILD_COMMANDдля указания альтернативной директории в дереве исходных кодов.
-
- Параметры этапа сборки:
-
Если этап конфигурации предполагал, что внешний проект использует CMake в качестве системы сборки, этап сборки также будет использовать CMake. В противном случае этап сборки предположит сборку на основе Makefile и просто выполнит
makeбез аргументов в качестве этапа сборки по умолчанию. Это можно переопределить с помощью пользовательских команд сборки, если это необходимо.-
BUILD_COMMAND <cmd>... -
Переопределяет команду сборки по умолчанию (
generator expressionsподдерживаются). Если этот параметр не задан, команда сборки по умолчанию будет выбрана для интеграции со основной сборкой наиболее подходящим способом (например, использование рекурсивной командыmakeдля генераторов Makefile илиcmake --buildесли проект использует CMake сборку). Этот параметр можно задать со строкой-пустышкой для того чтобы этап сборки не делал ничего. -
BUILD_IN_SOURCE <bool> -
При включении этого параметра сборка будет выполняться непосредственно в дереве исходных кодов внешнего проекта. Это следует избегать, обычно предпочтительно использовать отдельный каталог сборки, но это может быть полезно, когда внешний проект предполагает сборку в исходном каталоге. Параметр
BINARY_DIRне должен быть указан при сборке в исходном каталоге. -
BUILD_ALWAYS <bool> -
Включение этого параметра принудительно заставляет выполнять этап сборки всегда. Это может быть наиболее простым способом надёжно убедиться, что зависимости сборки внешнего проекта обрабатываются, а не полагаться на метод по умолчанию, основанный на отметках времени успешного завершения. Этот параметр обычно не нужен, если разработчики не ожидают изменить что-то, от чего зависит сборка внешнего проекта, таким образом, что это не обнаруживается с помощью зависимостей целевых шагов (например,
SOURCE_DIRиспользуется без метода загрузки, и разработчики могут изменить исходные файлы вSOURCE_DIR). -
BUILD_BYPRODUCTS <file>... -
Указывает файлы, которые будут сгенерированы командой сборки, но у которых время модификации может или не может обновляться последующими сборками. В конечном итоге они передаются в качестве
BYPRODUCTSв собственный вызов этапа сборкиadd_custom_command().
-
- Параметры этапа установки:
-
Если этап конфигурации предполагал, что внешний проект использует CMake в качестве системы сборки, этап установки также будет использовать CMake. В противном случае этап установки предположит сборку на основе Makefile и просто выполнит
make installкак этап установки по умолчанию. Это можно переопределить с помощью пользовательских команд установки, если это необходимо.-
INSTALL_COMMAND <cmd>... -
Этап установки внешнего проекта вызывается как часть основной сборки. Он выполняется после этапа сборки внешнего проекта и может выполняться до или после этапа тестирования внешнего проекта (см. параметр
TEST_BEFORE_INSTALLниже). Правила установки внешнего проекта не являются частью правил установки основного проекта, поэтому, если что-либо из внешнего проекта должно быть установлено как часть основной сборки, это необходимо указать в основной сборке как дополнительные командыinstall(). Этап установки по умолчанию собирает цельinstallвнешнего проекта, но это можно переопределить с помощью пользовательской команды с помощью этого параметра (generator expressionsподдерживаются). Передача пустой строки в качестве<cmd>делает этап установки бесполезным.
-
- Параметры этапа тестирования:
-
-
Этап тестирования определён только в том случае, если предоставлены хотя бы один из следующих
TEST_...вариантов.-
TEST_COMMAND <cmd>... -
Переопределяет команду тестирования по умолчанию (
generator expressionsподдерживаются). Если этот параметр не указан, по умолчанию этап тестирования выполняет построение собственнойtestцели внешнего проекта. Этот параметр можно указать со значением<cmd>в виде пустой строки, что позволит определить этап тестирования, но не выполнить никаких действий. Не указывайте ни один из другихTEST_...параметров, если в качестве команды тестирования указана пустая строка, но предпочтительнее вообще опустить всеTEST_...параметры, если цель этапа тестирования не требуется. -
TEST_BEFORE_INSTALL <bool> -
При включении этого параметра этап тестирования будет выполняться перед этапом установки. По умолчанию этап тестирования выполняется после этапа установки.
-
TEST_AFTER_INSTALL <bool> -
Этот параметр в основном полезен как способ указать, что этап тестирования желателен, но все значения по умолчанию достаточны. Указание этого параметра с логическим значением true гарантирует, что этап тестирования определён и что он выполняется после этапа установки. Если оба
TEST_BEFORE_INSTALLиTEST_AFTER_INSTALLвключены, второй параметр будет проигнорирован. -
TEST_EXCLUDE_FROM_MAIN <bool> -
При включении этот параметр предотвращает зависимость основной цели ALL от этапа тестирования. Это может быть полезно для обеспечения определения этапа тестирования, но его вызов происходит только при необходимости.
-
- Параметры ведения журнала вывода:
-
Каждый из следующих
LOG_...параметров может использоваться для обертывания соответствующего этапа в сценарий, чтобы записать его вывод в файлы. Файлы журнала будут созданы вLOG_DIRесли указано, а иначе вSTAMP_DIRкаталоге с именами файлов, специфичными для шага.-
LOG_DOWNLOAD <bool> -
При включении вывод этапа загрузки записывается в файлы.
-
LOG_UPDATE <bool> -
При включении вывод этапа обновления записывается в файлы.
-
LOG_PATCH <bool> -
При включении вывод этапа исправления записывается в файлы.
-
LOG_CONFIGURE <bool> -
При включении вывод этапа конфигурации записывается в файлы.
-
LOG_BUILD <bool> -
При включении вывод этапа построения записывается в файлы.
-
LOG_INSTALL <bool> -
При включении вывод этапа установки записывается в файлы.
-
LOG_TEST <bool> -
При включении вывод этапа тестирования записывается в файлы.
-
LOG_MERGED_STDOUTERR <bool> -
При включении stdout и stderr будут объединены для любого этапа, вывод которого записывается в файлы.
-
LOG_OUTPUT_ON_FAILURE <bool> -
Этот параметр действует только в том случае, если включён хотя бы один из других
LOG_<step>параметров. Если происходит ошибка для этапа, для которого включено ведение журнала в файлы, вывод этого этапа будет выведен в консоль, еслиLOG_OUTPUT_ON_FAILUREимеет значение true. В случаях, когда регистрируется большой объём вывода, в консоль может быть выведена только его часть.
-
- Параметры доступа к терминалу:
-
В некоторых случаях этапы могут получить прямой доступ к терминалу. Предоставление этапу доступа к терминалу может позволить ему получать входные данные из терминала, если это необходимо, например, для аутентификационных данных, не предоставляемых другими параметрами. С помощью генератора
Ninjaэти параметры помещают этапы вconsolejob pool. Каждый этап может получить доступ к терминалу индивидуально с помощью следующих параметров:-
USES_TERMINAL_DOWNLOAD <bool> -
Предоставить этапу загрузки доступ к терминалу.
-
USES_TERMINAL_UPDATE <bool> -
Предоставить этапу обновления доступ к терминалу.
-
USES_TERMINAL_CONFIGURE <bool> -
Предоставить этапу конфигурации доступ к терминалу.
-
USES_TERMINAL_BUILD <bool> -
Предоставить этапу построения доступ к терминалу.
-
USES_TERMINAL_INSTALL <bool> -
Предоставить этапу установки доступ к терминалу.
-
USES_TERMINAL_TEST <bool> -
Предоставить этапу тестирования доступ к терминалу.
-
- Параметры цели:
-
-
DEPENDS <targets>... -
Укажите другие цели, от которых зависит внешний проект. Другие цели будут обновлены до актуального состояния перед выполнением каких-либо этапов внешнего проекта. Поскольку внешний проект использует дополнительные пользовательские цели внутри каждого этапа, параметр
DEPENDSявляется наиболее удобным способом обеспечения того, чтобы все эти этапы зависели от других целей. Простое выполнениеadd_dependencies(<name> <targets>)не сделает ни один из этапов зависимым от<targets>. -
EXCLUDE_FROM_ALL <bool> -
При включении этого параметра внешний проект исключается из основной цели ALL основного построения.
-
STEP_TARGETS <step-target>... -
Создать пользовательские цели для указанных этапов. Это необходимо, если этапы нужно запускать вручную или если их нужно использовать как зависимости других целей. Если этот параметр не указан, значение по умолчанию берётся из свойства каталога
EP_STEP_TARGETS. См.ExternalProject_Add_Step()ниже для получения дополнительной информации об эффектах этого параметра. -
INDEPENDENT_STEP_TARGETS <step-target>... -
Создать пользовательские цели для указанных этапов и предотвратить применение к этим целям обычных зависимостей. Если этот параметр не указан, значение по умолчанию берётся из свойства каталога
EP_INDEPENDENT_STEP_TARGETS. Этот параметр в основном полезен для независимого управления отдельными этапами, например, для настройки CDash, где каждый этап должен запускаться и сообщаться индивидуально, а не как одно целое построение. См.ExternalProject_Add_Step()ниже для получения дополнительной информации об эффектах этого параметра.
-
- Разные параметры:
-
-
LIST_SEPARATOR <sep> -
Для любого из различных
..._COMMANDпараметров замените;на<sep>в указанных строках команд. Это может быть полезно, когда переменные списков используются в командах, где они должны оказаться аргументами через пробел (<sep>в этом случае будет строкой с одним пробелом). -
COMMAND <cmd>... -
Любой из других
..._COMMANDпараметров может иметь дополнительные команды, добавленные к ним путём добавления как необходимого числа параметровCOMMAND ...(generator expressionsподдерживаются). Например:ExternalProject_Add(example ... # Download options, etc. BUILD_COMMAND ${CMAKE_COMMAND} -E echo "Starting $<CONFIG> build" COMMAND ${CMAKE_COMMAND} --build <BINARY_DIR> --config $<CONFIG> COMMAND ${CMAKE_COMMAND} -E echo "$<CONFIG> build complete" )
-
Также следует отметить, что каждый этап построения создаётся с помощью вызова
ExternalProject_Add_Step(). Смотрите документацию этой команды для автоматических подстановок, которые поддерживаются для некоторых параметров.-
Получение свойств проекта
-
ExternalProject_Get_Property -
Функция
ExternalProject_Get_Property()извлекает свойства цели внешнего проекта:ExternalProject_Get_Property(<name> <prop1> [<prop2>...])
Функция сохраняет значения свойств в переменных с одинаковыми именами. Имена свойств соответствуют именам ключевых аргументов
ExternalProject_Add(). Например, каталог исходных файлов может быть извлечён следующим образом:ExternalProject_Get_property(myExtProj SOURCE_DIR) message("Source dir of myExtProj = ${SOURCE_DIR}")
Явное управление этапами
Функция ExternalProject_Add() сама по себе часто достаточно для включения внешнего проекта в основное построение. Некоторые сценарии требуют дополнительных работ для реализации желаемого поведения, например, добавления пользовательского этапа или предоставления этапов в качестве запускаемых вручную целей. Функции ExternalProject_Add_Step(), ExternalProject_Add_StepTargets() и ExternalProject_Add_StepDependencies предоставляют необходимый низкоуровневый контроль для реализации таких возможностей на уровне этапов.
-
ExternalProject_Add_Step -
Функция
ExternalProject_Add_Step()определяет дополнительный пользовательский шаг для внешнего проекта, определённого предыдущим вызовомExternalProject_Add():ExternalProject_Add_Step(<name> <step> [<option>...])
<name>совпадает с именем, переданным в исходном вызовеExternalProject_Add(). Указанный<step>не должен совпадать с предопределёнными шагами (mkdir,download,update,patch,configure,build,installилиtest). Поддерживаемые параметры:-
COMMAND <cmd>... -
Командная строка, которая будет выполнена этим пользовательским шагом (
generator expressionsподдерживаются). Этот параметр можно указать несколько раз, чтобы задать несколько команд, которые будут выполняться последовательно. -
COMMENT "<text>..." -
Текст, который будет выведен при выполнении пользовательского шага.
-
DEPENDEES <step>... -
Другие шаги (пользовательские или предопределённые), от которых зависит этот шаг.
-
DEPENDERS <step>... -
Другие шаги (пользовательские или предопределённые), которые зависят от этого нового пользовательского шага.
-
DEPENDS <file>... -
Файлы, от которых зависит этот пользовательский шаг.
-
BYPRODUCTS <file>... -
Файлы, которые будут сгенерированы этим пользовательским шагом, но время модификации которых может или не может быть обновлено последующими сборками. Этот список файлов в конечном итоге будет передан в качестве параметра
BYPRODUCTSкомандеadd_custom_command(), используемой для реализации пользовательского шага внутри. -
ALWAYS <bool> -
При включении этот параметр указывает, что пользовательский шаг должен всегда выполняться (т. е. что он всегда считается устаревшим).
-
EXCLUDE_FROM_MAIN <bool> -
При включении этот параметр указывает, что главный целевой объект внешнего проекта не зависит от пользовательского шага.
-
WORKING_DIRECTORY <dir> -
Указывает рабочую директорию, которая будет установлена перед выполнением команды пользовательского шага. Если этот параметр не указан, директория будет иметь значение
CMAKE_CURRENT_BINARY_DIRв момент вызоваExternalProject_Add_Step(). -
LOG <bool> -
Если задан, это приводит к тому, что вывод пользовательского шага будет записан в файлы в
LOG_DIRвнешнего проекта, если задан, илиSTAMP_DIR. -
USES_TERMINAL <bool> -
Если включено, это даёт пользовательскому шагу прямой доступ к терминалу, если это возможно.
Командная строка, комментарий, рабочая директория и побочные продукты каждого стандартного и пользовательского шага обрабатываются для замены маркеров
<SOURCE_DIR>,<SOURCE_SUBDIR>,<BINARY_DIR>,<INSTALL_DIR><TMP_DIR>,<DOWNLOAD_DIR>и<DOWNLOADED_FILE>соответствующими значениями свойств, определёнными в исходном вызовеExternalProject_Add(). -
-
ExternalProject_Add_StepTargets -
Функция
ExternalProject_Add_StepTargets()генерирует цели для перечисленных шагов. Имя каждой созданной цели будет иметь вид<name>-<step>:ExternalProject_Add_StepTargets(<name> [NO_DEPENDS] <step1> [<step2>...])
Создание цели для шага позволяет использовать её в качестве зависимости другой цели или запускать её вручную. Наличие целей для конкретных шагов также позволяет запускать их независимо друг от друга, указывая цели в командной строке сборки. Например, вы можете отправлять данные в панель мониторинга подпроекта, где хотите запустить конфигурацию сборки, затем отправить данные в панель мониторинга, за этим следует этап сборки, а затем — тесты. Если вы вызываете пользовательскую цель, которая зависит от шага в середине цепочки зависимостей шагов, все предыдущие шаги также будут выполнены, чтобы убедиться, что всё обновлено.
Если указан параметр
NO_DEPENDS, цель шага не будет зависеть от зависимостей внешнего проекта (т. е. от любых зависимостей пользовательской цели<name>, созданнойExternalProject_Add()). Это обычно безопасно для шаговdownload,updateиpatch, так как они обычно не требуют обновления и сборки зависимостей. Однако использованиеNO_DEPENDSдля любого из других предопределённых шагов может нарушить параллельную сборку. ИспользуйтеNO_DEPENDSтолько в тех случаях, когда точно известно, что у указанных шагов нет зависимостей. Для пользовательских шагов следует подумать о том, нужны ли пользовательские команды конфигурирование, сборка и установка зависимостей.Внутренне,
ExternalProject_Add()вызываетExternalProject_Add_Step()для создания каждого шага. Если были указаны параметрыSTEP_TARGETSилиINDEPENDENT_STEP_TARGETS, тогдаExternalProject_Add_StepTargets()также будет вызвано послеExternalProject_Add_Step().INDEPENDENT_STEP_TARGETSимеют установленный параметрNO_DEPENDS, аSTEP_TARGETS— нет. Помимо этого, оба варианта приводят к вызовуExternalProject_Add_StepTargets()одинаковым способом. Даже если шаг не указан ни в одном из этих двух параметров,ExternalProject_Add_StepTargets()всё ещё может быть вызвано позже для ручного определения цели для шага.Параметры
STEP_TARGETSиINDEPENDENT_STEP_TARGETSдляExternalProject_Add()являются, как правило, самым простым способом гарантировать создание целей для конкретных шагов, представляющих интерес. Для пользовательских шаговExternalProject_Add_StepTargets()должен быть вызван явно, если для этого пользовательского шага также должна быть создана цель. Альтернативой этим двум параметрам является заполнение свойств каталогаEP_STEP_TARGETSиEP_INDEPENDENT_STEP_TARGETS. Они действуют как значения по умолчанию для параметров цели шага и могут сэкономить время, если необходимо определить тот же набор целей шага для нескольких внешних проектов.
-
ExternalProject_Add_StepDependencies -
Функция
ExternalProject_Add_StepDependencies()может использоваться для добавления зависимостей к шагу. Добавленные зависимости должны быть целями, которые CMake уже знает (это могут быть обычные исполняемые или библиотечные цели, пользовательские цели или даже цели шагов другого внешнего проекта):ExternalProject_Add_StepDependencies(<name> <step> <target1> [<target2>...])
Эта функция заботится об установлении зависимостей на уровне целей и файлов и гарантирует, что параллельная сборка не будет нарушена. Её следует использовать вместо
add_dependencies()при добавлении зависимостей для некоторых целей шагов, сгенерированных модулемExternalProject.
Примеры
Следующий пример демонстрирует, как скачать и собрать гипотетический проект под названием FooBar с github:
include(ExternalProject) ExternalProject_Add(foobar GIT_REPOSITORY git@github.com:FooCo/FooBar.git GIT_TAG origin/release/1.2.3 )
Для примера также определите второй гипотетический внешний проект под названием SecretSauce, который загружается с веб-сервера. Приведены два URL-адреса, чтобы воспользоваться более быстрой внутренней сетью, если она доступна, с переходом на более медленный внешний сервер в случае необходимости. Проект — типичный проект Makefile без шага конфигурации, поэтому некоторые из команд по умолчанию переопределены. Требуется только собрать цель sauce:
find_program(MAKE_EXE NAMES gmake nmake make)
ExternalProject_Add(secretsauce
URL http://intranet.somecompany.com/artifacts/sauce-2.7.tgz
https://www.somecompany.com/downloads/sauce-2.7.zip
URL_HASH MD5=d41d8cd98f00b204e9800998ecf8427e
CONFIGURE_COMMAND ""
BUILD_COMMAND ${MAKE_EXE} sauce
)
Предположим, что шаг сборки secretsauce требует, чтобы foobar уже был собран. Это можно гарантировать следующим образом:
ExternalProject_Add_StepDependencies(secretsauce build foobar)
Другой вариант — создать пользовательскую цель для шага сборки foobar и сделать secretsauce зависимой от неё, а не от всего проекта foobar. Это означает, что нужно собрать только foobar, а не запускать его установку или тесты перед сборкой secretsauce. Зависимость также можно определить вместе с проектом secretsauce:
ExternalProject_Add_StepTargets(foobar build)
ExternalProject_Add(secretsauce
URL http://intranet.somecompany.com/artifacts/sauce-2.7.tgz
https://www.somecompany.com/downloads/sauce-2.7.zip
URL_HASH MD5=d41d8cd98f00b204e9800998ecf8427e
CONFIGURE_COMMAND ""
BUILD_COMMAND ${MAKE_EXE} sauce
DEPENDS foobar-build
)
Вместо вызова ExternalProject_Add_StepTargets(), цель можно определить вместе с самим проектом foobar:
ExternalProject_Add(foobar GIT_REPOSITORY git@github.com:FooCo/FooBar.git GIT_TAG origin/release/1.2.3 STEP_TARGETS build )
Если у многих внешних проектов должен быть одинаковый набор целей шагов, установка свойства каталога может быть более удобным способом. Цель шага build может быть создана автоматически путём установки свойства каталога EP_STEP_TARGETS до создания внешних проектов с помощью ExternalProject_Add():
set_property(DIRECTORY PROPERTY EP_STEP_TARGETS build)
Наконец, предположим, что secretsauce предоставляет скрипт под названием makedoc, который можно использовать для генерации собственной документации. Предположим также, что скрипт ожидает, что каталог вывода будет единственным параметром, и что он должен выполняться из каталога исходных кодов secretsauce. Пользовательский шаг и пользовательская цель для запуска скрипта могут быть определены следующим образом:
ExternalProject_Add_Step(secretsauce docs COMMAND <SOURCE_DIR>/makedoc <BINARY_DIR> WORKING_DIRECTORY <SOURCE_DIR> COMMENT "Building secretsauce docs" ALWAYS TRUE EXCLUDE_FROM_MAIN TRUE ) ExternalProject_Add_StepTargets(secretsauce docs)
Затем пользовательский шаг может быть запущен из основной сборки следующим образом:
cmake --build . --target secretsauce-docs
© 2000–2020 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.18/module/ExternalProject.html