FindMatlab
Находит установленные инсталляции MATLAB и предоставляет инструменты и библиотеки MATLAB для cmake.
Основной задачей этого пакета является нахождение библиотек, связанных с MATLAB, для возможности построения расширений MATLAB (файлы mex). Он также может быть использован для:
- выполнения определенных команд в MATLAB
- определения тестов единиц MATLAB
- получения различной информации из MATLAB (расширения mex, версии и запросы релизов, …)
Модуль поддерживает следующие компоненты:
-
MX_LIBRARY,ENG_LIBRARYиMAT_LIBRARY: соответственно библиотеки MX, ENG и MAT MATLAB -
MAIN_PROGRAMпрограмма бинарного исполняемого файла 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 извлекаются из реестра Windows
- OS X: Установленные версии MATLAB задаются путями MATLAB в
/Application. Если такое приложение не найдено, оно возвращается к тому, которое может быть доступно из PATH. - Unix: Желаемый MATLAB должен быть доступен из PATH.
Дополнительная информация предоставляется, когда переменная MATLAB_FIND_DEBUG установлена. Когда бинарный файл MATLAB найден автоматически, и MATLAB_VERSION не указан, версия запрашивается непосредственно у MATLAB. В Windows это может привести к появлению окна, в котором запущен MATLAB.
Сопоставление имен релизов и версии 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 Engine. Доступна только если компонент
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 в соответствии с ранее заданным списком. Сохраняются только существующие/доступные пути. Это в основном полезно для поиска всех возможных установок MATLAB.
-
matlab_get_mex_suffix() - возвращает суффикс, который должен быть использован для файлов mex (зависит от платформы/архитектуры).
-
matlab_get_version_from_matlab_run() - возвращает версию MATLAB, учитывая полный каталог программы MATLAB.
Известные проблемы
- Столкновение символов в целевом MEX-файле
-
По умолчанию, все символы внутри файла MEX, определенного с помощью команды
matlab_add_mex(), имеют скрытую видимость, за исключением точки входа. Это поведение по умолчанию компилятора MEX, которое снижает риск столкновения символов между библиотеками, поставляемыми с MATLAB, и библиотеками, с которыми связан файл MEX. Это также поведение по умолчанию для платформ Windows.Однако этого недостаточно в некоторых случаях, например, когда ваш файл MEX связан с библиотеками, которые уже загружены MATLAB, даже если у этих библиотек разные SONAME. Возможным решением является скрытие символов библиотек, с которыми связан целевой 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или пустой список в случае ошибки (или ничего не найдено).Примечание
Предоставляются только версии. Проверка существования указанной в реестре установки не выполняется.
-
matlab_get_all_valid_matlab_roots_from_registry -
Заполняет корень Matlab допустимыми версиями Matlab. Возвращаемый matlab_roots организован парами
(version_number,matlab_root_path).matlab_get_all_valid_matlab_roots_from_registry( matlab_versions matlab_roots)-
matlab_versions - версии каждой из установок Matlab
-
matlab_roots - местоположение каждой из установок Matlab
-
-
matlab_get_mex_suffix -
Возвращает расширение файлов mex (суффиксы). Эту функцию не следует вызывать до того, как будет найден соответствующий корень Matlab.
matlab_get_mex_suffix( matlab_root mex_suffix)-
matlab_root - корень установки Matlab
-
mex_suffix - имя переменной, в которую будет возвращён суффикс.
-
-
matlab_get_version_from_matlab_run -
Эта функция запускает программу Matlab, указанную в аргументах, и извлекает её версию.
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. Тест использует фреймворк 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_MATLAB_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 unittest. Его путь будет автоматически добавлен в путь Matlab.
-
CUSTOM_MATLAB_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 -
Добавляет целевой 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.9/module/FindMatlab.html