Spec-Zone.ru › CMake 3.12

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
  • MAIN_PROGRAM — программа Matlab. Обратите внимание, что этот компонент недоступен в версии MCR и вызовет ошибку, если обнаружен MCR вместо обычной установки Matlab.
  • MEX_COMPILER — компилятор MEX.
  • 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_LIBRARIES
весь набор библиотек Matlab
Matlab_MEX_COMPILER
компилятор mex Matlab. В настоящее время не используется. Доступна только если запрошен компонент MEX_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 перед запуском теста.
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

Добавляет цель 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 ...]
    [...]
)
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.12/module/FindMatlab.html

Spec-Zone.ru

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