Как я могу убедиться, что Matlab mcc не создает неполные автономные исполняемые файлы?

мы используем среду сценариев для автоматической сборки, запуска и проверки автономного исполняемого файла. Мы работаем с Matlab R2010a x64. Компилятор Matlab mcc вызывается из командной строки Windows для создания автономного приложения:

mcc -m -v -w enable -I исходная_папка -I общая_папка -определенные_файлы_нам_нужна_наша_программа

Программа состоит примерно из 25 модулей (файлов .m) и использует около 5 наборов инструментов. Это работает нормально, пока доступна правильная лицензия. mcc проверяет наличие лицензии компилятора, разрешает зависимости, упаковывает все в исполняемый файл.

Однако, если лицензия не включает необходимые наборы инструментов, mcc не выдает никаких предупреждений или ошибок. Он создает исполняемый файл без наборов инструментов. Таким образом, исполняемый файл запускается, на первый взгляд кажется, что он работает, но вылетает, если достигается строка кода, требующая набора инструментов.

Я ожидаю от компилятора, что он сообщит мне об отсутствующих компонентах. Что я могу сделать, чтобы получать информацию об отсутствующих компонентах? Как я могу убедиться, что mcc не собирает неполные исполняемые файлы? Я что-то упустил в вызове mcc?

Предпочтительно, я хотел бы настроить компиляцию таким образом, чтобы она останавливалась, если чего-то не хватает.

\Цвейкекс


person Zweikeks    schedule 20.07.2016    source источник


Ответы (3)


Самый простой способ - в вашем скрипте компиляции вы можете проверить необходимые лицензии, т.е.

license('checkout','Compiler')
license('checkout','control_toolbox')

Вы просто добавляете 5 наборов инструментов, которые необходимо проверить -> если функция лицензии не может проверить лицензию, она возвращает false, которую затем можно использовать для прерывания компиляции.

person matlabgui    schedule 21.07.2016
comment
Это уже помогает, спасибо matlabgui. Однако я должен указать фиксированный набор наборов инструментов. Если разработчик изменит исходный код таким образом, что потребуется другой набор инструментов, компиляция может снова завершиться ошибкой без предварительного уведомления. - person Zweikeks; 23.07.2016
comment
Это правда. Возможно, вы могли бы просмотреть все зависимые исходные файлы и посмотреть, из какого набора инструментов они взяты. - person matlabgui; 23.07.2016

Вот что я наконец придумал:

Я могу проверить перед компиляцией, какие наборы инструментов необходимы, и соответственно вызвать license(). Или я могу реализовать встроенную проверку в сам исполняемый файл. (Вызывается со специальным параметром после компиляции, запускает самопроверку доступных наборов инструментов.) В любом случае мне нужны имена необходимых наборов инструментов.

Я попробовал несколько способов создать список наборов инструментов. Вкратце: запуск программы в Matlab, а затем ввод лицензии («inuse») не очень надежен. depfun() сильно спускается. mydepfun() и fdep() недостаточно спускаются.

Я думаю, проблема с mydepfun() и fdep() в том, что они не спускаются в папку \toolbox\shared. Поэтому я взял mydepfun() у Тобиаса Кинцлера (ссылка на первоисточники) и изменил его:

function [list,callers,tboxes_found] = i_scan(f)

func = i_function_name(f);

[list,~,~,~,~,~,callers,~] = depfun(func,'-toponly','-quiet');

toolboxroot = fullfile(matlabroot,'toolbox');
sharedroot  = strcat(toolboxroot, filesep, 'shared');

intoolbox = strncmpi(list,toolboxroot,numel(toolboxroot));
inshared  = strncmpi(list,sharedroot, numel(sharedroot));

tboxes_found = list(intoolbox & ~inshared);
tboxes_found = regexpi(tboxes_found, '[\\/]toolbox[\\/](.+?)[\\/]', 'tokens');
tboxes_found = cellfun(@(cfun) cfun{1}, tboxes_found);

list = list(~intoolbox | inshared);
callers = callers(~intoolbox | inshared);
for jj = 1:numel(list)
    c = callers{jj};
    cs = cell(numel(c),1);
    for kk = 1:numel(c)
        cs{kk} = list{c(kk)};
    end;
    callers{jj} = cs;
end;

Таким образом, i_scan(f) возвращает наборы инструментов, а также спускается в \toolbox\shared. Основная функция mydepfun() просто собирает наборы инструментов:

function [filelist,callers,toolboxes] = mydepfun(fn,recursive)
.
.
toolboxes = {};
[filelist,callers,tboxes_found] = i_scan(foundfile);
toolboxes = [toolboxes; tboxes_found];
.
.
[newlist,newcallers,tboxes_found] = i_scan(toscan{1});
toolboxes = [toolboxes; tboxes_found];
.
.
toolboxes = unique(toolboxes);

Перечисленные наборы инструментов — это те, которые использует наш исходный код. Модифицированный mydepfun() работает нормально. (Помимо типичных проблем, вызванных элементами, разрешаемыми только во время выполнения, такими как eval(), дескрипторы функций, обратные вызовы и т. д.)

И: Зависимые ходоки, которые я видел, такие как mydepfun(), используют depfun() внутри. depfun() ненадежен, так как он молча игнорирует весь исходный код не по пути (также в этом случае его возвращаемые prob_files пусты). Поэтому необходимо позаботиться о том, чтобы путь Matlab был установлен правильно. (Кроме того, любые дополнительные пути проблематичны, поскольку Matlab может неожиданно использовать функции с тем же именем из других мест.)

В конце концов, я думаю, это хороший способ сделать мой процесс сборки более надежным.

/Цвейкекс

person Zweikeks    schedule 26.07.2016

Я только что получил еще одну подсказку от форума Mathworks. Компилятор записывает mccExludedFiles.log. Это список недостающих наборов инструментов. Например

mccExludedFiles.log:
C:\Program Files\MATLAB\R2010a\toolbox\shared\optimlib\fmincon.m
called by ...c:\temp\whatever\source\code.m
(because the required licenses are not available.)

(Однако другие отсутствующие файлы в исходном коде не отображаются.)

/Цвейкекс

person Zweikeks    schedule 27.07.2016