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иMATMatlab -
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