Spec-Zone.ru › CMake 3.16

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
  )

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

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

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

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

ExternalData_BINARY_ROOT

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

ExternalData_CUSTOM_SCRIPT_<key>

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

ExternalData_LINK_CONTENT

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

ExternalData_NO_SYMLINKS

Реальные файлы данных, именуемые расширенными ссылками 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>

Укажите пользовательскую часть 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-сумму.

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

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

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

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. Для соответствия связанным файлам в поддиректориях укажите опцию 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

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

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

Когда файл данных необходимо получить из одной из шаблонов 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–2020 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.16/module/ExternalData.html

Spec-Zone.ru

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