Spec-Zone.ru › CMake

FindMatlab

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

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

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

Добавлен в версии 3.12: Поддержка Matlab Compiler Runtime (MCR).

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

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

Добавлен в версии 3.7: Добавлен компонент MAT_LIBRARY.

Добавлен в версии 3.13: Добавлены компоненты ENGINE_LIBRARY, DATAARRAY_LIBRARY и MCC_COMPILER.

Изменено в версии 3.14: Удалены компоненты MX_LIBRARY, ENGINE_LIBRARY и DATAARRAY_LIBRARY. Эти библиотеки находятся безусловно.

Добавлен в версии 3.30: Добавлена поддержка указания диапазона версий для find_package() и добавлена поддержка указания REGISTRY_VIEW для find_package(), matlab_extract_all_installed_versions_from_registry() и matlab_get_all_valid_matlab_roots_from_registry(). По умолчанию поведение осталось неизменным, используя вид реестра TARGET.

Примечание

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

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

  • Windows: Установленные версии Matlab/MCR извлекаются из реестра Windows. Аргумент REGISTRY_VIEW может быть указан для ручного управления поиском 32-разрядных или 64-разрядных версий.
  • macOS: Установленные версии Matlab/MCR определяются по стандартным путям установки MATLAB в $HOME/Applications и /Applications. Если такое приложение не найдено, то используется приложение, доступное из 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

Добавлен в версии 3.25.

Значение по умолчанию для Matlab_ROOT_DIR, корня установки Matlab.

Matlab_ROOT_DIR

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

MATLAB_FIND_DEBUG

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

MATLAB_ADDITIONAL_VERSIONS

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

Импортированные цели

Добавлен в версии 3.22.

Этот модуль определяет следующие IMPORTED цели:

Matlab::mex

Библиотека mex, всегда доступная для установок MATLAB. Доступна для установок MCR, если она предоставлена MCR.

Matlab::mx

Библиотека mx Matlab (массивы), всегда доступная для установок MATLAB. Доступна для установок MCR, если она предоставлена MCR.

Matlab::eng

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

Matlab::mat

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

Matlab::MatlabEngine

Библиотека Matlab C++ engine, всегда доступна для MATLAB R2018a и новее. Доступна для установок MCR, если она предоставлена MCR.

Matlab::MatlabDataArray

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

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

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

Matlab_FOUND

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

Matlab_VERSION

Добавлена в версии 3.27.

числовая версия (например, 23.2.0) найденного MATLAB. Не следует путать с именем выпуска MATLAB (например, R2023b), которое можно получить с помощью matlab_get_release_name_from_version().

Matlab_ROOT_DIR

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

Matlab_MAIN_PROGRAM

бинарная программа MATLAB. Доступна только если компонент MAIN_PROGRAM задан в директиве find_package().

Matlab_INCLUDE_DIRS

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

Matlab_MEX_LIBRARY

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

Matlab_MX_LIBRARY

библиотека mx MATLAB (массивы), всегда доступна для установок MATLAB. Доступна для установок MCR, если предоставлена MCR.

Matlab_ENG_LIBRARY

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

Matlab_MAT_LIBRARY

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

Matlab_ENGINE_LIBRARY

Добавлена в версии 3.13.

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

Matlab_DATAARRAY_LIBRARY

Добавлена в версии 3.13.

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

Matlab_LIBRARIES

полный набор библиотек MATLAB

Matlab_MEX_COMPILER

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

Matlab_MCC_COMPILER

Добавлена в версии 3.13.

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

Переменные кэша

Matlab_MEX_EXTENSION

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

Matlab_ROOT_DIR

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

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

matlab_get_version_from_release_name()

возвращает версию по имени выпуска MATLAB

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 и вам необходимо запустить модульные тесты для этого 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_get_version_from_release_name(release version)
  • Вход: release — имя выпуска (например, R2023b)
  • Выход: version — версия MATLAB (например, 23.2.0)

Возвращает версию MATLAB по имени выпуска.

Примечание

Эта команда предоставляет правильные сопоставления версий для MATLAB, но не для MCR.

matlab_get_release_name_from_version
matlab_get_release_name_from_version(version release_name)
  • Вход: version — версия MATLAB (например, 23.2.0)
  • Выход: release_name — имя выпуска (R2023b)

Возвращает имя выпуска по версии MATLAB.

Примечание

Эта команда предоставляет правильные сопоставления версий для MATLAB, но не для MCR.

END_OF_DOCUMENT_MARKER
matlab_extract_all_installed_versions_from_registry

Эта функция анализирует реестр Windows и находит установленные версии Matlab. Найденные версии хранятся в matlab_versions.

matlab_extract_all_installed_versions_from_registry(matlab_versions [REGISTRY_VIEW view])

Добавлена в версии 3.30.

  • Вывод: matlab_versions — это список всех найденных версий Matlab
  • Вход: REGISTRY_VIEW — необязательный вид реестра для взаимодействия с ним. Аргумент передаётся (или опускается) в cmake_host_system_information() без дополнительных проверок или модификаций.
matlab_extract_all_installed_versions_from_registry(win64 matlab_versions)
  • Вход: win64 — булево значение для поиска 64-битной версии Matlab. Установите ON для использования 64-битного вида реестра или OFF для использования 32-битного вида реестра. Для более точного управления см. подпись выше.
  • Вывод: matlab_versions — список всех найденных версий Matlab

Возвращаемый список содержит все версии в HKLM\SOFTWARE\Mathworks\MATLAB, HKLM\SOFTWARE\Mathworks\MATLAB Runtime и HKLM\SOFTWARE\Mathworks\MATLAB Compiler 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 [REGISTRY_VIEW view])
  • Вход: matlab_versions каждой из установок Matlab или MCR
  • Вывод: matlab_roots местоположения каждой из установок Matlab или MCR
  • Вход: REGISTRY_VIEW — необязательный вид реестра для взаимодействия с ним. Аргумент передаётся (или опускается) в cmake_host_system_information() без дополнительных проверок или модификаций.

Добавлена в версии 3.30: Аргумент REGISTRY_VIEW добавлен для более точного взаимодействия с реестром Windows.

matlab_get_mex_suffix

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

matlab_get_mex_suffix(matlab_root mex_suffix)
  • Вход: matlab_root корень установки Matlab/MCR, например, Matlab_ROOT_DIR
  • Вывод: 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 задан, файл скрипта unit-теста должен содержать скрипт для выполнения, а также команду выхода со значением выхода. Это значение выхода будет передано в фреймворк 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

имя unit-теста в ctest.

UNITTEST_FILE

файл скрипта Matlab unit-теста. Его путь будет автоматически добавлен в путь 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

при установке указывает, что тест не должен использовать фреймворк unit-тестов 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]
    [NO_IMPLICIT_LINK_TO_MATLAB_LIBRARIES]
    [...]
)

Параметры функции:

NAME

имя цели.

SRC

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

LINK_TO

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

OUTPUT_NAME

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

DOCUMENTATION

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

R2017b or R2018a

Добавлена в версии 3.14.

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

MODULE or SHARED

Добавлена в версии 3.7.

Может быть указан для указания типа создаваемой библиотеки.

EXECUTABLE

Добавлена в версии 3.7.

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

EXCLUDE_FROM_ALL

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

NO_IMPLICIT_LINK_TO_MATLAB_LIBRARIES

Добавлена в версии 3.24.

Этот параметр позволяет отключить автоматическую линковку библиотек MATLAB, так что линковаться будут только те библиотеки, которые фактически требуются, посредством параметра LINK_TO.

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

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

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

Spec-Zone.ru

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