Вот что я наконец придумал:
Я могу проверить перед компиляцией, какие наборы инструментов необходимы, и соответственно вызвать 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