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 [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>. Если не определено, компонент 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.
Новое в версии 3.8: Поддерживаются несколько ссылок на контент с одинаковым именем и разными алгоритмами хеширования (например, 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.
Новое в версии 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–2021 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.21/module/ExternalData.html