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должны указывать на каталоги внутри одного исходного распределения (например, они поступают вместе в одном архиве tar).
-
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>. Если не определено, по умолчанию используется компонент URL<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.
Ссылка на серии файлов
Синтаксис 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
Обратите внимание, что хеши используются только для уникальной идентификации данных и проверки загрузки.
Пользовательские скрипты получения данных
Когда файл данных необходимо получить из одного из шаблонов 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.7/module/ExternalData.html