これが私が最終的に思いついたものです:
どのツールボックスが必要かをコンパイル前に確認し、それに応じて license() を呼び出すことができます。または、組み込みのチェックを実行可能ファイル自体に実装することもできます。(コンパイル後に特別なパラメーターで呼び出され、使用可能なツールボックスのセルフチェックがトリガーされます。) いずれの場合も、必要なツールボックスの名前が必要です。
ツールボックスのリストを生成する方法をいくつか試しました。要するに、Matlab でプログラムを実行してから license('inuse') を入力することはあまり信頼できません。depfun() はかなり下降します。mydepfun() と fdep() は十分に下降しません。
mydepfun() と fdep() の問題は、\toolbox\shared フォルダーに下がらないことだと思います。そこで、Tobias Kienzler (元のソースへのリンク) から 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 は他の場所から同じ名前の関数を予期せず取得する可能性があるため、追加のパスにも問題があります。)
結局のところ、これはビルド プロセスの信頼性を高める良い方法だと思います。
/ツヴァイケクス