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–2024 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.30/module/ExternalData.html