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>. Если не определено, по умолчанию используется просто<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–2022 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.23/module/ExternalData.html