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оборачивает команду CMakeadd_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>,...} добавляет правила для получения любых файлов в директории, соответствующих одному из связанных вариантов файла. Например, аргумент MyDataDir передаст полный путь к директории 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–2019 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.13/module/ExternalData.html