Spec-Zone.ru › CMake 3.18

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 и вызовет ошибку, если найден 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 (массивы), всегда доступна.

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, и для выполнения юнит-тестов на этом 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 для юнит-тестов (по умолчанию, доступен начиная с Matlab 2013b+), если не указана опция NO_UNITTEST_FRAMEWORK.

Функция ожидает один файл скрипта теста Matlab. В случае, если NO_UNITTEST_FRAMEWORK указан, файл скрипта юнит-теста должен содержать скрипт для выполнения, плюс команду выхода со значением выхода. Это значение выхода будет передано в фреймворк 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. Его путь будет автоматически добавлен в путь 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 перед запуском юнит-теста.

MATLAB_ADDITIONAL_STARTUP_OPTIONS

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

TEST_ARGS

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

NO_UNITTEST_FRAMEWORK

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

Spec-Zone.ru

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