CMake для компиляции файла Matlab .m в .exe с помощью MCC - PullRequest
2 голосов
/ 02 мая 2020

Мы используем последнюю версию 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".
...