Spec-Zone.ru › CMake 3.27

ExternalData

  • Введение
  • Функции модуля
  • Переменные модуля
  • Ссылка на файлы

    • Ссылка на отдельные файлы
    • Ссылка на серии файлов
    • Ссылка на связанные файлы
    • Ссылка на каталоги
  • Алгоритмы хеширования
  • Пользовательские скрипты получения

Управление файлами данных, хранящимися вне дерева исходных кодов

Введение

Используйте этот модуль для однозначной ссылки на файлы данных, хранящиеся вне дерева исходных кодов, и извлекайте их во время сборки из произвольных локальных и удалённых местоположений с адресацией по содержимому. Функции этого модуля распознают аргументы со синтаксисом DATA{<name>} как ссылки на внешние данные, заменяют их полными путями к локальным копиям этих данных и создают правила сборки для извлечения и обновления локальных копий.

Например:

include(ExternalData)
set(ExternalData_URL_TEMPLATES "file:///local/%(algo)/%(hash)"
                               "file:////host/share/%(algo)/%(hash)"
                               "http://data.org/%(algo)/%(hash)")
ExternalData_Add_Test(MyData
  NAME MyTest
  COMMAND MyExe DATA{MyInput.png}
  )
ExternalData_Add_Target(MyData)

Когда запускается тест MyTest, аргумент DATA{MyInput.png} будет заменён полным путём к фактическому экземпляру файла данных MyInput.png на диске. Если дерево исходных кодов содержит ссылку на содержимое, например, MyInput.png.md5, то целевой MyData создаёт реальный MyInput.png в дереве сборки.

Функции модуля

ExternalData_Expand_Arguments

Функция ExternalData_Expand_Arguments оценивает ссылки DATA{} в своих аргументах и создаёт новый список аргументов:

ExternalData_Expand_Arguments(
  <target>   # Name of data management target
  <outVar>   # Output variable
  [args...]  # Input arguments, DATA{} allowed
  )

Она заменяет каждую ссылку DATA{} в аргументе полным путём к фактическому файлу данных на диске, который будет существовать после того, как <target> будет скомпилирован.

ExternalData_Add_Test

Функция ExternalData_Add_Test оборачивает команду CMake add_test(), но поддерживает ссылки DATA{} в своих аргументах:

ExternalData_Add_Test(
  <target>   # Name of data management target
  ...        # Arguments of add_test(), DATA{} allowed
  )

Она пропускает свои аргументы через ExternalData_Expand_Arguments, а затем вызывает команду add_test() с результатами.

ExternalData_Add_Target

Функция ExternalData_Add_Target создаёт пользовательскую цель для управления локальными экземплярами файлов данных, хранящихся вне дерева исходных кодов:

ExternalData_Add_Target(
  <target>                  # Name of data management target
  [SHOW_PROGRESS <ON|OFF>]  # Show progress during the download
  )

Она создаёт пользовательские команды в цели по мере необходимости, чтобы сделать файлы данных доступными для каждой ссылки DATA{}, ранее оценённой другими функциями, предоставляемыми этим модулем. Файлы данных могут быть извлечены из одного из шаблонов URL, указанных в переменной ExternalData_URL_TEMPLATES, или могут быть найдены локально в одном из путей, указанных в переменной ExternalData_OBJECT_STORES.

Добавлена в версии 3.20: Аргумент SHOW_PROGRESS может быть передан для подавления информации о процессе во время загрузки объектов. Если не указано, по умолчанию используется OFF для генераторов Ninja и Ninja Multi-Config и ON в остальных случаях.

Как правило, для управления всеми внешними данными в проекте требуется только одна цель. Вызовите эту функцию один раз в конце конфигурации после обработки всех ссылок на данные.

Переменные модуля

Следующие переменные конфигурируют поведение. Их следует установить до вызова любой из функций, предоставляемых этим модулем.

ExternalData_BINARY_ROOT

Переменная ExternalData_BINARY_ROOT может быть установлена в каталог для хранения реальных файлов данных, названных расширенными ссылками DATA{}. Значение по умолчанию — CMAKE_BINARY_DIR. Структура каталогов будет зеркалить ссылки на содержимое в ExternalData_SOURCE_ROOT.

ExternalData_CUSTOM_SCRIPT_<key>

Добавлена в версии 3.2.

Укажите полный путь к пользовательскому скрипту получения .cmake, идентифицируемому по <key> в элементах списка ExternalData_URL_TEMPLATES. См. Пользовательские скрипты получения.

ExternalData_LINK_CONTENT

Переменная ExternalData_LINK_CONTENT может быть установлена в имя поддерживаемого алгоритма хеширования для включения автоматического преобразования реальных файлов данных, на которые ссылается синтаксис DATA{}, в ссылки на содержимое. Для каждой такой ссылки <file> создаётся ссылка на содержимое с именем <file><ext>. Исходный файл переименовывается в формат .ExternalData_<algo>_<hash> для подготовки к будущей передаче в одно из местоположений в списке шаблонов URL (методами, не входящими в область действия этого модуля). Правило извлечения данных, созданное для ссылки на содержимое, будет использовать подготовленный объект, если его нельзя найти с помощью шаблона URL.

ExternalData_NO_SYMLINKS

Добавлена в версии 3.3.

Реальные файлы данных, на которые ссылаются расширенные ссылки DATA{}, могут быть доступны под ExternalData_BINARY_ROOT с помощью символических ссылок на некоторых платформах. Переменная ExternalData_NO_SYMLINKS может быть установлена для отключения использования символических ссылок и включения использования копий вместо них.

ExternalData_OBJECT_STORES

Переменная ExternalData_OBJECT_STORES может быть установлена в список локальных каталогов, хранящих объекты с макетом <dir>/%(algo)/%(hash). Эти каталоги будут просматриваться в первую очередь для поиска нужного объекта. Если объект недоступен ни в одном хранилище, он будет извлечён удалённо с помощью шаблонов URL и добавлен в первое хранилище локальных данных в списке. Если хранилища не указаны, значение по умолчанию — расположение внутри дерева сборки.

ExternalData_SERIES_PARSE
ExternalData_SERIES_PARSE_PREFIX
ExternalData_SERIES_PARSE_NUMBER
ExternalData_SERIES_PARSE_SUFFIX
ExternalData_SERIES_MATCH

См. Ссылка на серии файлов.

ExternalData_SOURCE_ROOT

Переменная ExternalData_SOURCE_ROOT может быть установлена в самый верхний каталог исходных кодов, содержащий любой путь, указанный в ссылке DATA{}. Значение по умолчанию — CMAKE_SOURCE_DIR. ExternalData_SOURCE_ROOT и CMAKE_SOURCE_DIR должны ссылаться на каталоги внутри одного исходного дистрибутива (например, они вместе входят в один архив).

ExternalData_TIMEOUT_ABSOLUTE

Переменная ExternalData_TIMEOUT_ABSOLUTE устанавливает абсолютный таймаут загрузки в секундах, по умолчанию — 300 секунд. Установите в 0 для отключения.

ExternalData_TIMEOUT_INACTIVITY

Переменная ExternalData_TIMEOUT_INACTIVITY устанавливает таймаут бездействия загрузки в секундах, по умолчанию — 60 секунд. Установите в 0 для отключения.

ExternalData_URL_ALGO_<algo>_<key>

Добавлена в версии 3.3.

Укажите пользовательский компонент URL, который будет заменён на заполнитель шаблона URL вида %(algo:<key>), где <key> — допустимый идентификатор C, при загрузке объекта, на который ссылается алгоритм хеширования <algo>. Если не определено, по умолчанию используется просто <algo> для любого <key>.

ExternalData_URL_TEMPLATES

Переменная ExternalData_URL_TEMPLATES может быть установлена для предоставления списка шаблонов URL с использованием заполнительных параметров %(algo) и %(hash) в каждом шаблоне. Правила загрузки данных пытаются использовать каждый шаблон URL в порядке, подставляя имя алгоритма хеширования для %(algo) и значение хеша для %(hash). В качестве альтернативы можно использовать %(algo:<key>) с ExternalData_URL_ALGO_<algo>_<key> переменными для большей гибкости в удалённых URL.

Ссылка на файлы

Ссылка на отдельные файлы

Синтаксис DATA{} является буквальным, а <name> — это полный или относительный путь внутри дерева исходных кодов. Дерево исходных кодов должно содержать либо реальный файл данных по адресу <name>, либо «ссылку на содержимое» по адресу <name><ext>, содержащую хеш реального файла с использованием алгоритма хеширования, соответствующего <ext>. Например, аргумент DATA{img.png} может быть удовлетворён либо реальным файлом img.png в текущем каталоге исходных кодов, либо файлом img.png.md5, содержащим его сумму MD5.

Новое в версии 3.8: Поддерживаются несколько ссылок на содержимое с одинаковым именем и разными алгоритмами хеширования (например, img.png.sha256 и img.png.sha1), при условии, что все они соответствуют одному реальному файлу. Это позволяет извлекать объекты из источников, индексированных различными алгоритмами хеширования.

Ссылка на серию файлов

Синтаксис DATA{} может быть настроен для извлечения серии файлов с помощью формы DATA{<name>,:}, где : является литералом. Если дерево источника содержит группу файлов или ссылок на содержимое, названные как серия, то ссылка на один член добавляет правила для извлечения всех из них. Хотя все члены серии извлекаются, только файл, изначально названный аргументом DATA{}, подставляется вместо него. По умолчанию конфигурация распознает имена серий, заканчивающиеся на #.ext, _#.ext, .#.ext или -#.ext, где # — последовательность десятичных цифр, а .ext — любой одиночный расширение.

ExternalData_SERIES_PARSE = regex of the form (<number>)(<suffix>)$

Для более сложных случаев задайте:

ExternalData_SERIES_PARSE = regex with at least two () groups
ExternalData_SERIES_PARSE_PREFIX = <prefix> regex group number, if any
ExternalData_SERIES_PARSE_NUMBER = <number> regex group number
ExternalData_SERIES_PARSE_SUFFIX = <suffix> regex group number

Настройка соответствия номерам серии с помощью регулярного выражения, которое соответствует части <number> членов серии, названных <prefix><number><suffix>:

ExternalData_SERIES_MATCH = regex matching <number> in all series members

Обратите внимание, что <suffix> серии не включает расширение алгоритма хеширования.

Ссылка на связанные файлы

Синтаксис DATA{} может альтернативно сопоставлять файлы, связанные с файлом с заданным именем и находящиеся в той же директории. Связанные файлы могут быть указаны с помощью опций, используя синтаксис DATA{<name>,<opt1>,<opt2>,...}. Каждая опция может указать один файл по имени или указать регулярное выражение для сопоставления имён файлов, используя синтаксис REGEX:<regex>. Например, аргументы:

DATA{MyData/MyInput.mhd,MyInput.img}                   # File pair
DATA{MyData/MyFrames00.png,REGEX:MyFrames[0-9]+\\.png} # Series

будут переданы MyInput.mha и MyFrames00.png в командную строку, но обеспечат наличие связанных файлов рядом с ними.

Ссылка на директории

Синтаксис DATA{} может ссылаться на директорию с использованием косой черты в конце и списка связанных файлов. Форма DATA{<name>/,<opt1>,<opt2>,...} добавляет правила для извлечения любых файлов в директории, которые соответствуют одной из опций связанных файлов. Например, аргумент DATA{MyDataDir/,REGEX:.*} передаст полный путь к директории MyDataDir в командную строку и гарантирует, что директория содержит файлы, соответствующие каждому файлу или ссылке на содержимое в директории источника MyDataDir.

Новое в версии 3.3: Для сопоставления связанных файлов в поддиректориях укажите опцию RECURSE:, например DATA{MyDataDir/,RECURSE:,REGEX:.*}.

Алгоритмы хеширования

Поддерживаются следующие алгоритмы хеширования:

%(algo)     <ext>     Description
-------     -----     -----------
MD5         .md5      Message-Digest Algorithm 5, RFC 1321
SHA1        .sha1     US Secure Hash Algorithm 1, RFC 3174
SHA224      .sha224   US Secure Hash Algorithms, RFC 4634
SHA256      .sha256   US Secure Hash Algorithms, RFC 4634
SHA384      .sha384   US Secure Hash Algorithms, RFC 4634
SHA512      .sha512   US Secure Hash Algorithms, RFC 4634
SHA3_224    .sha3-224 Keccak SHA-3
SHA3_256    .sha3-256 Keccak SHA-3
SHA3_384    .sha3-384 Keccak SHA-3
SHA3_512    .sha3-512 Keccak SHA-3

Новое в версии 3.8: Добавлены алгоритмы хеширования SHA3_*.

Обратите внимание, что хеши используются только для уникальной идентификации данных и проверки загрузки.

Пользовательские скрипты извлечения данных

Новое в версии 3.2.

Когда файл данных необходимо извлечь из одного из шаблонов URL, указанных в переменной ExternalData_URL_TEMPLATES, он обычно загружается с помощью команды file(DOWNLOAD). Можно указать использование пользовательского скрипта извлечения, используя шаблон URL вида ExternalDataCustomScript://<key>/<loc>. <key> должен быть идентификатором C, а <loc> должен содержать заполнитель %(algo) и %(hash). Переменная, соответствующая ключу ExternalData_CUSTOM_SCRIPT_<key>, должна быть установлена в полный путь к файлу скрипта .cmake. Скрипт будет включен для выполнения фактического извлечения и получит доступ к следующим переменным:

ExternalData_CUSTOM_LOCATION

При загрузке пользовательского скрипта эта переменная устанавливается в часть URL, которая будет содержать имя алгоритма хеширования и значение хеша содержимого.

ExternalData_CUSTOM_FILE

При загрузке пользовательского скрипта эта переменная устанавливается в полный путь к файлу, в котором скрипт должен сохранить извлеченное содержимое. Имя файла не задано и не должно интерпретироваться каким-либо образом.

Ожидается, что пользовательский скрипт извлечения сохранит извлеченное содержимое в файле или установит переменную:

ExternalData_CUSTOM_ERROR

Если пользовательский скрипт извлечения не может извлечь запрашиваемое содержимое, он должен установить эту переменную в короткое сообщение в одну строку, описывающее причину ошибки.

© 2000–2024 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.27/module/ExternalData.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API