Это то, что я наконец придумал:
я могу проверить перед компиляцией, которые необходимы для инструментов и вызвать лицензию() соответственно. Или я могу реализовать встроенную проверку самого исполняемого файла. (Вызывается специальным параметром после компиляции, запускает самопроверку для доступных наборов инструментов.) В любом случае мне нужны имена необходимых наборов инструментов.
Я попробовал несколько способов создания списка наборов инструментов. Короче: запуск программы в Matlab, а затем вход в лицензию ('inuse') не очень надежный. depfun() спускается к большому количеству. mydepfun() и fdep() не спускаются достаточно.
Я думаю, что проблема с mydepfun() и fdep() заключается в том, что они не спускаются в папку \ toolbox \ shared. Так что я взял mydepfun() от Tobias Kienzler (link to the original sources) и модифицировали его:
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 (е) возвращается в инструментарии, а также спускается в \ Панели инструментов \ совместно. Основная функция 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() не является надежным, так как он молча игнорирует весь исходный код не на пути (также в этом случае пустая ошибка в этом случае пустая). Поэтому следует принять во внимание, что путь Matlab установлен правильно. (Также любые дополнительные проблемы проблематичны, так как Matlab может неожиданно выполнять одноименные функции из других мест.)
В конце концов, я считаю, что это хороший способ сделать мой процесс сборки более надежным.
/Zweikeks
Это помогает уже, благодаря matlabgui. Однако я должен указать фиксированный набор наборов инструментов. В случае, если разработчик меняет источники таким образом, что нужен другой набор инструментов, компиляция может снова завершиться без уведомления. – Zweikeks
Это правда. Вы могли бы зациклиться на всех зависимых исходных файлах и посмотреть, с какого инструментария они появляются. – matlabgui