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