Spec-Zone.ru › CMake 3.24

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 Эти библиотеки находятся безусловно.

Примечание

Версия, заданная для директивы 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 для автоматического извлечения установленных версий.

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

Новое в версии 3.22.

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

Matlab::mex

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

Matlab::mx

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

Matlab::eng

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

Matlab::mat

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

Matlab::MatlabEngine

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

Matlab::MatlabDataArray

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

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

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

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

Новое в версии 3.13.

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

Matlab_DATAARRAY_LIBRARY

Новое в версии 3.13.

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

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_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.

Тестирование с использованием ресурсов графического процессора

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

Добавляет целевой MEX-файл MATLAB. Эта команда компилирует указанные исходные файлы с текущей цепочкой инструментов для создания 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–2022 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.24/module/FindMatlab.html

Spec-Zone.ru

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