ExternalProject
Команды
Определение внешнего проекта
-
ExternalProject_Add -
Функция
ExternalProject_Add()создаёт пользовательскую цель для управления загрузкой, обновлением/исправлением, конфигурацией, сборкой, установкой и тестированием внешнего проекта:ExternalProject_Add(<name> [<option>...])
Индивидуальные этапы процесса можно управлять независимо при необходимости (например, для отправки в CDash), а также можно определять дополнительные пользовательские этапы и управлять зависимостями этапов. Структура каталогов, используемая для управления внешним проектом, также может быть настраиваемой. Функция поддерживает большое количество опций для настройки поведения внешнего проекта.
- Опции каталогов:
-
В большинстве случаев стандартной структуры каталогов достаточно. Это в основном деталь реализации, которую обычно не нужно изменять в основном проекте. Однако в некоторых случаях контроль над структурой каталогов может быть полезен или необходим. Опции каталогов могут быть более полезными с точки зрения того, что основной проект может использовать команду
ExternalProject_Get_Property()для получения их значений, позволяя, таким образом, главному проекту ссылаться на артефакты сборки внешнего проекта.-
PREFIX <dir> -
Корневой каталог внешнего проекта. Если не указано иное, все остальные каталоги, связанные с внешним проектом, будут созданы внутри него.
-
TMP_DIR <dir> -
Каталог для хранения временных файлов.
-
STAMP_DIR <dir> -
Каталог для хранения отметки времени каждого этапа. Лог-файлы отдельных этапов также создаются здесь, если не переопределено опцией LOG_DIR (см. Опции ведения журнала ниже).
-
LOG_DIR <dir> -
Новое в версии 3.14.
Каталог для хранения журналов каждого этапа.
-
DOWNLOAD_DIR <dir> -
Каталог для хранения загруженных файлов перед их распаковкой. Этот каталог используется только методом загрузки URL, все другие методы загрузки используют
SOURCE_DIRнапрямую вместо него. -
SOURCE_DIR <dir> -
Исходный каталог, в который будет распаковываться загруженное содержимое, или, для методов загрузки, отличных от URL, каталог, в котором следует выполнить проверку, клонирование и т. д. репозитория. Если метод загрузки не указан, этот параметр должен указывать на существующий каталог, где внешний проект уже распакован или клонирован/проверен.
Примечание
Если указан метод загрузки, всё существующее содержимое исходного каталога может быть удалено. Только метод загрузки URL проверяет, отсутствует или пуст ли этот каталог, прежде чем начать загрузку, и завершается с ошибкой, если он не пустой. Все другие методы загрузки молча отбрасывают любое предыдущее содержимое исходного каталога.
-
BINARY_DIR <dir> -
Указывает расположение каталога сборки. Эта опция игнорируется, если включена
BUILD_IN_SOURCE. -
INSTALL_DIR <dir> -
Префикс установки, который будет помещён в
<INSTALL_DIR>заполнитель. Это не настраивает внешний проект для установки в указанный префикс. Это должно быть сделано путём передачи соответствующих аргументов в шаг конфигурации внешнего проекта, например, с использованием<INSTALL_DIR>.
Если любая из вышеперечисленных
..._DIRопций не указана, их значения вычисляются следующим образом. Если указана опцияPREFIXили свойство каталогаEP_PREFIXзадано, тогда внешний проект собирается и устанавливается в указанный префикс:TMP_DIR = <prefix>/tmp STAMP_DIR = <prefix>/src/<name>-stamp DOWNLOAD_DIR = <prefix>/src SOURCE_DIR = <prefix>/src/<name> BINARY_DIR = <prefix>/src/<name>-build INSTALL_DIR = <prefix> LOG_DIR = <STAMP_DIR>
В противном случае, если свойство каталога
EP_BASEзадано, компоненты внешнего проекта хранятся в указанном базовом каталоге:TMP_DIR = <base>/tmp/<name> STAMP_DIR = <base>/Stamp/<name> DOWNLOAD_DIR = <base>/Download/<name> SOURCE_DIR = <base>/Source/<name> BINARY_DIR = <base>/Build/<name> INSTALL_DIR = <base>/Install/<name> LOG_DIR = <STAMP_DIR>
Если не указаны
PREFIX,EP_PREFIX, илиEP_BASE, то значениеPREFIXпо умолчанию устанавливается в<name>-prefix. Относительные пути интерпретируются относительноCMAKE_CURRENT_BINARY_DIRв момент вызоваExternalProject_Add(). -
- Опции шага загрузки:
-
Метод загрузки можно опустить, если используется опция
SOURCE_DIRдля указания существующей непустой директории. В противном случае, должен быть указан один из методов загрузки ниже (несколько методов загрузки не должны быть заданы) или предоставлен пользовательскийDOWNLOAD_COMMAND.-
DOWNLOAD_COMMAND <cmd>... -
Переопределяет команду, используемую для шага загрузки (
generator expressionsподдерживаются). Если эта опция задана, все другие опции загрузки будут игнорироваться. Указание пустой строки для<cmd>эффективно отключает шаг загрузки. - Загрузка по URL
-
-
URL <url1> [<url2>...] -
Список путей и/или URL(ов) исходного кода внешнего проекта. Если задано более одного URL, они будут пробоваться по очереди до тех пор, пока один не будет успешным. URL может быть обычным путем в локальной файловой системе (в этом случае должен быть указан только один URL) или любым поддерживаемым URL для загрузки командой
file(DOWNLOAD). Путь в локальной файловой системе может ссылаться на существующую директорию или на архивный файл, в то время как URL должен указывать на файл, который может обрабатываться как архив. При использовании архива он будет автоматически распакован, если опцияDOWNLOAD_NO_EXTRACTне отключит это. Тип архива определяется путем проверки фактического содержимого, а не по расширению файла.Изменено в версии 3.7: Разрешено несколько URL.
-
URL_HASH <algo>=<hashValue> -
Хэш архиваемого файла для загрузки. Аргумент должен иметь вид
<algo>=<hashValue>, гдеalgoможет быть любым из алгоритмов хэширования, поддерживаемых командойfile(). Указание этой опции настоятельно рекомендуется для загрузки по URL, так как она гарантирует целостность загружаемого содержимого. Она также используется для проверки ранее загруженного файла, что позволяет избежать подключения к удаленному расположению, если в локальной директории уже есть файл из предыдущей загрузки, соответствующий указанному хэшу. -
URL_MD5 <md5> -
Эквивалентно
URL_HASH MD5=<md5>. -
DOWNLOAD_NAME <fname> -
Имя файла для использования при загрузке. Если не указано, имя файла определяется из конца URL. Эта опция редко используется, имя по умолчанию обычно подходит и обычно не используется за пределами кода, внутреннего для модуля
ExternalProject. -
DOWNLOAD_EXTRACT_TIMESTAMP <bool> -
Новое в версии 3.24.
При указании со значением true, метки времени извлечённых файлов будут соответствовать меткам времени в архиве. Если false, метки времени извлечённых файлов будут отражать время, в которое произошло извлечение. Если URL загрузки изменится, метки времени, основанные на метках времени в архиве, могут привести к тому, что зависимые целевые файлы не будут перестроены, когда, возможно, они должны были. Поэтому, если метки времени файлов не важны для проекта, используйте для этой опции значение false. Если
DOWNLOAD_EXTRACT_TIMESTAMPне задано, значение по умолчанию — false. См. политикуCMP0135. -
DOWNLOAD_NO_EXTRACT <bool> -
Новое в версии 3.6.
Позволяет отключить распаковку загруженного содержимого, передав в этой опции булево значение true. Если эта опция не задана, загруженное содержимое будет автоматически распаковано, если это необходимо. Если извлечение отключено, полный путь к загруженному файлу доступен как
<DOWNLOADED_FILE>на последующих шагах или как свойствоDOWNLOADED_FILEс командойExternalProject_Get_Property(). -
DOWNLOAD_NO_PROGRESS <bool> -
Может быть использована для отключения протоколирования процесса загрузки. Если эта опция не указана, сообщения о ходе загрузки будут протоколироваться.
-
TIMEOUT <seconds> -
Максимальное время, разрешённое для операций загрузки файлов.
-
INACTIVITY_TIMEOUT <seconds> -
Новое в версии 3.19.
Прервать операцию после определённого периода бездействия.
-
HTTP_USERNAME <username> -
Новое в версии 3.7.
Имя пользователя для операции загрузки, если требуется аутентификация.
-
HTTP_PASSWORD <password> -
Новое в версии 3.7.
Пароль для операции загрузки, если требуется аутентификация.
-
HTTP_HEADER <header1> [<header2>...] -
Новое в версии 3.7.
Предоставляет произвольный список HTTP-заголовков для операции загрузки. Это может быть полезно для доступа к содержимому в системах, таких как AWS и т.д.
-
TLS_VERIFY <bool> -
Указывает, нужно ли выполнять проверку сертификата для https URL. Если эта опция не задана, поведение по умолчанию определяется переменной
CMAKE_TLS_VERIFY(см.file(DOWNLOAD)). Если и это не задано, проверка сертификата не будет выполнена. В ситуациях, когдаURL_HASHне может быть предоставлено, эта опция может быть альтернативным средством проверки.Изменено в версии 3.6: Эта опция также применяется к вызовам
git clone. -
TLS_CAINFO <file> -
Укажите файл с сертификатами авторитетных центров сертификации для использования, если
TLS_VERIFYвключено. Если эта опция не задана, будет использоваться значение переменнойCMAKE_TLS_CAINFO(см.file(DOWNLOAD)) -
NETRC <level> -
Новое в версии 3.11.
Указывает, должен ли файл
.netrcиспользоваться в операции. Если эта опция не задана, будет использовано значение переменнойCMAKE_NETRC(см.file(DOWNLOAD)). Допустимые уровни:-
IGNORED -
Файл
.netrcигнорируется. Это значение по умолчанию. -
OPTIONAL -
Файл
.netrcнеобязателен, информация в URL имеет приоритет. Файл будет проанализирован для поиска любой информации, которая не указана в URL. -
REQUIRED -
Файл
.netrcобязателен, информация в URL игнорируется.
-
-
NETRC_FILE <file> -
Новое в версии 3.11.
Укажите альтернативный файл
.netrcвместо файла в вашей домашней директории, если уровеньNETRCравенOPTIONALилиREQUIRED. Если эта опция не задана, будет использоваться значение переменнойCMAKE_NETRC_FILE(см.file(DOWNLOAD))
Новое в версии 3.1: Добавлена поддержка расширений
tbz2,.tar.xz,.txz, и.7z. -
- Git
-
-
-
ПРИМЕЧАНИЕ: Для использования этого метода загрузки требуется версия git 1.6.5 или более поздняя.
-
GIT_REPOSITORY <url> -
URL репозитория git. Можно использовать любой URL, понятный команде
git. -
GIT_TAG <tag> -
Имя ветки, тега или хэш коммита Git. Обратите внимание, что имена веток и тегов обычно следует указывать как имена удалённых репозиториев (т.е.
origin/myBranchвместо простоmyBranch). Это гарантирует, что если на удалённом конце был изменён тег или ветка, или переписана история, локальная копия всё равно будет обновлена правильно. В общем случае, для ряда причин предпочтительнее указать хэш коммита:- Если локальная копия уже содержит коммит, соответствующий хэшу, проверка изменений каждый раз при повторном запуске CMake не требуется. Это может значительно ускорить процесс, если используются многие внешние проекты.
- Использование конкретного хэша git гарантирует, что история основного проекта полностью прослеживается до определённой точки в развитии внешнего проекта. Если вместо этого используется имя ветки или тега, то взятие конкретного коммита основного проекта не обязательно привязывает весь сборку к определённой точке в жизни внешнего проекта. Отсутствие такого детерминированного поведения приводит к потере прослеживаемости и повторяемости в основном проекте.
Если включён
GIT_SHALLOW, тоGIT_TAGработает только с именами веток и тегов. Хэш коммита запрещён.Обратите внимание, что если не указано,
GIT_TAGпо умолчаниюmaster, а не имя по умолчанию ветки Git. -
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ссылается на действительную ссылку, если только нет несохранённых изменений, которые не могут быть успешно возвращены.
Переменная
CMAKE_EP_GIT_REMOTE_UPDATE_STRATEGYможет быть установлена для переопределения стратегии по умолчанию. Эта переменная не должна устанавливаться проектом, она предназначена для пользователя. В первую очередь она предназначена для использования в скриптах непрерывной интеграции для обеспечения того, что при переписывании истории на удалённой ветке сборка не завершится с непреднамеренными изменениями или неудачными сборками, вызванными конфликтами во время ребезинга. -
-
- Subversion
-
-
SVN_REPOSITORY <url> -
URL репозитория Subversion.
-
SVN_REVISION -r<rev> -
Ревизия для взятия из репозитория Subversion.
-
SVN_USERNAME <username> -
Имя пользователя для взятия и обновления Subversion.
-
SVN_PASSWORD <password> -
Пароль для взятия и обновления Subversion.
-
SVN_TRUST_CERT <bool> -
Указывает, следует ли доверять сертификату сайта сервера Subversion. При включении параметр
--trust-server-certпередаётся командам взятия и обновленияsvn.
-
- Mercurial
-
-
HG_REPOSITORY <url> -
URL репозитория mercurial.
-
HG_TAG <tag> -
Имя ветки, тега или идентификатор коммита Mercurial.
-
- CVS
-
-
CVS_REPOSITORY <cvsroot> -
CVSROOT репозитория CVS.
-
CVS_MODULE <mod> -
Модуль для взятия из репозитория CVS.
-
CVS_TAG <tag> -
Тег для взятия из репозитория CVS.
-
-
- Параметры шага обновления:
-
При каждом повторном запуске CMake по умолчанию исходные файлы внешнего проекта будут обновляться, если метод загрузки поддерживает обновления (например, репозиторий git будет проверен, если
GIT_TAGне ссылается на конкретный коммит).-
UPDATE_COMMAND <cmd>... -
Переопределяет шаг обновления метода загрузки пользовательской командой. Команда может использовать
generator expressions. -
UPDATE_DISCONNECTED <bool> -
Добавлено в версии 3.2.
При включении этот параметр пропускает шаг обновления. Однако он не предотвращает шаг загрузки. Шаг обновления всё ещё может быть добавлен как целевой шаг (см.
ExternalProject_Add_StepTargets()) и вызван вручную. Это полезно, если вы хотите позволить разработчикам создавать проект, когда они отключены от сети (хотя для шага загрузки сеть всё ещё может потребоваться).Когда этот параметр присутствует, обычно рекомендуется сделать это значение переменной кеша под контролем разработчика, а не жёстко закодированным. Если этот параметр отсутствует, значение по умолчанию берётся из свойства каталога
EP_UPDATE_DISCONNECTED. Если и это не определено, обновления выполняются как обычно. Свойство каталогаEP_UPDATE_DISCONNECTEDпредназначено в качестве удобного способа управления поведениемUPDATE_DISCONNECTEDдля всего раздела иерархии каталогов проекта и может быть более удобным способом предоставления разработчикам контроля над тем, выполнять ли обновления (предполагая, что проект также предоставляет переменную кеша или какой-либо другой удобный способ установки свойства каталога).Это может привести к автоматическому созданию целевого шага для шага
download. См. политикуCMP0114.
-
- Параметры шага исправления:
-
-
PATCH_COMMAND <cmd>... -
Указывает пользовательскую команду для исправления исходных файлов после обновления. По умолчанию команда исправления не определена. Обратите внимание, что определение подходящей команды исправления, которая работает надёжно, особенно для методов загрузки, таких как git, где изменение
GIT_TAGне отбросит изменения из предыдущего исправления, но команда исправления будет вызвана снова после обновления к новому тегу, может быть довольно сложно.
-
- Параметры шага настройки:
-
Этап конфигурации выполняется после этапов загрузки и обновления. По умолчанию предполагается, что внешний проект является проектом CMake, но это можно переопределить при необходимости.
-
CONFIGURE_COMMAND <cmd>... -
Команда конфигурации по умолчанию выполняет CMake с несколькими параметрами, основанными на основном проекте. Добавляемые параметры, как правило, включают только те, которые необходимы для использования того же генератора, что и в основном проекте, но параметр
CMAKE_GENERATORможет быть использован для переопределения этого. Проект отвечает за добавление любых деталей инструментальной цепочки, флагов или других настроек, которые он хочет повторно использовать из основного проекта или указать иным образом (см.CMAKE_ARGS,CMAKE_CACHE_ARGSиCMAKE_CACHE_DEFAULT_ARGSниже).Для внешних проектов, не являющихся проектами CMake, необходимо использовать параметр
CONFIGURE_COMMANDдля переопределения команды конфигурации по умолчанию (generator expressionsподдерживаются). Для проектов, для которых не требуется этап конфигурации, укажите этот параметр со строкой без значения для выполнения команды. -
CMAKE_COMMAND /.../cmake -
Укажите альтернативный исполняемый файл cmake для этапа конфигурации (используйте абсолютный путь). Это, как правило, не рекомендуется, так как обычно желательно использовать одну и ту же версию CMake для всего процесса сборки. Этот параметр игнорируется, если была указана пользовательская команда конфигурации с помощью параметра
CONFIGURE_COMMAND. -
CMAKE_GENERATOR <gen> -
Переопределите генератор CMake, используемый для этапа конфигурации. Без этого параметра будет использован тот же генератор, что и для основной сборки. Этот параметр игнорируется, если была указана пользовательская команда конфигурации с помощью параметра
CONFIGURE_COMMAND. -
CMAKE_GENERATOR_PLATFORM <platform> -
Новое в версии 3.1.
Передайте имя платформы, специфичное для генератора, команде CMake (см.
CMAKE_GENERATOR_PLATFORM). Указание этого параметра без параметраCMAKE_GENERATORявляется ошибкой. -
CMAKE_GENERATOR_TOOLSET <toolset> -
Передайте имя набора инструментов, специфичное для генератора, команде CMake (см.
CMAKE_GENERATOR_TOOLSET). Указание этого параметра без параметраCMAKE_GENERATORявляется ошибкой. -
CMAKE_GENERATOR_INSTANCE <instance> -
Новое в версии 3.11.
Передайте выбор экземпляра, специфичный для генератора, команде CMake (см.
CMAKE_GENERATOR_INSTANCE). Указание этого параметра без параметраCMAKE_GENERATORявляется ошибкой. -
CMAKE_ARGS <arg>... -
Указанные аргументы передаются в командную строку команды cmake. Они могут быть любыми аргументами, которые понимает команда cmake, а не только значениями кэша, определёнными аргументами
-D...(см. такжеCMake Options).Новое в версии 3.3: Аргументы могут использовать
generator expressions. -
CMAKE_CACHE_ARGS <arg>... -
Это альтернативный способ указания переменных кэша, где могут возникнуть проблемы с длиной командной строки. Ожидается, что аргументы будут в форме
-Dvar:STRING=value, которые затем преобразуются в команды CMakeset()с использованием параметраFORCE. Эти командыset()записываются в скрипт предварительной загрузки, который затем применяется с помощью параметра командной строкиcmake -C.Новое в версии 3.3: Аргументы могут использовать
generator expressions. -
CMAKE_CACHE_DEFAULT_ARGS <arg>... -
Новое в версии 3.2.
Это то же самое, что и параметр
CMAKE_CACHE_ARGS, за исключением того, что командыset()не включают ключевое словоFORCE. Это означает, что значения действуют только как начальные значения по умолчанию и не будут переопределять любые переменные, уже установленные в предыдущем запуске. Используйте этот параметр с осторожностью, так как это может привести к различному поведению в зависимости от того, запускается ли сборка с пустой директорией или переиспользуются предыдущие содержимое.Новое в версии 3.15: Если генератор CMake —
Green Hills MULTIи не переопределён, исходные настройки проекта для набора инструментов GHS и переменных кэша настройки целевой системы переносятся во внешний проект. -
SOURCE_SUBDIR <dir> -
Новое в версии 3.7.
Когда параметр
CONFIGURE_COMMANDне указан, этап конфигурации предполагает, что во внешнем проекте в корне дерева исходных кодов (т. е. вSOURCE_DIR) имеется файлCMakeLists.txt. Параметр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(), который имеет дополнительную документацию.
-
- Параметры этапа установки:
-
-
Если этап конфигурации предполагал, что внешний проект использует 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, эти опции размещают шаги в пулеconsolejob 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, замените;на<sep>в указанных командных строках. Это может быть полезно в тех случаях, когда переменные списков могут передаваться в команды, где они должны оказаться в качестве аргументов, разделенных пробелами (<sep>в этом случае будет строкой с одним пробелом). -
COMMAND <cmd>... -
Любые другие
..._COMMANDопции могут иметь дополнительные команды, добавленные к ним путем добавления несколькихCOMMAND ...опций, сколько необходимо (generator expressionsподдерживаются). Например:ExternalProject_Add(example ... # Download options, etc. BUILD_COMMAND ${CMAKE_COMMAND} -E echo "Starting $<CONFIG> build" COMMAND ${CMAKE_COMMAND} --build <BINARY_DIR> --config $<CONFIG> COMMAND ${CMAKE_COMMAND} -E echo "$<CONFIG> build complete" )
-
Также следует отметить, что каждый шаг сборки создается путем вызова
ExternalProject_Add_Step(). См. документацию этой команды для автоматических подстановок, которые поддерживаются для некоторых опций.-
Получение свойств проекта
-
ExternalProject_Get_Property -
Функция
ExternalProject_Get_Property()извлекает свойства целевых объектов внешнего проекта:ExternalProject_Get_Property(<name> <prop1> [<prop2>...])
Функция сохраняет значения свойств в переменных с одинаковыми именами. Имена свойств соответствуют именам ключевых аргументов
ExternalProject_Add(). Например, каталог исходных файлов можно получить следующим образом:ExternalProject_Get_property(myExtProj SOURCE_DIR) message("Source dir of myExtProj = ${SOURCE_DIR}")
Явное управление шагами
Функция ExternalProject_Add() сама по себе часто достаточно для включения внешнего проекта в основную сборку. В определенных сценариях требуется дополнительная работа для реализации желаемого поведения, например, добавление пользовательского шага или предоставление шагов в качестве запускаемых вручную целевых объектов. Функции ExternalProject_Add_Step(), ExternalProject_Add_StepTargets() и ExternalProject_Add_StepDependencies обеспечивают необходимый низкоуровневый контроль для реализации таких возможностей на уровне шагов.
-
ExternalProject_Add_Step -
Функция
ExternalProject_Add_Step()определяет дополнительный пользовательский шаг для внешнего проекта, определенного ранее с помощью вызоваExternalProject_Add():ExternalProject_Add_Step(<name> <step> [<option>...])
<name>— это то же самое имя, которое передано в исходный вызовExternalProject_Add(). Указанный<step>не должен быть одним из предопределенных шагов (mkdir,download,update,patch,configure,build,installилиtest).-
COMMAND <cmd>... -
Командная строка, которая должна быть выполнена этим пользовательским шагом (
generator expressionsподдерживаются). Эту опцию можно повторять несколько раз, чтобы указать несколько команд, которые должны быть выполнены в порядке. -
COMMENT "<text>..." -
Текст, который будет напечатан при выполнении пользовательского шага.
-
DEPENDEES <step>... -
Другие шаги (пользовательские или предопределенные), от которых зависит этот шаг.
-
DEPENDERS <step>... -
Другие шаги (пользовательские или предопределенные), которые зависят от этого нового пользовательского шага.
-
DEPENDS <file>... -
Файлы, от которых зависит этот пользовательский шаг.
-
INDEPENDENT <bool> -
Введено в версии 3.19.
Указывает, независит ли этот шаг от внешних зависимостей, указанных в опции
DEPENDSвызоваExternalProject_Add(). Значение по умолчанию —FALSE. Шаги, помеченные как независимые, могут зависеть только от других шагов, помеченных как независимые. См. политикуCMP0114.Обратите внимание, что это использование термина «независимый» относится только к независимости от внешних целевых объектов, указанных в опции
DEPENDS, и ортогонально зависимостям шага от других шагов.Если целевой объект шага создается для независимого шага с помощью опции
STEP_TARGETSExternalProject_Add()или функцииExternalProject_Add_StepTargets(), он не будет зависеть от внешних целевых объектов, но может зависеть от целевых объектов других шагов. -
BYPRODUCTS <file>... -
Введено в версии 3.2.
Файлы, которые будут сгенерированы этим пользовательским шагом, но у которых время последнего изменения может или не может быть обновлено последующими сборками. Это также может потребоваться для явного объявления зависимостей при использовании генератора
Ninja. Этот список файлов в конечном итоге будет передан в качестве опцииBYPRODUCTSв используемую для реализации пользовательского шага командуadd_custom_command(), которая имеет дополнительную документацию. -
ALWAYS <bool> -
При включении эта опция указывает, что пользовательский шаг должен всегда выполняться (то есть, он всегда считается устаревшим).
-
EXCLUDE_FROM_MAIN <bool> -
При включении эта опция указывает, что основная цель внешнего проекта не зависит от пользовательского шага. Это может привести к автоматическому созданию целевых объектов шагов для шагов, от которых зависит этот шаг. См. политику
CMP0114. -
WORKING_DIRECTORY <dir> -
Устанавливает рабочий каталог перед выполнением команды пользовательского шага. Если эта опция не указана, каталог будет значением
CMAKE_CURRENT_BINARY_DIRв момент вызоваExternalProject_Add_Step(). -
LOG <bool> -
Если установлено, это приводит к тому, что вывод от пользовательского шага будет записан во временные файлы во внешнем проекте
LOG_DIR(если предоставлено) илиSTAMP_DIR. -
USES_TERMINAL <bool> -
Если включено, это предоставляет пользовательскому шагу прямой доступ к терминалу, если это возможно.
Командная строка, комментарий, рабочий каталог и побочные продукты каждого стандартного и пользовательского шага обрабатываются для замены маркеров
<SOURCE_DIR>,<SOURCE_SUBDIR>,<BINARY_DIR>,<INSTALL_DIR><TMP_DIR>,<DOWNLOAD_DIR>и<DOWNLOADED_FILE>на соответствующие значения свойств, определенные в исходном вызовеExternalProject_Add().Введено в версии 3.3: Замена маркеров расширена на побочные продукты.
Введено в версии 3.11: Маркер замены
<DOWNLOAD_DIR>. -
-
ExternalProject_Add_StepTargets -
Функция
ExternalProject_Add_StepTargets()генерирует целевые задачи для перечисленных шагов. Имя каждой созданной целевой задачи будет иметь вид<name>-<step>:ExternalProject_Add_StepTargets(<name> <step1> [<step2>...])
Создание целевой задачи для шага позволяет использовать её в качестве зависимости другой целевой задачи или запускать её вручную. Наличие целевых задач для конкретных шагов также позволяет управлять ими независимо друг от друга, указав целевые задачи в командной строке сборки. Например, вы можете отправлять данные в панель управления подпроекта, где вы хотите выполнить настройку сборки, затем отправить данные в панель управления, после чего выполнить сборку, а затем тесты. Если вы вызываете пользовательскую целевую задачу, зависящую от шага на полпути в цепочке зависимостей шагов, все предыдущие шаги также будут выполнены, чтобы гарантировать актуальность всех данных.
Внутри,
ExternalProject_Add()вызываетExternalProject_Add_Step()для создания каждого шага. Если были указаны любыеSTEP_TARGETS, тогдаExternalProject_Add_StepTargets()также будет вызвано послеExternalProject_Add_Step(). Даже если шаг не указан в параметреSTEP_TARGETS,ExternalProject_Add_StepTargets()всё равно может быть вызвано позже для ручного определения целевой задачи для шага.Параметр
STEP_TARGETSдляExternalProject_Add()обычно является самым простым способом обеспечения создания целевых задач для конкретных шагов, представляющих интерес. Для пользовательских шагов,ExternalProject_Add_StepTargets()необходимо вызвать явно, если целевая задача должна быть также создана для этого пользовательского шага. Альтернативой этим двум параметрам является заполнение свойства каталогаEP_STEP_TARGETS. Оно действует как значение по умолчанию для параметров целевых задач шагов и может сэкономить время, не нужно постоянно указывать тот же набор целевых задач шагов при определении нескольких внешних проектов.Новая функция в версии 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–2023 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.26/module/ExternalProject.html