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> -
Новое в версии 3.14.
Каталог для хранения журналов каждого этапа.
-
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не установлена для предотвращения этого. Тип архива определяется путем проверки фактического содержимого, а не с помощью логики, основанной на расширении файла.Изменено в версии 3.7: Разрешено несколько URL.
-
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> -
Новое в версии 3.6.
Позволяет отключить часть процесса извлечения при шаге загрузки, передав логическое значение true для этой опции. Если эта опция не указана, загруженное содержимое будет автоматически распаковано, если это необходимо. Если извлечение отключено, полный путь к загруженному файлу доступен как
<DOWNLOADED_FILE>в последующих шагах или как свойствоDOWNLOADED_FILEс помощью командыExternalProject_Get_Property(). -
DOWNLOAD_NO_PROGRESS <bool> -
Может быть использовано для отключения логирования прогресса загрузки. Если эта опция не указана, сообщения о прогрессе загрузки будут записаны в журнал.
-
TIMEOUT <seconds> -
Максимальное время, разрешённое для операций загрузки файлов.
-
INACTIVITY_TIMEOUT <seconds> -
Новое в версии 3.19.
Прервать операцию после периода бездействия.
-
HTTP_USERNAME <username> -
Новое в версии 3.7.
Имя пользователя для операции загрузки, если требуется аутентификация.
-
HTTP_PASSWORD <password> -
Новое в версии 3.7.
Пароль для операции загрузки, если требуется аутентификация.
-
HTTP_HEADER <header1> [<header2>...] -
Новое в версии 3.7.
Предоставляет произвольный список HTTP-заголовков для операции загрузки. Это может быть полезно для доступа к содержимому в системах, таких как AWS и т.д.
-
TLS_VERIFY <bool> -
Указывает, должна ли проводиться проверка сертификата для https URL. Если эта опция не указана, поведение по умолчанию определяется переменной
CMAKE_TLS_VERIFY(см.file(DOWNLOAD)). Если она также не задана, проверка сертификатов не будет выполнена. В ситуациях, когдаURL_HASHне может быть предоставлено, эта опция может быть альтернативной мерой проверки.Изменено в версии 3.6: Эта опция также применяется к вызовам
git clone. -
TLS_CAINFO <file> -
Укажите файл с пользовательским центром сертификации для использования, если
TLS_VERIFYвключен. Если эта опция не указана, вместо этого будет использоваться значение переменнойCMAKE_TLS_CAINFO(см.file(DOWNLOAD)) -
NETRC <level> -
Новое в версии 3.11.
Укажите, должен ли файл
.netrcиспользоваться для операции. Если эта опция не указана, вместо этого будет использоваться значение переменнойCMAKE_NETRC(см.file(DOWNLOAD)) Допустимые уровни:-
IGNORED -
Файл
.netrcигнорируется. Это значение по умолчанию. -
OPTIONAL -
Файл
.netrcнеобязателен, и информация из URL имеет приоритет. Файл будет проверен для поиска любой информации, которая не указана в URL. -
REQUIRED -
Файл
.netrcобязателен, и информация из URL игнорируется.
-
-
NETRC_FILE <file> -
Новое в версии 3.11.
Укажите альтернативный файл
.netrcвместо файла в вашем домашнем каталоге, если уровеньNETRCравенOPTIONALилиREQUIREDЕсли эта опция не указана, вместо этого будет использоваться значение переменнойCMAKE_NETRC_FILE(см.file(DOWNLOAD))
Новое в версии 3.1: Добавлена поддержка
tbz2,.tar.xz,.txz, и.7zрасширений. -
- 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.
Изменено в версии 3.16: Когда
CMP0097установлено вNEW, если это значение установлено в пустую строку, то подмодули не инициализируются и не обновляются. -
GIT_SUBMODULES_RECURSE <bool> -
Добавлено в версии 3.17.
Укажите, должны ли подмодули git (если таковые имеются) обновляться рекурсивно, передав флаг
--recursiveкомандеgit submodule update. Если не указано, по умолчанию включено. -
GIT_SHALLOW <bool> -
Добавлено в версии 3.6.
При включении этого параметра операции
git cloneбудет передан параметр--depth 1. Это выполняет поверхностное клонирование, которое позволяет избежать загрузки всей истории, а вместо этого извлекает только коммит, указанный параметромGIT_TAG. -
GIT_PROGRESS <bool> -
Добавлено в версии 3.8.
При включении этот параметр указывает операции
git cloneсообщить о своём прогрессе, передав ей параметр--progressБез этого параметра при клонировании больших проектов может показаться, что сборка застряла, так как никаких сообщений не будет, пока операция клонирования не завершится. Хотя этот параметр может использоваться для отображения прогресса, чтобы предотвратить видимость задержки сборки, он также может сделать сборку слишком шумной, если используется много внешних проектов. -
GIT_CONFIG <option1> [<option2>...] -
Добавлено в версии 3.8.
Укажите список параметров конфигурации для передачи команде
git clone. Каждый перечисленный параметр будет преобразован в собственный параметр--config <option>в командной строкеgit clone, причём каждый параметр должен иметь видkey=value. -
GIT_REMOTE_UPDATE_STRATEGY <strategy> -
Добавлено в версии 3.18.
Когда
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ссылается на действительный ref, если нет несохранённых изменений, которые нельзя успешно восстановить.
Переменная
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> -
Добавлено в версии 3.2.
При включении этот параметр пропускает шаг обновления. Однако он не препятствует шагу загрузки. Шаг обновления всё равно можно добавить как целевой шаг (см.
ExternalProject_Add_StepTargets()) и вызывать его вручную. Это полезно, если вы хотите, чтобы разработчики могли создавать проект, будучи отключёнными от сети (хотя сеть всё ещё может потребоваться для шага загрузки).Когда этот параметр присутствует, рекомендуется сделать его переменной кэша под контролем разработчика, а не жёстко прописывать. Если этот параметр отсутствует, значение по умолчанию берётся из свойства каталога
EP_UPDATE_DISCONNECTEDЕсли и это не определено, обновления выполняются в обычном режиме. Свойство каталогаEP_UPDATE_DISCONNECTEDпредназначено для удобства управления поведениемUPDATE_DISCONNECTEDдля целого раздела иерархии каталогов проекта и может быть более удобным способом предоставления разработчикам управления тем, выполнять ли обновления (при условии, что проект также предоставляет переменную кэша или какой-либо другой удобный способ установки свойства каталога).Это может привести к автоматическому созданию целевого шага для шага
download. См. политикуCMP0114. -
PATCH_COMMAND <cmd>... -
Указывает пользовательскую команду для применения патча к исходным файлам после обновления. По умолчанию команда патча не определена. Обратите внимание, что определение подходящей команды патча, которая работает надёжно, особенно для методов загрузки, таких как git, где изменение
GIT_TAGне отбросит изменения от предыдущего патча, а команда патча будет вызвана снова после обновления до нового тега, может быть довольно сложной.
-
- Параметры шага конфигурации:
-
Этап конфигурации выполняется после этапов загрузки и обновления. По умолчанию предполагается, что внешний проект является проектом CMake, но это можно переопределить при необходимости.
-
CONFIGURE_COMMAND <cmd>... -
Команда конфигурации по умолчанию выполняет CMake с несколькими параметрами, основанными на основном проекте. Добавляемые параметры, как правило, включают только те, которые необходимы для использования того же генератора, что и в основном проекте, но параметр
CMAKE_GENERATORможет быть задан для переопределения этого. Проект отвечает за добавление любых деталей инструментальной цепочки, флагов или других настроек, которые он хочет повторно использовать из основного проекта или иначе указать (см.CMAKE_ARGS,CMAKE_CACHE_ARGSиCMAKE_CACHE_DEFAULT_ARGSниже).Для внешних проектов, не являющихся проектами CMake, необходимо использовать параметр
CONFIGURE_COMMANDдля переопределения команды конфигурации по умолчанию (generator expressionsподдерживаются). Для проектов, не требующих этапа конфигурации, укажите этот параметр со строкой-пустышкой в качестве команды для выполнения. -
CMAKE_COMMAND /.../cmake -
Укажите альтернативный исполняемый файл cmake для этапа конфигурации (используйте абсолютный путь). Это, как правило, не рекомендуется, так как обычно желательно использовать одну и ту же версию CMake на протяжении всего процесса сборки. Этот параметр игнорируется, если была указана пользовательская команда конфигурации с помощью
CONFIGURE_COMMAND. -
CMAKE_GENERATOR <gen> -
Переопределите генератор CMake, используемый на этапе конфигурации. Без этого параметра будет использован тот же генератор, что и при основной сборке. Этот параметр игнорируется, если пользовательская команда конфигурации была указана с помощью параметра
CONFIGURE_COMMAND. -
CMAKE_GENERATOR_PLATFORM <platform> -
Новое в версии 3.1.
Передайте имя платформы, специфичное для генератора, команде CMake (см.
CMAKE_GENERATOR_PLATFORM). Указание этого параметра без параметраCMAKE_GENERATORявляется ошибкой. -
CMAKE_GENERATOR_TOOLSET <toolset> -
Передайте имя набора инструментов, специфичное для генератора, команде CMake (см.
CMAKE_GENERATOR_TOOLSET). Указание этого параметра без параметраCMAKE_GENERATORявляется ошибкой. -
CMAKE_GENERATOR_INSTANCE <instance> -
Новое в версии 3.11.
Передайте выбор экземпляра, специфичный для генератора, команде CMake (см.
CMAKE_GENERATOR_INSTANCE). Указание этого параметра без параметраCMAKE_GENERATORявляется ошибкой. -
CMAKE_ARGS <arg>... -
Указанные аргументы передаются в командную строку
cmake. Они могут быть любыми аргументами, которые понимает командаcmake, а не только значения кэша, определенные аргументами-D...(см. такжеCMake Options).Новое в версии 3.3: Аргументы могут использовать
generator expressions. -
CMAKE_CACHE_ARGS <arg>... -
Это альтернативный способ задания переменных кэша, где могут возникнуть проблемы с длиной командной строки. Ожидается, что аргументы будут в формате
-Dvar:STRING=value, которые затем преобразуются в команды CMakeset()с использованием параметраFORCE. Эти командыset()записываются в скрипт предварительной загрузки, который затем применяется с помощью параметра командной строкиcmake -C.Новое в версии 3.3: Аргументы могут использовать
generator expressions. -
CMAKE_CACHE_DEFAULT_ARGS <arg>... -
Новое в версии 3.2.
Это то же самое, что и параметр
CMAKE_CACHE_ARGS, за исключением того, что командыset()не включают ключевое словоFORCE. Это означает, что значения действуют только как начальные значения по умолчанию и не будут переопределять никакие переменные, уже заданные из предыдущего запуска. Используйте этот параметр с осторожностью, поскольку он может привести к различным результатам в зависимости от того, начинается ли сборка с новой директории сборки или повторно использует содержимое предыдущей сборки.Новое в версии 3.15: Если генератор CMake —
Green Hills MULTI, а не переопределён, то настройки проекта для набора инструментов GHS и переменные кэша настройки целевой системы передаются во внешний проект. -
SOURCE_SUBDIR <dir> -
Новое в версии 3.7.
Если параметр
CONFIGURE_COMMANDне указан, этап конфигурации предполагает, что в внешнем проекте имеется файлCMakeLists.txtв верхней части дерева исходных кодов (т.е. вSOURCE_DIR). ПараметрSOURCE_SUBDIRможно использовать для указания альтернативной директории в дереве исходных кодов для использования в качестве корня дерева исходных кодов CMake. Это должен быть относительный путь, и он будет интерпретироваться как относительный кSOURCE_DIR.Новое в версии 3.14: При включенном параметре
BUILD_IN_SOURCEдля указания альтернативной директории в дереве исходных кодов используетсяBUILD_COMMAND. -
CONFIGURE_HANDLED_BY_BUILD <bool> -
Новое в версии 3.20.
Включение этого параметра ослабляет зависимость этапа конфигурации от других внешних проектов до зависимостей только по порядку. Это означает, что этап конфигурации будет выполнен после сборки его внешних зависимостей, но он не будет помечен как грязный при повторной сборке одной из его внешних зависимостей. Этот параметр может быть включен, когда этап сборки достаточно умен, чтобы понять, нужно ли повторно выполнять этап конфигурации. CMake и Meson являются примерами систем сборки, чей этап сборки достаточно умен, чтобы знать, нужно ли повторно запускать этап конфигурации.
-
- Параметры этапа сборки:
-
Если этап конфигурации предполагал, что внешний проект использует CMake в качестве системы сборки, этап сборки также будет использовать его. В противном случае этап сборки предположит Makefile-основанную сборку и просто выполнит
makeбез аргументов в качестве этапа сборки по умолчанию. Это может быть переопределено пользовательскими командами сборки при необходимости.Если как основной, так и внешний проект используют make в качестве инструмента сборки, этап сборки внешнего проекта вызывается как рекурсивный make с использованием
$(MAKE). Это позволит передать некоторые настройки инструмента сборки от основного проекта к внешнему проекту. Если основной или внешний проект не использует make, никакие настройки инструмента сборки не будут переданы внешнему проекту, кроме тех, которые установлены на этапе конфигурации (т. е. выполнениеninja -vв основном проекте не передаст-vна этапе сборки внешнего проекта, даже если он также используетninjaв качестве инструмента сборки).-
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>... -
Новое в версии 3.2.
Указывает файлы, которые будут сгенерированы командой сборки, но у которых время изменения может или не может быть обновлено последующими сборками. В конечном счете, они передаются как
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> -
Новое в версии 3.2.
Если включено, то целевой объект ALL основной сборки не будет зависеть от шага тестирования. Это может быть полезный способ убедиться, что шаг тестирования определён, но вызывается только при запросе вручную. Это может привести к автоматическому созданию целевого объекта для шага
installилиbuild. См. политикуCMP0114.
-
- Параметры ведения журнала вывода:
-
Каждый из следующих параметров
LOG_...может использоваться для обертывания соответствующего шага в скрипт для записи его вывода в файлы. Файлы журналов будут созданы вLOG_DIR, если указано, или в каталогеSTAMP_DIRс именами файлов, специфичными для шага.-
LOG_DOWNLOAD <bool> -
При включении вывод шага скачивания записывается в файлы.
-
LOG_UPDATE <bool> -
При включении вывод шага обновления записывается в файлы.
-
LOG_PATCH <bool> -
Новое в версии 3.14.
При включении вывод шага применения исправлений записывается в файлы.
-
LOG_CONFIGURE <bool> -
При включении вывод шага конфигурации записывается в файлы.
-
LOG_BUILD <bool> -
При включении вывод шага сборки записывается в файлы.
-
LOG_INSTALL <bool> -
При включении вывод шага установки записывается в файлы.
-
LOG_TEST <bool> -
При включении вывод шага тестирования записывается в файлы.
-
LOG_MERGED_STDOUTERR <bool> -
Новое в версии 3.14.
При включении stdout и stderr будут объединены для любого шага, вывод которого записывается в файлы.
-
LOG_OUTPUT_ON_FAILURE <bool> -
Новое в версии 3.14.
Этот параметр имеет эффект только в том случае, если включен хотя бы один из других параметров
LOG_<step>. Если возникает ошибка для шага, для которого включено ведение журнала в файл, вывод этого шага будет выведен на консоль, еслиLOG_OUTPUT_ON_FAILUREустановлен в true. В случаях, когда записывается большой объём вывода, на консоль может быть выведен только конец этого вывода.
-
- Параметры доступа к терминалу:
-
Новое в версии 3.4.
В некоторых случаях шаги могут получить прямой доступ к терминалу. Предоставление шагу доступа к терминалу может позволить ему получить входные данные с терминала, если это необходимо, например, для данных авторизации, не предоставленных другими параметрами. С генератором
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_StepTargets()ниже для дополнительной информации о влиянии этого параметра. -
INDEPENDENT_STEP_TARGETS <step-target>... -
Устарело начиная с версии 3.19: Это разрешено только в том случае, если политика
CMP0114не установлена вNEW.Создаёт пользовательские целевые объекты для указанных шагов и предотвращает применение к ним обычных зависимостей. Если этот параметр не задан, значение по умолчанию берётся из свойства каталога
EP_INDEPENDENT_STEP_TARGETS. Этот параметр в основном полезен для независимого запуска отдельных шагов, например, для настройки CDash, где каждый шаг должен запускаться и отчитываться индивидуально, а не как единая сборка. См.ExternalProject_Add_StepTargets()ниже для дополнительной информации о влиянии этого параметра.
-
- Разные параметры:
-
-
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>... -
Файлы, от которых зависит этот пользовательский шаг.
-
INDEPENDENT <bool> -
Добавлена в версии 3.19.
Указывает, является ли этот шаг независимым от внешних зависимостей, заданных параметром
DEPENDSкомандыExternalProject_Add(). По умолчаниюFALSE. Шаги, помеченные как независимые, могут зависеть только от других шагов, помеченных как независимые. См. политикуCMP0114.Обратите внимание, что это использование термина «независимый» относится только к независимости от внешних целей, указанных параметром
DEPENDS, и ортогонально зависимостям шага от других шагов.Если для независимого шага создаётся целевой объект функцией
ExternalProject_Add()с параметромSTEP_TARGETSили функциейExternalProject_Add_StepTargets(), он не будет зависеть от внешних целей, но может зависеть от целей других шагов. -
BYPRODUCTS <file>... -
Добавлена в версии 3.2.
Файлы, которые будут сгенерированы этим пользовательским шагом, но время модификации которых может быть или не быть обновлено последующими сборками. Этот список файлов в конечном итоге будет передан как параметр
BYPRODUCTSкомандеadd_custom_command(), используемой для реализации пользовательского шага внутри. -
ALWAYS <bool> -
При включении этот параметр указывает, что пользовательский шаг должен выполняться всегда (то есть всегда считается устаревшим).
-
EXCLUDE_FROM_MAIN <bool> -
При включении этот параметр указывает, что основная цель внешнего проекта не зависит от пользовательского шага. Это может привести к автоматическому созданию целевых объектов шагов, от которых зависит этот шаг. См. политику
CMP0114. -
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().Добавлена в версии 3.3: Замена маркеров расширена на побочные продукты.
Добавлена в версии 3.11: Маркер подстановки
<DOWNLOAD_DIR>. -
-
ExternalProject_Add_StepTargets -
Функция
ExternalProject_Add_StepTargets()генерирует целевые задачи для перечисленных шагов. Имя каждой созданной целевой задачи будет иметь вид<name>-<step>.ExternalProject_Add_StepTargets(<name> <step1> [<step2>...])
Создание целевой задачи для шага позволяет использовать её в качестве зависимости другой целевой задачи или запускать её вручную. Наличие целевых задач для определённых шагов также позволяет управлять ими независимо друг от друга, задавая целевые задачи в командной строке сборки. Например, вы можете отправлять данные в панель управления субпроектом, где хотите управлять этапом конфигурации сборки, затем отправлять данные в панель управления, затем этап сборки и, наконец, тесты. Если вы вызываете пользовательскую целевую задачу, которая зависит от шага посреди цепочки зависимостей шагов, то все предыдущие шаги также будут выполнены, чтобы гарантировать актуальность данных.
Внутренне,
ExternalProject_Add()вызываетExternalProject_Add_Step()для создания каждого шага. Если были указаны любыеSTEP_TARGETS, тоExternalProject_Add_StepTargets()также будет вызван послеExternalProject_Add_Step(). Даже если шаг не упомянут в опцииSTEP_TARGETS,ExternalProject_Add_StepTargets()всё ещё может быть вызван позже для ручного определения целевой задачи для шага.Опция
STEP_TARGETSдляExternalProject_Add()обычно является самым простым способом гарантировать создание целевых задач для определённых шагов, представляющих интерес. Для пользовательских шаговExternalProject_Add_StepTargets()необходимо вызывать явно, если для этого пользовательского шага также должна быть создана целевая задача. Альтернативой этим двум опциям является заполнение свойства каталогаEP_STEP_TARGETS. Оно действует как значение по умолчанию для опций целевой задачи шага и может сэкономить время, когда требуется неоднократно указывать тот же набор целевых задач шагов при определении нескольких внешних проектов.New in version 3.19: Если
CMP0114установлено вNEW, целевые задачи шагов полностью отвечают за хранение пользовательских команд, реализующих их шаги. Основная целевая задача, созданнаяExternalProject_Add, зависит от целевых задач шагов, а целевые задачи шагов зависят друг от друга. Зависимости на уровне целевых задач соответствуют зависимостям на уровне файлов, используемым пользовательскими командами для каждого шага. Целевые задачи для шагов, созданных с опциейINDEPENDENTExternalProject_Add_Step(), не зависят от внешних целевых задач, указанных в опцииDEPENDSExternalProject_Add(). Предопределённые шагиmkdir,download,updateиpatchнезависимы.Если
CMP0114неNEW, доступно следующее устаревшее поведение:- Может быть указана устаревшая опция
NO_DEPENDS, сразу после<name>и перед первым шагом. Если опцияNO_DEPENDSуказана, целевая задача шага не будет зависеть от зависимостей внешнего проекта (т. е. от любых зависимостей пользовательской целевой задачи<name>, созданнойExternalProject_Add()). Это обычно безопасно для шаговdownload,updateиpatch, так как они обычно не требуют обновления и построения зависимостей. Однако использованиеNO_DEPENDSдля любого из других предопределённых шагов может нарушить параллельную сборку. ИспользуйтеNO_DEPENDSтолько в тех случаях, когда точно известно, что указанные шаги не имеют зависимостей. Для пользовательских шагов следует рассмотреть, требуют ли пользовательские команды конфигурирования, построения и установки зависимостей. - Опция
INDEPENDENT_STEP_TARGETSдляExternalProject_Add()или свойство каталогаEP_INDEPENDENT_STEP_TARGETSсообщает функции о вызовеExternalProject_Add_StepTargets()внутри с опциейNO_DEPENDSдля указанных шагов.
- Может быть указана устаревшая опция
-
ExternalProject_Add_StepDependencies -
New in version 3.2.
Функция
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–2021 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.21/module/ExternalProject.html