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_VERSION <min> -
Добавлена в версии 3.30.
Укажите минимальную версию TLS для
https://URL. Если эта опция не указана, будет использовано значение переменнойCMAKE_TLS_VERSIONили переменной окруженияCMAKE_TLS_VERSION(см.file(DOWNLOAD)).Эта опция также применяется к вызовам
git clone, хотя поведение по умолчанию отличается. Если ни одна из опцийTLS_VERSION, переменнаяCMAKE_TLS_VERSION, или переменная окруженияCMAKE_TLS_VERSIONне указана, поведение будет определяться значением по умолчанию git или опциейhttp.sslVersiongit config, которую пользователь может установить на глобальном уровне. -
TLS_VERIFY <bool> -
Указывает, необходимо ли выполнять проверку сертификата для
https://URL. Если эта опция не указана, будет использовано значение переменнойCMAKE_TLS_VERIFYили переменной окруженияCMAKE_TLS_VERIFY(см.file(DOWNLOAD)). Если ни одна из них не установлена, проверка сертификата не будет выполнена. В ситуациях, когдаURL_HASHнельзя указать, эта опция может быть альтернативным способом проверки.Эта опция также применяется к вызовам
git clone, хотя поведение по умолчанию отличается. Если ни одна из опцийTLS_VERIFY, переменнаяCMAKE_TLS_VERIFYили переменная окруженияCMAKE_TLS_VERIFYне указана, поведение будет определяться значением по умолчанию git (true) или опциейhttp.sslVerifygit config, которую пользователь может установить на глобальном уровне.Изменено в версии 3.6: Ранее эта опция не применялась к вызовам
git clone.Изменено в версии 3.30: Ранее переменная окружения
CMAKE_TLS_VERIFYне проверялась. -
TLS_CAINFO <file> -
Укажите файл пользовательского сертификата CA для использования, если
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 или более поздняя, если используется этот метод загрузки.
END_OF_DOCUMENT_MARKER-
GIT_REPOSITORY <url> -
URL репозитория Git. Можно использовать любой URL, понятный команде
git.Изменено в версии 3.27: Относительный URL будет разрешен на основе удаленного репозитория родительского проекта, с учётом
CMP0150. Обратитесь к документации по политике для получения информации о том, как выбирается удалённый репозиторий, включая ситуации, когда выбор удалённого репозитория может завершиться ошибкой. Для удалённых репозиториев на локальном файловом сервере всегда используйте абсолютные пути. -
GIT_TAG <tag> -
Имя ветки, тега или хэш коммита Git. Обратите внимание, что имена веток и тегов, как правило, должны указываться как имена удалённых репозиториев (например,
origin/myBranchа не простоmyBranch). Это гарантирует, что если на удалённом конце переименован тег или перебазирован/переписан историю ветки, локальный клон будет обновлён правильно. В общем случае, для ряда причин предпочтительнее указывать хэш коммита:- Если локальный клон уже содержит коммит, соответствующий хэшу, не требуется выполнять
git fetchдля проверки изменений при каждом повторном запуске 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ссылается на действительный ref, если только нет несохранённых изменений, которые не могут быть успешно восстановлены.
Переменная
CMAKE_EP_GIT_REMOTE_UPDATE_STRATEGYможет быть установлена для переопределения стратегии по умолчанию. Эта переменная не должна устанавливаться проектом, она предназначена для установки пользователем. Она предназначена в первую очередь для использования в скриптах непрерывной интеграции, чтобы гарантировать, что при переписывании истории удалённой ветки сборка не закончится с непреднамеренными изменениями или сбоями из-за конфликтов при перебазировании. -
Subversion
-
SVN_REPOSITORY <url> -
URL репозитория Subversion.
-
SVN_REVISION -r<rev> -
Ревизия для проверки из репозитория Subversion.
-
SVN_USERNAME <username> -
Имя пользователя для проверки и обновления Subversion.
-
SVN_PASSWORD <password> -
Пароль для проверки и обновления Subversion.
-
SVN_TRUST_CERT <bool> -
Указывает, следует ли доверять сертификату сайта сервера Subversion. При включении параметр
--trust-server-certпередаётся командам проверки и обновленияsvn.
Mercurial
-
HG_REPOSITORY <url> -
URL репозитория Mercurial.
-
HG_TAG <tag> -
Имя ветки, тега или идентификатор коммита Mercurial.
CVS
-
CVS_REPOSITORY <cvsroot> -
CVSROOT репозитория CVS.
-
CVS_MODULE <mod> -
Модуль для проверки из репозитория CVS.
-
CVS_TAG <tag> -
Тег для проверки из репозитория CVS.
Параметры шага обновления
При каждом повторном запуске CMake по умолчанию источники внешнего проекта будут обновлены, если метод загрузки поддерживает обновления (например, репозиторий Git будет проверен, если GIT_TAG не ссылается на определённый коммит).
-
UPDATE_COMMAND <cmd>... -
Переопределяет шаг обновления метода загрузки пользовательской командой. Команда может использовать
generator expressions. -
UPDATE_DISCONNECTED <bool> -
Добавлен в версии 3.2.
При включении этот параметр пропускает шаг обновления (но см. ниже изменённое поведение, где это не так). Он не препятствует шагу загрузки. Шаг обновления всё ещё может быть добавлен в качестве целевого шага (см.
ExternalProject_Add_StepTargets()) и вызван вручную. Это полезно, если вы хотите разрешить разработчикам строить проект при отключении от сети (хотя сеть может всё ещё потребоваться для шага загрузки).Изменено в версии 3.27: Если
UPDATE_DISCONNECTEDистинно, шаг обновления будет выполнен, если какие-либо детали шага обновления или загрузки изменены. Кроме того, если используется метод загрузки/обновления Git, логика обновления будет изменена, чтобы пропустить попытки связи с удалённым репозиторием. ЕслиGIT_TAGуказывает на ref, который не известен локально, шаг обновления завершится ошибкой.Если этот параметр присутствует, рекомендуется сделать его переменной кэша, контролируемой разработчиком, вместо жёсткого кодирования. Если этот параметр отсутствует, значение по умолчанию берется из свойства каталога
EP_UPDATE_DISCONNECTED. Если оно также не определено, обновления выполняются как обычно. Свойство каталогаEP_UPDATE_DISCONNECTEDпредназначено для удобства управления поведениемUPDATE_DISCONNECTEDдля всего раздела иерархии каталогов проекта и может быть более удобным способом, чтобы дать разработчикам возможность контролировать, выполнять ли обновления (предполагая, что проект также предоставляет переменную кэша или какой-либо другой удобный способ для установки свойства каталога).Это может привести к автоматическому созданию целевого шага для шага
download. См. политикуCMP0114.
Параметры шага применения
-
PATCH_COMMAND <cmd>... -
Указывает пользовательскую команду для применения исправлений к источникам после обновления. По умолчанию команда применения исправлений не определена. Обратите внимание, что определение подходящей команды применения исправлений, которая работает надёжно, особенно для методов загрузки, таких как Git, где изменение
GIT_TAGне отбросит изменения от предыдущих исправлений, но команда применения исправлений будет вызвана снова после обновления к новому тегу, довольно сложно.
Параметры шага настройки
Шаг настройки выполняется после шагов загрузки и обновления. По умолчанию предполагается, что внешний проект — это проект CMake, но это можно переопределить при необходимости.
-
CONFIGURE_COMMAND <cmd>... -
Команда конфигурации по умолчанию выполняет CMake с несколькими параметрами, основанными на основном проекте. Добавленные параметры, как правило, включают только те, которые необходимы для использования того же генератора, что и в основном проекте, но параметр
CMAKE_GENERATORможет быть задан для переопределения этого. Проект отвечает за добавление любых деталей цепочки инструментов, флагов или других настроек, которые он хочет повторно использовать из основного проекта или иначе указать (см.CMAKE_ARGS,CMAKE_CACHE_ARGSиCMAKE_CACHE_DEFAULT_ARGSниже).Для внешних проектов, не использующих CMake, параметр
CONFIGURE_COMMANDдолжен быть использован для переопределения команды конфигурации по умолчанию (generator expressionsподдерживаются). Для проектов, не требующих шага конфигурации, укажите этот параметр со строкой пустой командой для выполнения. -
CMAKE_COMMAND /.../cmake -
Укажите альтернативный исполняемый файл cmake для шага конфигурации (используйте абсолютный путь). Это, как правило, не рекомендуется, так как обычно желательно использовать ту же версию CMake на протяжении всего процесса сборки. Этот параметр игнорируется, если команда конфигурации была задана вручную с помощью параметра
CONFIGURE_COMMAND. -
CMAKE_GENERATOR <gen> -
Переопределите генератор CMake, используемый на этапе конфигурации. Без этого параметра будет использоваться тот же генератор, что и при основной сборке. Этот параметр игнорируется, если команда конфигурации была задана вручную с помощью параметра
CONFIGURE_COMMAND. -
CMAKE_GENERATOR_PLATFORM <platform> -
Добавлена в версии 3.1.
Передайте имя платформы, специфичное для генератора, в команду CMake (см.
CMAKE_GENERATOR_PLATFORM). Предоставление этого параметра без параметраCMAKE_GENERATORявляется ошибкой. -
CMAKE_GENERATOR_TOOLSET <toolset> -
Передайте имя набора инструментов, специфичное для генератора, в команду CMake (см.
CMAKE_GENERATOR_TOOLSET). Предоставление этого параметра без параметраCMAKE_GENERATORявляется ошибкой. -
CMAKE_GENERATOR_INSTANCE <instance> -
Добавлена в версии 3.11.
Передайте выбор экземпляра, специфичный для генератора, в команду CMake (см.
CMAKE_GENERATOR_INSTANCE). Предоставление этого параметра без параметраCMAKE_GENERATORявляется ошибкой. -
CMAKE_ARGS <arg>... -
Указанные аргументы передаются в командную строку команды cmake. Это могут быть любые аргументы, которые понимает команда cmake, а не только значения кеша, определённые параметрами
-D...(см. такжеCMake Options).Добавлена в версии 3.3: Аргументы могут использовать
generator expressions. -
CMAKE_CACHE_ARGS <arg>... -
Это альтернативный способ задания переменных кеша, где могут возникнуть проблемы с длиной командной строки. Ожидается, что аргументы будут иметь вид
-Dvar:STRING=value, которые затем преобразуются в команды CMakeset()с использованием параметраFORCE. Эти командыset()записываются в скрипт предварительной загрузки, который затем применяется с помощью параметра командной строкиcmake -C.Добавлена в версии 3.3: Аргументы могут использовать
generator expressions. -
CMAKE_CACHE_DEFAULT_ARGS <arg>... -
Добавлена в версии 3.2.
Это то же, что и параметр
CMAKE_CACHE_ARGS, за исключением того, что командыset()не включают ключевое словоFORCE. Это означает, что значения действуют только как начальные значения по умолчанию и не будут переопределять любые переменные, уже заданные из предыдущего запуска. Используйте этот параметр с осторожностью, так как это может привести к различному поведению в зависимости от того, начинается ли сборка с пустого каталога или используется содержимое предыдущей сборки.Добавлена в версии 3.15: Если генератор CMake — это
Green Hills MULTI, и он не переопределён, настройки основного проекта для набора инструментов GHS и переменных кеша настройки целевой системы распространяются на внешний проект. -
SOURCE_SUBDIR <dir> -
Добавлена в версии 3.7.
Когда параметр
CONFIGURE_COMMANDне указан, шаг конфигурации предполагает, что у внешнего проекта есть файлCMakeLists.txtв корне дерева исходных кодов (т.е. вSOURCE_DIR). ПараметрSOURCE_SUBDIRможно использовать для указания альтернативной директории в дереве исходных кодов, которая будет использоваться как корень дерева CMake исходного кода. Это должен быть относительный путь, который будет интерпретироваться как относительный кSOURCE_DIR.Добавлена в версии 3.14: При включенном параметре
BUILD_IN_SOURCE, используется параметрBUILD_COMMAND, для указания альтернативной директории в дереве исходных кодов. -
CONFIGURE_HANDLED_BY_BUILD <bool> -
Добавлена в версии 3.20.
Включение этого параметра ослабляет зависимость шага конфигурации от других внешних проектов до уровня только упорядочивания. Это означает, что шаг конфигурации будет выполнен после построения его внешних зависимостей, но он не будет отмечен как изменённый, когда одна из его внешних зависимостей перестроена. Этот параметр может быть включён, когда шаг сборки достаточно интеллектуален, чтобы определить, нужно ли перевыполнять шаг конфигурации. CMake и Meson являются примерами систем сборки, чей шаг сборки достаточно интеллектуален, чтобы знать, нужно ли перевыполнять шаг конфигурации.
Параметры шага сборки
Если шаг конфигурации предполагает, что внешний проект использует CMake в качестве своей системы сборки, то шаг сборки тоже. В противном случае, шаг сборки будет предполагать сборку на основе Makefile и просто выполнит make без аргументов в качестве шага сборки по умолчанию. Это может быть переопределено настраиваемыми командами сборки, если это необходимо.
Если основной проект и внешний проект используют make в качестве своего инструмента сборки, шаг сборки внешнего проекта вызывается как рекурсивный make, используя $(MAKE). Это позволит передать некоторые настройки инструмента сборки из основного проекта во внешний проект. Если либо основной проект, либо внешний проект не используют make, никакие настройки инструмента сборки не будут переданы внешнему проекту, кроме тех, которые установлены на этапе конфигурации (т.е. выполнение ninja -v в основном проекте не передаст -v в шаг сборки внешнего проекта, даже если он также использует ninja в качестве инструмента сборки).
-
BUILD_COMMAND <cmd>... -
Переопределяет команду сборки по умолчанию (
generator expressionsподдерживаются). Если этот параметр не задан, команда сборки по умолчанию будет выбрана для интеграции с основной сборкой наиболее подходящим образом (например, с помощью рекурсивногоmakeдля генераторов Makefile илиcmake --build, если проект использует сборку CMake). Этот параметр можно задать со строкой пустой командой для того, чтобы шаг сборки ничего не делал. -
BUILD_IN_SOURCE <bool> -
При включении этого параметра сборка будет выполнена непосредственно в дереве исходных кодов внешнего проекта. Это, как правило, следует избегать, использование отдельного каталога сборки обычно предпочтительнее, но может быть полезно, когда внешний проект предполагает инкрементную сборку. Параметр
BINARY_DIRне должен быть указан при построении в исходном каталоге. -
BUILD_ALWAYS <bool> -
Включение этого параметра заставляет шаг сборки всегда выполняться. Это может быть самый простой способ надёжно убедиться, что собственные зависимости сборки внешнего проекта оцениваются, а не полагаться на метод определения времени успешного выполнения по умолчанию. Этот параметр обычно не требуется, если не ожидается, что разработчики изменят что-то, от чего зависит сборка внешнего проекта, способом, не обнаруживаемым зависимостями целевого этапа (например,
SOURCE_DIRиспользуется без метода загрузки, и разработчики могут изменить исходные коды вSOURCE_DIR). -
BUILD_BYPRODUCTS <file>... -
Добавлена в версии 3.2.
Указывает файлы, которые будут сгенерированы командой сборки, но которые могут или не могут иметь своё время модификации, обновлённое последующими сборками. Это также может потребоваться для явного объявления зависимостей при использовании генератора
Ninja. В конечном итоге они передаются какBYPRODUCTSв собственный вызов шага сборки кadd_custom_command(), который имеет дополнительную документацию. -
BUILD_JOB_SERVER_AWARE <bool> -
Добавлена в версии 3.28.
Указывает, что шаг сборки знает о сервере заданий GNU Make. Смотрите документацию к
add_custom_command()документации параметраJOB_SERVER_AWAREдля получения подробной информации. Этот параметр актуален только при явном указанииBUILD_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, эти опции помещают шаги в console job pool. Каждый шаг может получить доступ к терминалу индивидуально с помощью следующих опций:
-
USES_TERMINAL_DOWNLOAD <bool> -
Предоставить шагу загрузки доступ к терминалу.
-
USES_TERMINAL_UPDATE <bool> -
Предоставить шагу обновления доступ к терминалу.
-
USES_TERMINAL_PATCH <bool> -
Добавлен в версии 3.23.
Предоставить шагу патчинга доступ к терминалу.
-
USES_TERMINAL_CONFIGURE <bool> -
Предоставить шагу конфигурации доступ к терминалу.
-
USES_TERMINAL_BUILD <bool> -
Предоставить шагу сборки доступ к терминалу.
-
USES_TERMINAL_INSTALL <bool> -
Предоставить шагу установки доступ к терминалу.
-
USES_TERMINAL_TEST <bool> -
Предоставить шагу тестирования доступ к терминалу.
Опции целевых объектов
-
DEPENDS <targets>... -
Укажите другие целевые объекты, от которых зависит внешний проект. Другие целевые объекты будут обновлены до того, как будут выполнены какие-либо шаги внешнего проекта. Поскольку внешний проект использует дополнительные пользовательские целевые объекты внутри для каждого шага, опция
DEPENDSявляется наиболее удобным способом обеспечения зависимости всех этих шагов от других целевых объектов. Простое выполнениеadd_dependencies(<name> <targets>)не заставит ни один из шагов зависеть от<targets>. -
EXCLUDE_FROM_ALL <bool> -
При включении этой опции, внешний проект исключается из целевого объекта ALL основной сборки.
-
STEP_TARGETS <step-target>... -
Генерирует пользовательские целевые объекты для указанных шагов. Это требуется, если шаги необходимо запускать вручную или если они должны использоваться в качестве зависимостей других целевых объектов. Если эта опция не указана, значение по умолчанию берётся из свойства каталога
EP_STEP_TARGETS. См.ExternalProject_Add_StepTargets()для дальнейшего обсуждения эффектов этой опции. -
INDEPENDENT_STEP_TARGETS <step-target>... -
Устарело начиная с версии 3.19: Это разрешено только если политика
CMP0114не установлена вNEW.Генерирует пользовательские целевые объекты для указанных шагов и предотвращает применение к ним обычных зависимостей. Если эта опция не указана, значение по умолчанию берётся из свойства каталога
EP_INDEPENDENT_STEP_TARGETS. Эта опция в основном полезна для самостоятельного управления отдельными шагами, например, для настройки CDash, где каждый шаг должен запускаться и отчитываться индивидуально, а не как один весь процесс сборки. См.ExternalProject_Add_StepTargets()для дальнейшего обсуждения эффектов этой опции.
Разные опции
-
LIST_SEPARATOR <sep> -
Для любого из различных
..._COMMANDвариантов иCMAKE_ARGS,ExternalProjectзаменит<sep>на;в указанных командных строках. Это можно использовать для того, чтобы убедиться, что команда содержит литерную;в ней, где прямое использование в противном случае интерпретировалось бы как разделители аргументов API CMake вместо этого. Обратите внимание, что разделитель следует выбирать таким образом, чтобы его не путали с использованием последовательности в качестве разделителя не списков. Например, использованиеLIST_SEPARATORпозволяет передавать значения списка в переменные кэша CMake в командной строке:ExternalProject_Add(example ... # Download options, etc. LIST_SEPARATOR "," CMAKE_ARGS "-DCMAKE_PREFIX_PATH:STRING=${first_prefix},${second_prefix}" ) -
COMMAND <cmd>... -
Любой из других
..._COMMANDвариантов может иметь дополнительные команды, добавленные к ним, путем добавления к ним необходимого количестваCOMMAND ...вариантов (generator expressionsподдерживаются). Например:ExternalProject_Add(example ... # Download options, etc. BUILD_COMMAND ${CMAKE_COMMAND} -E echo "Starting $<CONFIG> build" COMMAND ${CMAKE_COMMAND} --build <BINARY_DIR> --config $<CONFIG> COMMAND ${CMAKE_COMMAND} -E echo "$<CONFIG> build complete" )
Также следует отметить, что каждый шаг сборки создаётся посредством вызова ExternalProject_Add_Step(). См. документацию этой команды для автоматических подстановок, которые поддерживаются для некоторых вариантов.
Получение свойств проекта
-
ExternalProject_Get_Property -
Функция
ExternalProject_Get_Property()извлекает свойства целевых внешних проектов:ExternalProject_Get_Property(<name> <prop1> [<prop2>...])
Функция сохраняет значения свойств в переменных с тем же именем. Имена свойств соответствуют именам аргументов ключевых слов
ExternalProject_Add(). Например, каталог исходного кода можно получить следующим образом:ExternalProject_Get_property(myExtProj SOURCE_DIR) message("Source dir of myExtProj = ${SOURCE_DIR}")
Явное управление шагами
Функция ExternalProject_Add() сама по себе часто достаточна для включения внешнего проекта в основную сборку. В определённых сценариях требуется дополнительная работа для реализации желаемого поведения, например, добавления пользовательского шага или предоставления шагов в качестве вручную запускаемых целей. Функции ExternalProject_Add_Step(), ExternalProject_Add_StepTargets() и ExternalProject_Add_StepDependencies обеспечивают необходимый низкоуровневый контроль для реализации таких возможностей на уровне шагов.
-
ExternalProject_Add_Step -
Функция
ExternalProject_Add_Step()определяет дополнительный пользовательский шаг для внешнего проекта, определённого предыдущим вызовомExternalProject_Add():ExternalProject_Add_Step(<name> <step> [<option>...])
<name>такое же, как имя, переданное в исходном вызовеExternalProject_Add(). Указанный<step>не должен быть одним из предопределённых шагов (mkdir,download,update,patch,configure,build,installилиtest). Поддерживаемые варианты:-
COMMAND <cmd>... -
Командная строка, которая должна быть выполнена этим пользовательским шагом (
generator expressionsподдерживаются). Этот вариант может повторяться несколько раз для указания нескольких команд, которые должны выполняться в порядке. -
COMMENT "<text>..." -
Текст, который будет напечатан при выполнении пользовательского шага.
-
DEPENDEES <step>... -
Другие шаги (пользовательские или предопределённые), от которых зависит этот шаг.
-
DEPENDERS <step>... -
Другие шаги (пользовательские или предопределённые), которые зависят от этого нового пользовательского шага.
-
DEPENDS <file>... -
Файлы, от которых зависит этот пользовательский шаг.
-
INDEPENDENT <bool> -
Добавлен в версии 3.19.
Определяет, независим ли этот шаг от внешних зависимостей, указанных вариантом
DEPENDSвExternalProject_Add(). По умолчаниюFALSE. Шаги, помеченные как независимые, могут зависеть только от других шагов, помеченных как независимые. См. политикуCMP0114.Обратите внимание, что это использование термина «независимый» относится только к независимости от внешних целей, указанных вариантом
DEPENDS, и ортогонально зависимостям шага от других шагов.Если целевой объект шага создаётся для независимого шага вариантом
STEP_TARGETSвExternalProject_Add()или функциейExternalProject_Add_StepTargets(), он не будет зависеть от внешних целей, но может зависеть от целей других шагов. -
BYPRODUCTS <file>... -
Добавлен в версии 3.2.
Файлы, которые будут сгенерированы этим пользовательским шагом, но у которых время модификации может или не может быть обновлено последующими сборками. Это также может потребоваться для явного объявления зависимостей при использовании генератора
Ninja. Этот список файлов в конечном итоге будет передан в качестве вариантаBYPRODUCTSвadd_custom_command(), используемого для реализации пользовательского шага внутри, что имеет дополнительную документацию. -
ALWAYS <bool> -
При включённом варианте этот вариант указывает, что пользовательский шаг всегда должен выполняться (то есть, что он всегда считается устаревшим).
-
JOB_SERVER_AWARE <bool> -
Добавлен в версии 3.28.
Указывает, что пользовательский шаг осведомлён о сервере задач GNU Make. Подробности см. в документации
add_custom_command()для её вариантаJOB_SERVER_AWARE. -
EXCLUDE_FROM_MAIN <bool> -
При включённом варианте этот вариант указывает, что основная цель внешнего проекта не зависит от пользовательского шага. Это может привести к автоматическому созданию целей шагов для шагов, от которых зависит этот шаг. См. политику
CMP0114. -
WORKING_DIRECTORY <dir> -
Указывает каталог, в котором будет установлен рабочий каталог перед выполнением команды пользовательского шага. Если этот вариант не указан, каталогом будет значение
CMAKE_CURRENT_BINARY_DIRв момент вызоваExternalProject_Add_Step(). -
LOG <bool> -
Если задано, это заставит вывод от пользовательского шага быть захвачен в файлы в
LOG_DIRвнешнего проекта, если предоставлено илиSTAMP_DIR. -
USES_TERMINAL <bool> -
Если включено, это даёт пользовательскому шагу прямой доступ к терминалу, если это возможно.
Командная строка, комментарий, рабочий каталог и побочные продукты каждого стандартного и пользовательского шага обрабатываются для замены маркеров
<SOURCE_DIR>,<SOURCE_SUBDIR>,<BINARY_DIR>,<INSTALL_DIR><TMP_DIR>,<DOWNLOAD_DIR>и<DOWNLOADED_FILE>на соответствующие значения свойств, определённые в исходном вызовеExternalProject_Add().Добавлен в версии 3.3: Замена маркеров расширена до побочных продуктов.
Добавлен в версии 3.11: Маркер замены
<DOWNLOAD_DIR>. -
-
ExternalProject_Add_StepTargets -
Функция
ExternalProject_Add_StepTargets()генерирует целевые задания для перечисленных шагов. Имя каждого созданного целевого задания будет иметь вид<name>-<step>:ExternalProject_Add_StepTargets(<name> <step1> [<step2>...])
Создание целевого задания для шага позволяет использовать его в качестве зависимости другого целевого задания или запускать его вручную. Наличие целевых заданий для конкретных шагов также позволяет управлять ими независимо друг от друга, указывая целевые задания в командной строке сборки. Например, вы можете отправлять данные в панель управления подпроектом, где вы хотите выполнить конфигурирование сборки, затем отправить данные в панель управления, затем выполнить сборку и, наконец, провести тесты. Если вы вызываете пользовательское целевое задание, которое зависит от шага посередине цепочки зависимостей шагов, все предыдущие шаги также будут выполнены для обеспечения актуальности всех данных.
Внутренне, функция
ExternalProject_Add()вызываетExternalProject_Add_Step()для создания каждого шага. Если были указаны какие-либоSTEP_TARGETS, тоExternalProject_Add_StepTargets()также будет вызван послеExternalProject_Add_Step(). Даже если шаг не упомянут в опцииSTEP_TARGETS,ExternalProject_Add_StepTargets()все равно может быть вызван позже для ручного определения целевого задания для этого шага.Опция
STEP_TARGETSдляExternalProject_Add()является, как правило, самым простым способом обеспечения создания целевых заданий для конкретных шагов, представляющих интерес. Для пользовательских шаговExternalProject_Add_StepTargets()необходимо вызвать явно, если необходимо также создать целевое задание для этого пользовательского шага. Альтернативой этим двум вариантам является заполнение свойства каталогаEP_STEP_TARGETS. Оно выступает в качестве значения по умолчанию для опций целевого задания шага и может избавить от необходимости многократного указания одного и того же набора целевых заданий шага при определении нескольких внешних проектов.Добавлен в версии 3.19: Если
CMP0114установлен вNEW, целевые задания шагов несут полную ответственность за хранение пользовательских команд, реализующих их шаги. Основное целевое задание, созданное функциейExternalProject_Addзависит от целевых заданий шагов, а целевые задания шагов зависят друг от друга. Зависимости на уровне целевого задания соответствуют зависимостям на уровне файлов, используемым пользовательскими командами для каждого шага. Целевые задания для шагов, созданных с помощью опцииINDEPENDENTExternalProject_Add_Step(), не зависят от внешних целевых заданий, указанных опциейDEPENDSExternalProject_Add(). Предварительно определенные шагиmkdir,download,update, иpatchнезависимы.Если
CMP0114неNEW, доступно следующее устаревшее поведение:- Может быть указана устаревшая опция
NO_DEPENDS, сразу после опции<name>и перед первым шагом. Если опцияNO_DEPENDSуказана, целевое задание шага не будет зависеть от зависимостей внешнего проекта (т. е. от любых зависимостей пользовательского целевого задания<name>внешнего проекта, созданного функциейExternalProject_Add()). Обычно это безопасно для шаговdownload,updateиpatch, так как они обычно не требуют обновления и сборки зависимостей. Однако использованиеNO_DEPENDSдля любого другого предварительно определенного шага может нарушить параллельную сборку. ИспользуйтеNO_DEPENDSтолько в тех случаях, когда точно известно, что указанные шаги не имеют зависимостей. Для пользовательских шагов подумайте о том, требуют ли пользовательские команды конфигурирования, сборки и установки зависимостей. - Опция
INDEPENDENT_STEP_TARGETSдляExternalProject_Add()или свойство каталогаEP_INDEPENDENT_STEP_TARGETSсообщает функции о внутреннем вызовеExternalProject_Add_StepTargets()с использованием опцииNO_DEPENDSдля указанных шагов.
- Может быть указана устаревшая опция
-
ExternalProject_Add_StepDependencies -
Добавлен в версии 3.2.
Функция
ExternalProject_Add_StepDependencies()может быть использована для добавления зависимостей к шагу. Добавляемые зависимости должны быть целевыми заданиями, о которых CMake уже знает (это могут быть обычные целевые задания исполняемых файлов или библиотек, пользовательские целевые задания или даже целевые задания шагов другого внешнего проекта):ExternalProject_Add_StepDependencies(<name> <step> <target1> [<target2>...])
Эта функция позаботится о настройке зависимостей на уровне целевых заданий и файлов и обеспечит, что параллельные сборки не будут нарушены. Она должна использоваться вместо
add_dependencies()при добавлении зависимостей для некоторых целевых заданий шагов, сгенерированных модулемExternalProject.
Примеры
Следующий пример демонстрирует, как загрузить и собрать гипотетический проект под названием FooBar с github:
include(ExternalProject) ExternalProject_Add(foobar GIT_REPOSITORY git@github.com:FooCo/FooBar.git GIT_TAG origin/release/1.2.3 )
Для примера также определим второй гипотетический внешний проект под названием SecretSauce, который загружается с веб-сервера. Для ускорения используются два URL-адреса, если доступна внутренняя сеть, с возвратом к более медленному внешнему серверу. Проект является типичным проектом Makefile без шага конфигурации, поэтому некоторые из команд по умолчанию переопределены. Требуется сборка только целевого задания sauce:
find_program(MAKE_EXE NAMES gmake nmake make)
ExternalProject_Add(secretsauce
URL http://intranet.somecompany.com/artifacts/sauce-2.7.tgz
https://www.somecompany.com/downloads/sauce-2.7.zip
URL_HASH MD5=d41d8cd98f00b204e9800998ecf8427e
CONFIGURE_COMMAND ""
BUILD_COMMAND ${MAKE_EXE} sauce
)
Предположим, что шаг сборки secretsauce требует, чтобы foobar уже был собран. Это можно обеспечить следующим образом:
ExternalProject_Add_StepDependencies(secretsauce build foobar)
Еще один вариант — создать пользовательское целевое задание для шага сборки foobar и сделать secretsauce зависимым от него, а не от всего проекта foobar. Это означало бы, что нужно собрать только foobar, а не выполнять шаги установки или тестирования перед тем, как можно будет собрать secretsauce. Зависимость также может быть определена вместе с проектом secretsauce.
ExternalProject_Add_StepTargets(foobar build)
ExternalProject_Add(secretsauce
URL http://intranet.somecompany.com/artifacts/sauce-2.7.tgz
https://www.somecompany.com/downloads/sauce-2.7.zip
URL_HASH MD5=d41d8cd98f00b204e9800998ecf8427e
CONFIGURE_COMMAND ""
BUILD_COMMAND ${MAKE_EXE} sauce
DEPENDS foobar-build
)
Вместо вызова ExternalProject_Add_StepTargets(), целевое задание можно определить вместе с самим проектом foobar.
ExternalProject_Add(foobar GIT_REPOSITORY git@github.com:FooCo/FooBar.git GIT_TAG origin/release/1.2.3 STEP_TARGETS build )
Если у многих внешних проектов должен быть один и тот же набор целевых заданий шагов, использование свойства каталога может быть более удобным. Целевое задание шага build может быть автоматически создано путем задания свойства каталога EP_STEP_TARGETS перед созданием внешних проектов с помощью функции ExternalProject_Add():
set_property(DIRECTORY PROPERTY EP_STEP_TARGETS build)
Наконец, предположим, что secretsauce предоставляет скрипт под названием makedoc, который может использоваться для генерации собственной документации. Предположим также, что скрипт ожидает входного каталога в качестве единственного параметра и что он должен быть запущен из каталога исходных кодов secretsauce. Пользовательский шаг и пользовательское целевое задание для запуска скрипта могут быть определены следующим образом:
ExternalProject_Add_Step(secretsauce docs COMMAND <SOURCE_DIR>/makedoc <BINARY_DIR> WORKING_DIRECTORY <SOURCE_DIR> COMMENT "Building secretsauce docs" ALWAYS TRUE EXCLUDE_FROM_MAIN TRUE ) ExternalProject_Add_StepTargets(secretsauce docs)
Пользовательский шаг затем может быть запущен из основной сборки следующим образом:
cmake --build . --target secretsauce-docs
© 2000–2024 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.31/module/ExternalProject.html