ExternalProject
Определение внешнего проекта
-
ExternalProject_Add -
Функция
ExternalProject_Add()создаёт пользовательскую цель для управления загрузкой, обновлением/патчем, конфигурацией, сборкой, установкой и тестированием внешнего проекта:ExternalProject_Add(<name> [<option>...])
Отдельные шаги в процессе могут управляться независимо при необходимости (например, для отправки в CDash), а также могут быть определены дополнительные пользовательские шаги, вместе с возможностью управления зависимостями шагов. Структура каталогов, используемая для управления внешним проектом, также может быть настраиваемой. Функция поддерживает большое количество опций, которые могут быть использованы для настройки поведения внешнего проекта.
- Опции каталогов:
-
В большинстве случаев стандартная структура каталогов достаточна. В основном, это деталь реализации, которую основному проекту обычно не нужно менять. Однако в некоторых случаях контроль над структурой каталогов может быть полезен или необходим. Опции каталогов потенциально более полезны с точки зрения того, что основной проект может использовать команду
ExternalProject_Get_Property()для получения их значений, тем самым позволяя главному проекту ссылаться на артефакты сборки внешнего проекта.-
PREFIX <dir> - Корневой каталог для внешнего проекта. Если не указано иное ниже, все другие каталоги, связанные с внешним проектом, будут созданы внутри него.
-
TMP_DIR <dir> - Каталог для хранения временных файлов.
-
STAMP_DIR <dir> - Каталог для хранения отметки времени каждого шага. Лог-файлы отдельных шагов также создаются здесь (см. Опции ведения логов ниже).
-
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>
В противном случае, если свойство каталога
EP_BASEустановлено, компоненты внешнего проекта хранятся в указанном базовом каталоге:TMP_DIR = <base>/tmp/<name> STAMP_DIR = <base>/Stamp/<name> DOWNLOAD_DIR = <base>/Download/<name> SOURCE_DIR = <base>/Source/<name> BINARY_DIR = <base>/Build/<name> INSTALL_DIR = <base>/Install/<name>
Если не указаны
PREFIX,EP_PREFIX, илиEP_BASE, то значениеPREFIXустанавливается по умолчанию в<name>-prefix. Относительные пути интерпретируются относительно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=<value> - Хеш архивного файла для загрузки. Хеш
<value>должен быть в форматеalgo=hashValue, гдеalgoможет быть любым из алгоритмов хэширования, поддерживаемых командойfile(). Сильно рекомендуется указывать этот параметр для загрузки по URL, так как это обеспечивает целостность загружаемого содержимого. Он также используется как проверка ранее загруженного файла, позволяя избежать подключения к удаленному расположению, если в локальной директории уже есть файл из предыдущей загрузки, соответствующий указанному хэшу. -
URL_MD5 <md5> - Эквивалентно
URL_HASH MD5=<md5>. -
DOWNLOAD_NAME <fname> - Имя файла, которое следует использовать для загруженного файла. Если не указано, имя файла определяется из окончания URL. Этот параметр редко нужен, имя по умолчанию, как правило, подходит и обычно не используется за пределами кода, внутреннего для модуля
ExternalProject. -
DOWNLOAD_NO_EXTRACT <bool> - Позволяет отключить этап извлечения при загрузке, передав для этого параметра значение boolean 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))
-
- Git
-
ПРИМЕЧАНИЕ: Для использования этого метода загрузки требуется версия git 1.6.5 или более поздняя.
-
GIT_REPOSITORY <url> - URL репозитория git. Можно использовать любой URL, понятный команде
git. -
GIT_TAG <tag> -
Имя ветки, тега или хэш коммита Git. Обратите внимание, что имена веток и тегов, как правило, должны указываться как имена удаленных (например,
origin/myBranchвместо простоmyBranch). Это гарантирует, что если удаленный конец переместил свой тег или перебазировал ветку или переписал историю, локальная копия все равно будет обновлена правильно. В общем случае, однако, для многих причин предпочтительнее указывать хэш коммита:- Если локальная копия уже имеет коммит, соответствующий хэшу, проверка изменений каждый раз при повторном запуске CMake не требуется. Это может значительно ускорить процесс, если используется много внешних проектов.
- Использование конкретного хэша Git гарантирует, что история основного проекта полностью прослеживается до определенной точки в развитии внешнего проекта. Если вместо этого используется имя ветки или тега, то выход в определенный коммит основного проекта не обязательно фиксирует весь сборку до определенного момента в жизни внешнего проекта. Отсутствие такого детерминированного поведения приводит к потере прослеживаемости и воспроизводимости в основном проекте.
-
GIT_REMOTE_NAME <name> - Необязательное имя удаленного репозитория. Если этот параметр не указан, он устанавливается по умолчанию как
origin. -
GIT_SUBMODULES <module>... - Конкретные подмодули git, которые также должны быть обновлены. Если этот параметр не указан, будут обновлены все подмодули git.
-
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_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. Это означает, что значения действуют только как начальные значения по умолчанию и не будут переопределять какие-либо переменные, уже установленные при предыдущем запуске. Используйте этот параметр с осторожностью, так как он может привести к различному поведению в зависимости от того, начинается ли сборка с чистого каталога сборки или использует предыдущие содержимое каталога сборки. -
SOURCE_SUBDIR <dir> - Когда не указан параметр
CONFIGURE_COMMAND, этап настройки предполагает, что у внешнего проекта есть файлCMakeLists.txtвверху дерева исходных кодов (т.е. вSOURCE_DIR). ПараметрSOURCE_SUBDIRможет использоваться для указания альтернативного каталога в дереве исходных кодов для использования как корня дерева исходных кодов CMake. Это должен быть относительный путь, и он будет интерпретироваться как относительный кSOURCE_DIR.
-
- Параметры этапа сборки:
-
Если этап настройки предполагал, что внешний проект использует CMake в качестве системы построения, этап сборки также будет использовать CMake. В противном случае этап сборки будет предполагать сборку на основе Makefile и просто запустить
makeбез аргументов в качестве этапа сборки по умолчанию. Это можно переопределить с помощью пользовательских команд сборки, если необходимо.-
BUILD_COMMAND <cmd>... - Переопределяет команду сборки по умолчанию (
generator expressionsподдерживаются). Если этот параметр не указан, команда сборки по умолчанию будет выбрана для интеграции с основной сборкой наиболее подходящим образом (например, с использованием рекурсивногоmakeдля генераторов Makefile илиcmake --build, если проект использует сборку CMake). Этот параметр можно указать с пустой строкой как командой, чтобы этап сборки ничего не делал. -
BUILD_IN_SOURCE <bool> - При включении этого параметра сборка будет выполнена непосредственно в дереве исходных кодов внешнего проекта. Это, как правило, следует избегать, обычно предпочтительнее использовать отдельный каталог сборки, но это может быть полезно, когда внешний проект предполагает сборку в исходном коде. Параметр
BINARY_DIRне должен быть указан, если выполняется сборка в исходном коде. -
BUILD_ALWAYS <bool> - Включение этого параметра принудительно запускает этап сборки всегда. Это может быть самый простой способ надежно убедиться, что собственные зависимости сборки внешнего проекта будут вычислены, а не полагаться на метод определения времени успешного завершения по умолчанию. Этот параметр обычно не нужен, если не ожидается, что разработчики будут изменять что-то, от чего зависит сборка внешнего проекта, таким образом, который не обнаруживается по зависимостям целевых шагов (например,
SOURCE_DIRиспользуется без метода загрузки, и разработчики могут изменить исходные файлы вSOURCE_DIR). -
BUILD_BYPRODUCTS <file>... - Указывает файлы, которые будут сгенерированы командой сборки, но которые могут или не могут иметь обновленное время изменения последующими сборками. В конечном итоге они передаются как
BYPRODUCTSв собственное вызов этапа сборкиadd_custom_command().
-
- Параметры этапа установки:
-
Если этап настройки предполагал, что внешний проект использует CMake как свою систему построения, то этап установки также будет использовать CMake. В противном случае этап установки будет предполагать сборку на основе Makefile и просто выполнит
make installкак этапа установки по умолчанию. Это можно переопределить с помощью пользовательских команд установки, если необходимо.-
INSTALL_COMMAND <cmd>... - Этап установки внешнего проекта вызывается как часть основного проекта. Он выполняется после этапа сборки внешнего проекта и может выполняться до или после этапа тестирования внешнего проекта (см. параметр
TEST_BEFORE_INSTALLниже). Правила установки внешнего проекта не являются частью правил установки основного проекта, поэтому, если что-либо из внешнего проекта должно быть установлено в рамках основной сборки, это необходимо указать в основной сборке как дополнительные командыinstall(). Этап установки по умолчанию собирает цельinstallвнешнего проекта, но это можно переопределить с помощью пользовательской команды с помощью этого параметра (generator expressionsподдерживаются). Передача пустой строки как<cmd>делает этап установки ничего не выполняющим.
-
-
- Опции шага теста:
-
Шаг теста определяется только в том случае, если указаны хотя бы одна из следующих
TEST_...опций.-
TEST_COMMAND <cmd>... - Переопределяет команду по умолчанию для шага теста (
generator expressionsподдерживаются). Если эта опция не указана, то по умолчанию шаг теста собирает собственныйtestцелевой объект внешнего проекта. Данная опция может быть задана со значением<cmd>в виде пустой строки, что позволяет определить шаг теста, но не выполнить никаких действий. Не указывайте другиеTEST_...опции, если в качестве команды теста задана пустая строка, но лучше вообще не указыватьTEST_...опций, если целевой объект шага теста не нужен. -
TEST_BEFORE_INSTALL <bool> - Включив эту опцию, шаг теста будет выполняться до шага установки. По умолчанию шаг теста выполняется после шага установки.
-
TEST_AFTER_INSTALL <bool> - Эта опция полезна, в основном, как способ указать, что шаг теста желателен, но все поведение по умолчанию достаточно. Указание этой опции со значением true гарантирует, что шаг теста определен и что он выполняется после шага установки. Если включены как
TEST_BEFORE_INSTALL, так иTEST_AFTER_INSTALL, то последняя опция будет проигнорирована. -
TEST_EXCLUDE_FROM_MAIN <bool> - Если эта опция включена, то основной целевой объект ALL сборки не будет зависеть от шага теста. Это может быть полезным способом, чтобы гарантировать, что шаг теста определен, но он вызывается только при запросе вручную.
-
- Опции ведения журнала вывода:
-
Каждая из следующих
LOG_...опций может быть использована для обертывания соответствующего шага в скрипт, чтобы захватить его вывод в файлы. Файлы журнала будут созданы вSTAMP_DIRкаталоге с именами файлов, специфичными для шага.-
LOG_DOWNLOAD <bool> - Включив эту опцию, вывод шага скачивания записывается в файлы.
-
LOG_UPDATE <bool> - Включив эту опцию, вывод шага обновления записывается в файлы.
-
LOG_CONFIGURE <bool> - Включив эту опцию, вывод шага конфигурации записывается в файлы.
-
LOG_BUILD <bool> - Включив эту опцию, вывод шага сборки записывается в файлы.
-
LOG_INSTALL <bool> - Включив эту опцию, вывод шага установки записывается в файлы.
-
LOG_TEST <bool> - Включив эту опцию, вывод шага теста записывается в файлы.
-
- Опции доступа к терминалу:
-
В некоторых случаях шаги могут получить прямой доступ к терминалу. Предоставление шагу доступа к терминалу может позволить ему получать входные данные из терминала, если это необходимо, например, для данных аутентификации, которые не предоставляются другими опциями. С генератором
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> - Если задано, это приводит к тому, что вывод пользовательского шага будет записан в файлы в
STAMP_DIRвнешнего проекта. -
USES_TERMINAL <bool> - Если включено, это даёт пользовательскому шагу прямой доступ к терминалу, если это возможно.
Командная строка, комментарий, рабочая директория и побочные продукты каждого стандартного и пользовательского шага обрабатываются для замены маркеров
<SOURCE_DIR>,<SOURCE_SUBDIR>,<BINARY_DIR>,<INSTALL_DIR>и<TMP_DIR>соответствующими значениями свойств, определёнными в исходном вызове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–2019 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.10/module/ExternalProject.html