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