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
Обратите внимание, что имя серии не включает в себя расширение алгоритма хеширования.
Ссылка на связанные файлы
Синтаксис 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.29/module/ExternalData.html