diff --git a/utils/deploy_tool/main.cpp b/utils/deploy_tool/main.cpp index af29fcc3..8c78523b 100644 --- a/utils/deploy_tool/main.cpp +++ b/utils/deploy_tool/main.cpp @@ -47,41 +47,42 @@ void usage() { piCout << Green << Bold << "Usage:" << Default << "\"deploy_tool [-hvfC] [--dependencies [--prefix ]] " "[-p ] [-s ] [--ignore ] [-S ] " "[-l ] [-D ] [-L | -W | -M ] " - "[-d ] [-q ] [-a ] [-S ] " + "[--name-tool ] [-d ] [-q ] [-a ] [-S ] " "[-P ] [--qt-plugins ] -o [ ...]\"" << NewLine; piCout << Green << Bold << "Details:"; piCout << Bold << "Debug control"; - piCout << "-h, --help " << Green << "- display this message and exit"; - piCout << "-v, --verbose " << Green << "- be verbose"; + piCout << "-h, --help " << Green << "- display this message and exit"; + piCout << "-v, --verbose " << Green << "- be verbose"; piCout << ""; piCout << Bold << "Processing control"; - piCout << "-f, --fake " << Green << "- don`t copy, only print"; - piCout << "-s " << Green << "- set search pathes for system libraries, may be separated by \"" DELIM "\", default \"/usr/lib\""; - piCout << "--ignore " << Green << "- ignore libraries names, may be separated by \"" DELIM "\", default \"\""; - piCout << "-l " << Green << "- \"ldd\" path, default \"/usr/bin/ldd\""; - piCout << "-L " << Green << "- \"readelf\" path, overrides \"ldd\""; - piCout << "-W " << Green << "- \"objdump\" path, overrides \"ldd\""; - piCout << "-M " << Green << "- \"otool\" path, overrides \"ldd\""; - piCout << "-D " << Green << "- \"dpkg\" path, default \"/usr/bin/dpkg\""; - piCout << "-d " << Green << "- maximum dependepcies depth, default 5"; + piCout << "-f, --fake " << Green << "- don`t copy, only print"; + piCout << "-s " << Green << "- set search pathes for system libraries, may be separated by \"" DELIM "\", default \"/usr/lib\""; + piCout << "--ignore " << Green << "- ignore libraries names, may be separated by \"" DELIM "\", default \"\""; + piCout << "-l " << Green << "- \"ldd\" path, default \"/usr/bin/ldd\""; + piCout << "-L " << Green << "- \"readelf\" path, overrides \"ldd\""; + piCout << "-W " << Green << "- \"objdump\" path, overrides \"ldd\""; + piCout << "-M " << Green << "- \"otool\" path, overrides \"ldd\""; + piCout << "-D " << Green << "- \"dpkg\" path, default \"/usr/bin/dpkg\""; + piCout << "--name-tool " << Green << "- \"install_name_tool\" path, default \"install_name_tool\""; + piCout << "-d " << Green << "- maximum dependepcies depth, default 5"; //piCout << "-Q, --Qt-force " << Green << "- force add Qt root dir, default takes from \"qmake -v\""; piCout << ""; piCout << Bold << "Qt control"; - piCout << "-q " << Green << "- path where Qt root dir, default takes from \"qmake -v\""; - //piCout << "-C, --Conf " << Green << "- make \"qt.conf\""; - piCout << "-S " << Green << "- set Qt styles (e.g. \"oxygen,breeze\"), default \"*\""; - piCout << "-P " << Green << "- set Qt platforms (e.g. \"win,mini\"), default by host system"; - piCout << "--qt-plugins " << Green << "- set Qt plugins description"; + piCout << "-q " << Green << "- path where Qt root dir, default takes from \"qmake -v\""; + //piCout << "-C, --Conf " << Green << "- make \"qt.conf\""; + piCout << "-S " << Green << "- set Qt styles (e.g. \"oxygen,breeze\"), default \"*\""; + piCout << "-P " << Green << "- set Qt platforms (e.g. \"win,mini\"), default by host system"; + piCout << "--qt-plugins " << Green << "- set Qt plugins description"; piCout << ""; piCout << Bold << "Output control"; - piCout << "-o " << Green << "- path for libraries copy to"; - piCout << "-p " << Green << "- path for Qt plugins, default \"/plugins\""; - piCout << "--dependencies " << Green << "- search dependencies by , print them and copy missing libraries"; - piCout << "--prefix " << Green << "- print before dependencies"; + piCout << "-o " << Green << "- path for libraries copy to"; + piCout << "-p " << Green << "- path for Qt plugins, default \"/plugins\""; + piCout << "--dependencies " << Green << "- search dependencies by , print them and copy missing libraries"; + piCout << "--prefix " << Green << "- print before dependencies"; piCout << ""; piCout << Bold << "Input control"; - piCout << " ... " << Green << "- executable to process"; - piCout << "-a " << Green << "- additional libs, separated by \"" DELIM "\". Libraries will be searched in "; + piCout << " ... " << Green << "- executable to process"; + piCout << "-a " << Green << "- additional libs, separated by \"" DELIM "\". Libraries will be searched in "; } struct QtDep { @@ -108,7 +109,7 @@ QtDep qt_deps[] = { int depth = 5; bool fake = false, is_ldd = true, is_deps = false, need_qt = false; -PIString ldd, readelf, objdump, otool, dpkg, out_dir, qt_dir, out_plugins_dir; +PIString ldd, readelf, objdump, otool, dpkg, nametool, out_dir, qt_dir, out_plugins_dir; PIStringList styles, lib_dirs, add_libs, platforms, sqldrivers; PISet all_libs, miss_libs, all_deps, frameworks, miss_frameworks, qt_plugins, ignore_libs; PIMap qt_filters; @@ -358,6 +359,31 @@ bool procDpkg(const PIString & l) { } +void patchNameTool() { + if (nametool.isEmpty()) return; + PIVector clibs = all_libs.toVector(); + PIString ll, cmd; + PIStringList dlibs; + piForeach (PIString l, clibs) { + PIFile::FileInfo fi; + fi.path = l; + ll = out_dir + fi.name(); + cmd = otool + " -L " + ll; + cmd += " | grep -o \".*(\""; + dlibs = execute(cmd).split("\n"); + piForeach (PIString dl, dlibs) { + dl.cutRight(1).trim(); + if (!all_libs.contains(dl)) continue; + cmd = nametool + " -change \"" + l + "\""; + cmd += " \"@executable_path/../Frameworks/" + fi.name() + "\""; + cmd += " \"" + ll + "\""; + piCout << cmd; + execute(cmd); + } + } +} + + int main(int argc, char * argv[]) { PICLI cli(argc, argv); //piCout << cli.rawArguments(); @@ -379,6 +405,7 @@ int main(int argc, char * argv[]) { cli.addArgument("Lreadelf", true); cli.addArgument("Wobjdump", true); cli.addArgument("Motool", true); + cli.addArgument("name-tool", PIChar('\0'), true); cli.addArgument("Dpkg", true); cli.addArgument("depth", true); cli.addArgument("qtdir", true); @@ -401,11 +428,15 @@ int main(int argc, char * argv[]) { readelf = cli.argumentValue("Lreadelf"); objdump = cli.argumentValue("Wobjdump"); otool = cli.argumentValue("Motool"); + nametool = cli.argumentValue("name-tool"); + if (nametool.isEmpty()) + nametool = "install_name_tool"; dpkg = cli.argumentValue("Dpkg"); #ifdef WINDOWS readelf.replaceAll("/", "\\"); objdump.replaceAll("/", "\\"); otool.replaceAll("/", "\\"); + nametool.replaceAll("/", "\\"); dpkg.replaceAll("/", "\\"); #endif if (dpkg.isEmpty()) @@ -529,6 +560,9 @@ int main(int argc, char * argv[]) { miss_frameworks << f; } + if (!otool.isEmpty()) + patchNameTool(); + if (is_deps) { PICout(PICoutManipulators::AddNone) << cli.argumentValue("prefix"); PICout(PICoutManipulators::AddNewLine) << PIStringList(all_deps.toVector()).join(", ");