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>placeholder. Это не настраивает внешний проект на установку в указанный префикс. Для этого необходимо передать соответствующие аргументы шагу настройки внешнего проекта, например, используя<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_EXTRACT_TIMESTAMP <bool> -
Добавлена в версии 3.24.
При указании со значением true, временные метки извлечённых файлов будут соответствовать временным меткам в архиве. При значении false, временные метки извлечённых файлов будут отражать время, когда была выполнена операция извлечения. Если URL загрузки изменяется, временные метки, основанные на метках в архиве, могут привести к тому, что зависимые цели не будут перестроены, когда это потенциально необходимо. Поэтому, если временные метки файлов не являются значимыми для проекта, используйте значение false для этой опции. Если
DOWNLOAD_EXTRACT_TIMESTAMPне указано, значение по умолчанию – false. См. политикуCMP0135. -
DOWNLOAD_NO_EXTRACT <bool> -
Добавлена в версии 3.6.
Позволяет отключить часть извлечения во время загрузки, передав значение boolean 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_VERSION <min> -
Добавлена в версии 3.30.
Укажите минимальную версию TLS для
https://URL. Если эта опция не указана, будет использоваться значение переменнойCMAKE_TLS_VERSIONили переменной окруженияCMAKE_TLS_VERSION(см.file(DOWNLOAD)).Эта опция также применяется к вызовам
git clone, хотя поведение по умолчанию отличается. Если ни опцияTLS_VERSION, переменнаяCMAKE_TLS_VERSION, или переменная окруженияCMAKE_TLS_VERSIONне указана, поведение будет определяться по умолчанию для git или опцией конфигурации githttp.sslVersion, которую пользователь может установить на глобальном уровне. -
TLS_VERIFY <bool> -
Указывает, должна ли быть выполнена проверка сертификата для
https://URL. Если эта опция не указана, будет использоваться значение переменнойCMAKE_TLS_VERIFYили переменной окруженияCMAKE_TLS_VERIFY(см.file(DOWNLOAD)). Если ни одна из них не установлена, проверка сертификатов не будет выполнена. В ситуациях, гдеURL_HASHне может быть предоставлена, эта опция может быть альтернативным средством проверки.Эта опция также применяется к вызовам
git clone, хотя поведение по умолчанию отличается. Если ни опцияTLS_VERIFY, переменнаяCMAKE_TLS_VERIFY, или переменная окруженияCMAKE_TLS_VERIFYне указана, поведение будет определяться по умолчанию для git (true) или опцией конфигурации githttp.sslVerify, которую пользователь может установить на глобальном уровне.Изменено в версии 3.6: Ранее эта опция не применялась к вызовам
git clone.Изменено в версии 3.30: Ранее переменная окружения
CMAKE_TLS_VERIFYне проверялась. -
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.Изменено в версии 3.27: Относительный URL будет разрешен на основе удаленного сервера родительского проекта, с учётом
CMP0150. См. документацию по политике для информации о том, как выбирается удаленный сервер, включая случаи, когда выбор удаленного сервера может завершиться ошибкой. Локальные удаленные сервера на файловой системе должны всегда использовать абсолютные пути. -
GIT_TAG <tag> -
Имя ветки Git, тега или хэш-кода коммита. Обратите внимание, что имена веток и тегов обычно следует указывать как имена удалённых репозиториев (например,
origin/myBranchвместо простоmyBranch). Это гарантирует, что если удалённый сервер изменит имя тега или перебазирует или перепишет историю ветки, локальная копия всё равно будет обновлена правильно. Однако в целом для многих причин предпочтительнее указывать хэш-код коммита:- Если локальная копия уже содержит коммит, соответствующий хэшу, для проверки изменений каждый раз при повторном запуске CMake не требуется выполнение
git fetch. Это может значительно ускорить процесс, если используются многие внешние проекты. - Использование конкретного хэша Git гарантирует, что история основного проекта полностью отслеживается до определённой точки в развитии внешнего проекта. Если вместо этого используется имя ветки или тега, то выход в конкретный коммит основного проекта не обязательно привязывает весь процесс сборки к определённой точке в жизни внешнего проекта. Отсутствие такой детерминированной работы приводит к потере отслеживаемости и воспроизводимости основного проекта.
Если
GIT_SHALLOWвключено, тоGIT_TAGработает только с именами веток и тегов. Хэш-код коммита запрещён.Обратите внимание, что если не указано,
GIT_TAGпо умолчанию равенmaster, а не имени стандартной ветки Git. - Если локальная копия уже содержит коммит, соответствующий хэшу, для проверки изменений каждый раз при повторном запуске CMake не требуется выполнение
-
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(см. ниже). Обратите внимание, что если ветка, указанная вGIT_TAGотличается от отслеживаемой ветки удалённого репозитория, перебазирование небезопасно. В этом случаеREBASEбудет молча обработано какCHECKOUT. -
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, тега или ID коммита.
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()) и вызван вручную. Это полезно, если вы хотите позволить разработчикам собирать проект, будучи отключёнными от сети (хотя сеть может всё ещё потребоваться для шага загрузки).Изменено в версии 3.27: Если
UPDATE_DISCONNECTEDистинно, шаг обновления выполняется, если какие-либо данные о шаге обновления или загрузки изменены. Кроме того, если используется метод загрузки/обновления Git, логика обновления будет изменена, чтобы пропустить попытки связаться с удалённым сервером. ЕслиGIT_TAGуказывает на ссылку, которая не известна локально, шаг обновления завершится с ошибкой.Когда этот параметр присутствует, рекомендуется сделать его переменной кэша под контролем разработчика, а не жёстко задавать его. Если этот параметр отсутствует, значение по умолчанию берётся из свойства каталога
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 в качестве своей системы сборки, то шаг сборки также будет использовать 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.
Указывает файлы, которые будут сгенерированы командой сборки, но которые могут или могут не иметь своё время изменения обновлённым последующими сборками. Это также может потребоваться для явного объявления зависимостей при использовании генератора
Ninja. В конечном итоге они передаются какBYPRODUCTSв собственный вызов шага сборкиadd_custom_command(), который имеет дополнительную документацию. -
BUILD_JOB_SERVER_AWARE <bool> -
Добавлен в версии 3.28.
Указывает, что шаг сборки знает о сервере задач GNU Make. Смотрите документацию
add_custom_command()о параметреJOB_SERVER_AWAREдля получения подробной информации. Этот параметр актуален только при указании явногоBUILD_COMMAND.
Параметры шага установки
Если шаг конфигурации предполагал, что внешний проект использует CMake в качестве своей системы сборки, шаг установки также будет использовать CMake. В противном случае шаг установки будет предполагать сборку на основе Makefile и просто выполнит make install в качестве шага сборки по умолчанию. Это можно переопределить с помощью пользовательских команд установки, если необходимо.
-
INSTALL_COMMAND <cmd>... -
Шаг установки внешнего проекта вызывается как часть основной сборки проекта. Он выполняется после шага сборки внешнего проекта и может выполняться до или после шага тестирования внешнего проекта (см. параметр
TEST_BEFORE_INSTALLниже). Правила установки внешнего проекта не являются частью правил установки основного проекта, поэтому если что-либо из внешнего проекта должно быть установлено как часть основной сборки, это необходимо указать в основной сборке как дополнительные командыinstall(). Шаг установки по умолчанию собирает целевой объектinstallвнешнего проекта, но это можно переопределить с помощью пользовательской команды, используя этот параметр (generator expressionsподдерживаются). Передача пустой строки как<cmd>делает шаг установки ничего не делающим. -
INSTALL_BYPRODUCTS <file>... -
Добавлен в версии 3.26.
Указывает файлы, которые будут сгенерированы командой установки, но которые могут или могут не иметь своё время изменения обновлённым последующими установками. Это также может потребоваться для явного объявления зависимостей при использовании генератора
Ninja. В конечном итоге они передаются какBYPRODUCTSв собственный вызов шага установкиadd_custom_command(), который имеет дополнительную документацию.
Примечание
Если переменная среды CMAKE_INSTALL_MODE задана при сборке основного проекта, она будет иметь эффект только при соблюдении следующих условий:
- Шаг конфигурации основного проекта предполагал, что внешний проект использует CMake в качестве своей системы сборки.
- Команда установки внешнего проекта фактически выполняется. Обратите внимание, что из-за способа, которым
ExternalProjectможет использовать отметки времени внутри, если ничего, от чего зависит шаг установки, не нужно перевыполнять, команде установки также может не потребоваться выполнение.
Также обратите внимание, что ExternalProject не проверяет, меняется ли переменная среды CMAKE_INSTALL_MODE с одного выполнения на другое.
Параметры шага тестирования
Шаг тестирования определён только при наличии хотя бы одного из следующих 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 эти параметры помещают шаги в console job pool. Каждый шаг может получить доступ к терминалу индивидуально с помощью следующих параметров:
-
USES_TERMINAL_DOWNLOAD <bool> -
Предоставить шагу загрузки доступ к терминалу.
-
USES_TERMINAL_UPDATE <bool> -
Предоставить шагу обновления доступ к терминалу.
-
USES_TERMINAL_PATCH <bool> -
Добавлена в версии 3.23.
Предоставить шагу исправления доступ к терминалу.
-
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параметров иCMAKE_ARGS,ExternalProjectзаменит<sep>на;в указанных командных строках. Это можно использовать для обеспечения наличия в команде литеральной;в ней, в противном случае прямая запись была бы интерпретирована как разделители аргументов для API CMake вместо этого. Обратите внимание, что разделитель должен быть выбран таким образом, чтобы его не перепутать с использованием последовательности в качестве разделителя списков. Например, использованиеLIST_SEPARATORпозволяет передавать списки значений в переменные кэша CMake в командной строке:ExternalProject_Add(example ... # Download options, etc. LIST_SEPARATOR "," CMAKE_ARGS "-DCMAKE_PREFIX_PATH:STRING=${first_prefix},${second_prefix}" ) -
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.
Файлы, которые будут сгенерированы этим пользовательским шагом, но которые могут или не могут иметь обновлённое время изменения в последующих сборках. Это также может потребоваться для явного объявления зависимостей при использовании генератора
Ninja. Этот список файлов в конечном итоге будет передан в качестве опцииBYPRODUCTSк используемой для реализации пользовательского шага командеadd_custom_command(), которая имеет дополнительную документацию. -
ALWAYS <bool> -
При включении этой опции пользовательский шаг всегда будет выполняться (т.е. всегда считается устаревшим).
-
JOB_SERVER_AWARE <bool> -
Добавлена в версии 3.28.
Указывает, что пользовательский шаг осведомлён о сервере заданий GNU Make. Подробнее см. в документации команды
add_custom_command()по опцииJOB_SERVER_AWARE. -
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. Оно выступает в качестве значения по умолчанию для опций целевых задач шагов и может сэкономить время, не нужно многократно указывать один и тот же набор целевых задач шагов при определении нескольких внешних проектов.Добавлена в версии 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 -
Добавлена в версии 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–2024 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/latest/module/ExternalProject.html