Spec-Zone.ru › CMake 3.16

FindMatlab

Находит Matlab или Matlab Compiler Runtime (MCR) и предоставляет инструменты, библиотеки и компиляторы Matlab для CMake.

Основное назначение этого пакета — найти библиотеки, связанные с Matlab или MCR, чтобы иметь возможность создавать расширения Matlab (файлы mex). Его также можно использовать для:

  • выполнения определённых команд в Matlab, если Matlab доступен
  • объявления тестов Matlab
  • получения различной информации из Matlab (расширения mex, версии и запросы релизов, …)

Модуль поддерживает следующие компоненты:

  • ENG_LIBRARY и MAT_LIBRARY: соответственно библиотеки ENG и MAT Matlab
  • MAIN_PROGRAM исполняемый файл Matlab. Обратите внимание, что этот компонент недоступен в версии MCR и вызовет ошибку, если вместо обычной установки Matlab будет обнаружен MCR.
  • MEX_COMPILER компилятор MEX.
  • MCC_COMPILER компилятор MCC, включённый в дополнение Matlab Compiler.
  • SIMULINK среду Simulink.

Примечание

Версия, предоставляемая директиве find_package(), — это версия Matlab, которую не следует путать с именем релиза Matlab (например, R2014). matlab_get_version_from_release_name() и matlab_get_release_name_from_version() обеспечивают сопоставление между именем релиза и версией.

Переменная Matlab_ROOT_DIR может быть указана для указания пути к нужной версии Matlab. В противном случае поведение зависит от платформы:

  • Windows: Установленные версии Matlab/MCR извлекаются из реестра Windows
  • OS X: Установленные версии Matlab/MCR задаются по умолчанию для путей установки MATLAB в /Application. Если такое приложение не найдено, поиск переходит к приложению, которое может быть доступно из PATH.
  • Unix: Требуемый Matlab должен быть доступен из PATH. Это не работает для установки MCR, и Matlab_ROOT_DIR необходимо указать на этой платформе.

Дополнительная информация предоставляется при установке MATLAB_FIND_DEBUG. При автоматическом обнаружении установки Matlab/MCR и отсутствии значения MATLAB_VERSION, версия запрашивается непосредственно у Matlab (в Windows это может вызвать окно Matlab) или из установки MCR.

Сопоставление имён релизов и версии Matlab выполняется путём определения пар (имя, версия). Переменная MATLAB_ADDITIONAL_VERSIONS может быть предоставлена перед вызовом find_package() для обработки дополнительных версий.

Сценарии Matlab можно добавить в набор тестов с помощью matlab_add_unit_test(). По умолчанию для выполнения этого скрипта будет использоваться фреймворк тестов Matlab (>= 2013a), но также можно использовать обычные файлы .m с возвращаемым кодом выхода (0 указывает на успех).

Переменные ввода модуля

Пользователи или проекты могут установить следующие переменные для настройки поведения модуля:

Matlab_ROOT_DIR

корень установки Matlab.

MATLAB_FIND_DEBUG

выводит отладочную информацию

MATLAB_ADDITIONAL_VERSIONS

дополнительные версии Matlab для автоматического извлечения установленных версий.

Переменные, определённые модулем

Переменные результатов

Matlab_FOUND

TRUE если установка Matlab найдена, FALSE в противном случае. Все переменные ниже определены, если Matlab найден.

Matlab_ROOT_DIR

конечный корень установки Matlab, определённый модулем FindMatlab.

Matlab_MAIN_PROGRAM

исполняемый файл Matlab. Доступен только если компонент MAIN_PROGRAM указан в директиве find_package().

Matlab_INCLUDE_DIRS

путь к заголовкам библиотек Matlab

Matlab_MEX_LIBRARY

библиотека для mex, всегда доступна.

Matlab_MX_LIBRARY

библиотека mx Matlab (массивы), всегда доступна.

Matlab_ENG_LIBRARY

библиотека движка Matlab. Доступна только если запрошен компонент ENG_LIBRARY.

Matlab_MAT_LIBRARY

библиотека матриц Matlab. Доступна только если запрошен компонент MAT_LIBRARY.

Matlab_ENGINE_LIBRARY

библиотека движка Matlab C++, всегда доступна для R2018a и более новых версий.

Matlab_DATAARRAY_LIBRARY

библиотека массивов данных Matlab C++, всегда доступна для R2018a и более новых версий.

Matlab_LIBRARIES

весь набор библиотек Matlab

Matlab_MEX_COMPILER

компилятор mex Matlab. В настоящее время не используется. Доступен только если запрошен компонент MEX_COMPILER.

Matlab_MCC_COMPILER

компилятор mcc Matlab. Включён в дополнение Matlab Compiler. Доступен только если запрошен компонент MCC_COMPILER.

Кэшированные переменные

Matlab_MEX_EXTENSION

расширение файлов mex для текущей платформы (указанное Matlab).

Matlab_ROOT_DIR

местоположение корня найденной установки Matlab. Если это значение изменено пользователем, переменные результата пересчитываются.

Предоставленные макросы

matlab_get_version_from_release_name()

возвращает версию по имени релиза

matlab_get_release_name_from_version()

возвращает имя релиза по версии Matlab

Предоставленные функции

matlab_add_mex()

добавляет цель, компилирующую файл MEX.

matlab_add_unit_test()

добавляет файл теста Matlab как тест в проект.

matlab_extract_all_installed_versions_from_registry()

парсит реестр для всех версий Matlab. Доступно только в Windows. Часть реестра, которая анализируется, зависит от процессора хоста

matlab_get_all_valid_matlab_roots_from_registry()

возвращает все возможные пути к Matlab или MCR, согласно ранее заданному списку. Сохраняются только существующие/доступные пути. Это главным образом полезно для поиска всех возможных установок Matlab.

matlab_get_mex_suffix()

возвращает суффикс, который должен использоваться для файлов mex (зависит от платформы/архитектуры)

matlab_get_version_from_matlab_run()

возвращает версию Matlab/MCR, учитывая полный путь к установке Matlab/MCR.

Известные проблемы

Столкновение символов в целевом MEX-файле

По умолчанию все символы внутри файла MEX, определенного командой matlab_add_mex(), имеют скрытую видимость, за исключением точки входа. Это стандартное поведение компилятора MEX, которое снижает риск столкновения символов между библиотеками, поставляемыми с Matlab, и библиотеками, к которым ссылается файл MEX. Это также стандартное поведение на платформах Windows.

Однако этого недостаточно в некоторых случаях, когда, например, ваш MEX-файл ссылается на библиотеки, которые уже загружены Matlab, даже если у этих библиотек разные SONAMES. Возможным решением является скрытие символов библиотек, к которым ссылается целевой MEX-файл. Это можно сделать в компиляторах GNU GCC с опцией компоновщика -Wl,--exclude-libs,ALL.

Тесты с использованием ресурсов GPU

Если ваш MEX-файл использует GPU, а для выполнения unit-тестов этого MEX-файла необходимо правильно освободить ресурсы GPU в Matlab. Возможным решением является информирование Matlab об использовании ресурсов GPU в сеансе, что можно выполнить с помощью команды D = gpuDevice() в начале скрипта теста (или через фикстуру).

Справочник

Matlab_ROOT_DIR

Корневая папка установки Matlab. Если установлена до вызова find_package(), модуль будет искать компоненты в этом пути. Если не установлена, то будет произведён автоматический поиск Matlab. Если установлена, она должна указывать на корректную версию Matlab.

MATLAB_FIND_DEBUG

Если установлено, поиск Matlab и промежуточные этапы конфигурации будут выведены в консоль.

MATLAB_ADDITIONAL_VERSIONS

Если установлено, указывает на дополнительные версии Matlab, которые могут быть найдены. Переменная должна быть списком строк, организованных по парам имя релиза и версии, как показано ниже:

set(MATLAB_ADDITIONAL_VERSIONS
    "release_name1=corresponding_version1"
    "release_name2=corresponding_version2"
    ...
    )

Пример:

set(MATLAB_ADDITIONAL_VERSIONS
    "R2013b=8.2"
    "R2013a=8.1"
    "R2012b=8.0")

Порядок элементов в этом списке важен, когда установлено несколько версий Matlab. Приоритет устанавливается в соответствии с порядком в этом списке.

matlab_get_version_from_release_name

Возвращает версию Matlab (17.58) по имени релиза (R2017k)

matlab_get_release_name_from_version

Возвращает имя релиза (R2017k) по версии Matlab (17.58)

matlab_extract_all_installed_versions_from_registry

Эта функция анализирует реестр и находит установленные версии Matlab. Найденные версии возвращаются в matlab_versions. Установите win64 на TRUE, если необходимо искать 64-битную версию Matlab. Возвращаемый список содержит все версии под HKLM\\SOFTWARE\\Mathworks\\MATLAB и HKLM\\SOFTWARE\\Mathworks\\MATLAB Runtime или пустой список в случае ошибки (или ничего не найдено).

Примечание

Предоставляются только версии. Проверка существования установки, указанной в реестре, не выполняется.

matlab_get_all_valid_matlab_roots_from_registry

Заполняет корневой каталог Matlab корректными версиями Matlab или Matlab Runtime (MCR). Возвращаемый matlab_roots организован в тройки (type,version_number,matlab_root_path), где type указывает либо MATLAB либо MCR.

matlab_get_all_valid_matlab_roots_from_registry(
    matlab_versions
    matlab_roots)
matlab_versions

версии каждой из установок Matlab или MCR

matlab_roots

местоположение каждой из установок Matlab или MCR

matlab_get_mex_suffix

Возвращает расширение файлов mex (суффиксы). Эту функцию не следует вызывать до того, как будет найден соответствующий корневой каталог Matlab.

matlab_get_mex_suffix(
    matlab_root
    mex_suffix)
matlab_root

корень установки Matlab/MCR

mex_suffix

имя переменной, в которую будет возвращён суффикс.

matlab_get_version_from_matlab_run

Эта функция запускает программу Matlab, указанную в аргументах, и извлекает её версию. Если путь, предоставленный для установки Matlab, указывает на установку MCR, версия извлекается из установленных файлов.

matlab_get_version_from_matlab_run(
    matlab_binary_path
    matlab_list_versions)
matlab_binary_path

путь к исполняемому файлу matlab

matlab_list_versions

извлечённая из Matlab версия

matlab_add_unit_test

Добавляет тест Matlab в набор тестов cmake/ctest. Эта команда требует компонента MAIN_PROGRAM и поэтому недоступна для установки MCR.

Тест использует фреймворк Matlab unittest (по умолчанию, доступен начиная с Matlab 2013b+), если не указан параметр NO_UNITTEST_FRAMEWORK.

Функция ожидает один файл скрипта Matlab для тестирования. Если указан NO_UNITTEST_FRAMEWORK, файл скрипта unittest должен содержать скрипт для запуска, а также команду выхода со значением выхода. Это значение выхода будет передано фреймворку ctest (0 — успех, отличное от 0 — неудача). Дополнительные аргументы, принимаемые add_test(), могут быть переданы через TEST_ARGS (например, CONFIGURATION <config> ...).

matlab_add_unit_test(
    NAME <name>
    UNITTEST_FILE matlab_file_containing_unittest.m
    [CUSTOM_TEST_COMMAND matlab_command_to_run_as_test]
    [UNITTEST_PRECOMMAND matlab_command_to_run]
    [TIMEOUT timeout]
    [ADDITIONAL_PATH path1 [path2 ...]]
    [MATLAB_ADDITIONAL_STARTUP_OPTIONS option1 [option2 ...]]
    [TEST_ARGS arg1 [arg2 ...]]
    [NO_UNITTEST_FRAMEWORK]
    )

Аргументы функции:

NAME

имя теста в ctest.

UNITTEST_FILE

файл Matlab unittest. Его путь будет автоматически добавлен в путь Matlab.

CUSTOM_TEST_COMMAND

команда Matlab для запуска теста. Если не указана, выполняется следующее: runtests('matlab_file_name'), exit(max([ans(1,:).Failed])), где matlab_file_name — UNITTEST_FILE без расширения.

UNITTEST_PRECOMMAND

команда Matlab, запускаемая перед файлом, содержащим тест (например, инициализация устройства GPU на основе переменных CMake).

TIMEOUT

таймаут теста в секундах. По умолчанию 180 секунд, так как тест Matlab может зависнуть.

ADDITIONAL_PATH

список путей для добавления в путь Matlab перед запуском unit-теста.

MATLAB_ADDITIONAL_STARTUP_OPTIONS

список дополнительных опций для запуска Matlab из командной строки. -nosplash -nodesktop -nodisplay всегда добавляются.

TEST_ARGS

Дополнительные опции для команды add_test. Эти опции добавляются к стандартным (например, «CONFIGURATIONS Release»)

NO_UNITTEST_FRAMEWORK

Если установлено, указывает, что тест не должен использовать фреймворк unittest Matlab (доступно для версий >= R2013a).

WORKING_DIRECTORY

Это будет рабочая директория для теста. Если указана, она также будет директорией вывода для файла журнала запуска теста. Если не указана, временная директория ${CMAKE_BINARY_DIR}/Matlab будет использоваться как рабочая директория и местоположение журнала.

matlab_add_mex

Добавляет цель Matlab MEX. Эта команда компилирует заданные исходные файлы с текущей цепочкой инструментов, чтобы создать файл MEX. Конечное имя создаваемого файла вывода может быть указано, а также дополнительные библиотеки линковки и запись документации для файла MEX. Остальные аргументы вызова передаются команде add_library() или add_executable().

matlab_add_mex(
    NAME <name>
    [EXECUTABLE | MODULE | SHARED]
    SRC src1 [src2 ...]
    [OUTPUT_NAME output_name]
    [DOCUMENTATION file.txt]
    [LINK_TO target1 target2 ...]
    [R2017b | R2018a]
    [EXCLUDE_FROM_ALL]
    [...]
)
NAME

имя цели.

SRC

список исходных файлов.

LINK_TO

список дополнительных зависимостей линковки. Цель связывается с libmex и libmx по умолчанию.

OUTPUT_NAME

Если задано, переопределяет имя по умолчанию. Имя по умолчанию — это имя цели без префикса и с суффиксом Matlab_MEX_EXTENSION.

DOCUMENTATION

Если задано, файл file.txt будет рассматриваться как файл документации для файла MEX. Этот файл копируется в ту же папку без обработки, с тем же именем, что и конечный файл mex, и с расширением .m. В этом случае, ввод help <name> в Matlab выводит документацию, содержащуюся в этом файле.

R2017b or R2018a may be given to specify the version of the C API

Для использования: R2017b задаёт традиционный (отдельный комплексный) C API и соответствует флагу -R2017b для команды mex. R2018a задаёт новый интегрированный комплексный C API и соответствует флагу -R2018a для команды mex. Игнорируется, если версия Matlab до R2018a. По умолчанию R2017b.

MODULE or SHARED may be given to specify the type of library to be

создано. EXECUTABLE может быть задано для создания исполняемого файла вместо библиотеки. Если тип не задан явно, тип SHARED.

EXCLUDE_FROM_ALL

Этот параметр имеет то же значение, что и для EXCLUDE_FROM_ALL и передаётся команде add_library() или add_executable().

Файл документации не обрабатывается и должен иметь следующий формат:

% This is the documentation
function ret = mex_target_output_name(input1)

© 2000–2020 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.16/module/FindMatlab.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API