Мы используем последнюю версию CMake (3.17), пытаясь скомпилировать файл .m
верхнего уровня в исполняемый файл на Matlab 2015b
Я сделал
find_package(Matlab OPTIONAL_COMPONENTS MEX_COMPILER MCC_COMPILER)
и он находит Matlab. Я могу создавать MEX-файлы, используя matlab_add_mex()
(и обращаться к ним из matlab), но следующий шаг - взять файл верхнего уровня .m
и скомпилировать его в исполняемый файл, чтобы его можно было отправить на вычислительную ферму. запустить очень большие входные векторы.
В командной строке мы просто делаем mcc -m simulation.m -I <required include paths> etc
, и это работает. Я хочу, чтобы это работало в нашей среде сборки CMake с правильно рассчитанными зависимостями (насколько я могу)
Полагаю, мне нужно использовать add_custom_command()
, как указано здесь (https://gitlab.kitware.com/cmake/cmake/issues/18183 ), и я предполагаю, что мне нужно правильно рассчитать зависимости.
Используя эту строку cme.exe
, я могу получить зависимости в файл:
matlab -wait -nosplash -nojvm -nodesktop -r "[fList,~] = matlab.codetools.requiredFilesAndProducts('simulation.m');;for file = fList;fprintf(2,'%s\n',file{:});end;exit" -logfile output.txt
Есть ли лучший способ сделать это? Это заканчивает тем, что запускает matlab и блокирует вывод в файл, а не в stdout или что-то еще. Это тоже чертовски медленно запускаться.
Я собираюсь написать сценарий python или C, который встраивает matlab, который получает информацию, затем печатает ее в стандартный вывод или просто использует mcc
на сценарий, который должен рассчитывать зависимости, но это кажется действительно, действительно замысловатым для чего-то, что кажется стандартным шагом в любом повторяемом процессе сборки.
Итак, есть указатели? Я не могу найти способ получить зависимости, кроме как внутри командной строки matlab, и я надеюсь, что CMake имеет m-> exe (в дополнение к mex) в своей рубке.
fwiw, я взял следующее и поместил его в файл get_dependencies.m
:
function print_dependencies(filename)
[fList,~] = matlab.codetools.requiredFilesAndProducts(filename)
for file = fList
fprintf(1,'%s\n',file{:})
end
end
и скомпилировал его, используя
mcc -m get_dependencies.m
И когда он запустится, он скулит о неопределенных переменных:
Undefined variable "matlab" or class "matlab.codetools.requiredFilesAndProducts".