Spec-Zone.ru › CMake 3.13

FindMatlab

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

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

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

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

  • MX_LIBRARY, ENG_LIBRARY и MAT_LIBRARY: соответственно библиотеки MX, ENG и MAT Matlab
  • ENGINE_LIBRARY, DATAARRAY_LIBRARY: соответственно библиотеки MatlabEngine и MatlabDataArray Matlab (Matlab 2018a и более поздние версии)
  • MAIN_PROGRAM программу Matlab. Обратите внимание, что этот компонент недоступен в версии MCR и вызовет ошибку, если найден MCR вместо обычной установки Matlab.
  • 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 (массивы). Доступна только если запрошен компонент MX_LIBRARY.
Matlab_ENG_LIBRARY
библиотека движка Matlab. Доступна только если запрошен компонент ENG_LIBRARY.
Matlab_MAT_LIBRARY
библиотека матриц Matlab. Доступна только если запрошен компонент MAT_LIBRARY.
Matlab_ENGINE_LIBRARY
библиотека движка Matlab C++. Доступна только если запрошен компонент ENGINE_LIBRARY.
Matlab_DATAARRAY_LIBRARY
библиотека массивов данных Matlab C++. Доступна только если запрошен компонент DATAARRAY_LIBRARY.
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, для возможности запуска тестов на этом 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 ...]
    [...]
)
NAME
имя цели.
SRC
список исходных файлов.
LINK_TO
список дополнительных зависимостей линковки. Цель ссылается на libmex по умолчанию. Если Matlab_MX_LIBRARY определено, она также ссылается на libmx
OUTPUT_NAME
если задано, переопределяет имя по умолчанию. Имя по умолчанию - это имя цели без префикса и с Matlab_MEX_EXTENSION расширением.
DOCUMENTATION
если задано, файл file.txt будет рассматриваться как файл документации для файла MEX. Этот файл копируется в ту же папку без обработки с тем же именем, что и конечный файл mex, и с расширением .m. В этом случае, набрав help <name> в Matlab, отображается документация, содержащаяся в этом файле.
MODULE or SHARED may be given to specify the type of library to be
создано. EXECUTABLE может быть указано для создания исполняемого файла вместо библиотеки. Если тип не указан явно, тип является SHARED

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

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

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

Spec-Zone.ru

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