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