Dylibs find.m
Jump to navigation
Jump to search
An m-file function used in support of creating a MacOS X App bundle.
## Copyright (C) 2012 Ben Abbott ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 3 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with Octave; see the file COPYING. If not, see ## <http://www.gnu.org/licenses/>. ## -*- texinfo -*- ## @deftypefn {Function File} dylibs = dylibs_find (@var{directory}) ## ## Recursively finds all dylibs in @var{directory}, and returns a structure ## with fields @code{name}, @code{location}, and @code{dependents}. The ## @var{directory} default to the present working directory. ## ## @table ## @item @code{name} ## Is the name of a dynamic library. ## @item @code{location} ## Is the path to the named dynamic library. ## @item @code{dependents} ## Is a cellstr array listing the dynamic libraries the named library ## depends upon. ## @item @code{islink} ## Logical scalar indicating whether the file is a symbolic link to a ## dynamically loadable library. ## @end table ## ## @seealso {dylibs_get_deps, dylibs_fix} ## @end deftypefn ## Author: Ben Abbott <bpabbott@mac.com> ## Created: 2012-06-27 function dylibs = dylibs_find (directory = ".") persistent root_dir={"/opt/local/lib/", "@executable_path"} remove_symbolic_links = false; cwd = pwd (); unwind_protect cd (directory); f = dir (); ## Remove ".", "..", and ".hidden_files" f = f(! strncmp ({f.name}, ".", 1)); ## Separate directories d = [f.isdir]; dirs = {f(d).name}; dirs = dirs (! strcmpi (dirs, "share")); f(d) = []; str = sprintf ("Working in directory -> ""%s"" ...", directory); nstr = numel (str); printf ("%s", str); ## Find dylibs if (numel (f)) names = {f.name}; [status, output] = system ("find . -maxdepth 1 -type l -print"); symlinks = strtrim (strrep (strsplit (output, char (10)), "./", "")); symlinks(cellfun (@isempty, symlinks)) = []; ## Remove symbolic links if (remove_symbolic_links) names = setdiff (names, symlinks); endif names = names(dylibs_isdylib(names)); if (numel (names)) deps = dylibs_get_deps (names, {"@", root_dir{:}}); if (numel (names) == 1) deps = {deps}; endif islink = ismember (names, symlinks); dylibs = cell2struct ([names; repmat({pwd()}, size (names)); deps; mat2cell(islink,1,ones(size(islink)))], {"name", "location", "depdendents", "islink"}); str = sprintf (" %d dynamic libraries.", numel (dylibs)); else dylibs = struct ("name", "", "location", "", ... "dependents", {}, "islink", logical([])); str = " NO dynamic libraries."; endif else dylibs = struct ("name", "", "location", ... "", "dependents", {}, "islink", logical([])); str = " NO dynamic libraries."; endif printf ("%s %s\n", repmat (".", [1, (80 - nstr - numel (str))]), str); for n = 1:numel(dirs) new_dylibs = dylibs_find (dirs{n}); if (numel (new_dylibs)) if (numel (dylibs)) dylibs = [dylibs; new_dylibs]; else dylibs = new_dylibs; endif endif endfor unwind_protect_cleanup cd (cwd); end_unwind_protect endfunction