Das ist, was ich kam schließlich mit:
ich vor der Kompilierung überprüfen, die Werkzeugkästen benötigt werden und rufen Lizenz (entsprechend). Oder ich kann einen eingebauten Check in die ausführbare Datei selbst implementieren. (Wird nach dem Kompilieren mit einem speziellen Parameter aufgerufen, löst eine Selbstprüfung auf verfügbare Toolboxen aus.) In beiden Fällen benötige ich die Namen der benötigten Toolboxen.
Ich habe verschiedene Möglichkeiten ausprobiert, um eine Liste von Toolboxen zu erstellen. Kurz gesagt: Das Ausführen des Programms in Matlab und das Eingeben der Lizenz ('inuse') ist nicht sehr zuverlässig. depfun() steigt zu viel ab. mydepfun() und fdep() steigen nicht genug ab.
Ich denke, das Problem mit mydepfun() und fdep() ist, dass sie nicht in den \ toolbox \ shared-Ordner abstammen. Also nahm ich mydepfun() von Tobias Kienzler (link to the original sources) und es geändert:
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;
Auf diese Weise i_scan (f) die Werkzeugkästen Rückkehr und senkt sich auch in \ Toolbox \ geteilt. Die Hauptfunktion von mydepfun() sammelt nur die Werkzeugkästen:
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);
Die aufgeführten Werkzeugkästen sind die, die unseren Quellcode verwendet. Die modifizierte mydepfun() scheint gut zu funktionieren. (Abgesehen von den typischen Problemen, die durch Elemente verursacht werden, die nur während der Laufzeit aufgelöst werden, wie eval(), Funktionsgriffe, Callbacks etc.)
Und: Die Abhängigen, die ich gesehen habe - wie mydepfun() - benutzen depunf() drin .depfun() ist nicht zuverlässig, da es den gesamten Quellcode ignoriert, der sich nicht auf dem Pfad befindet (auch die Rückgabe prob_files ist in diesem Fall leer). Es ist also darauf zu achten, dass der Matlab-Pfad korrekt eingestellt ist. (Auch zusätzliche Pfade sind problematisch, da Matlab unerwartet Funktionen mit dem gleichen Namen von anderen Orten übernehmen kann.)
Schließlich denke ich, dies ist ein guter Weg, um meinen Build-Prozess zuverlässiger zu machen.
/Zweikeks
Dies hilft dank schon matlabgui. Ich muss jedoch eine feste Reihe von Toolboxen angeben. Wenn ein Entwickler die Quellen so ändert, dass eine andere Toolbox benötigt wird, kann die Kompilierung ohne vorherige Benachrichtigung erneut fehlschlagen. – Zweikeks
Das stimmt. Sie könnten möglicherweise alle abhängigen Quelldateien durchlaufen und sehen, aus welcher Toolbox sie stammen. – matlabgui