mirror of
https://github.com/status-im/macdylibbundler.git
synced 2025-02-22 07:38:09 +00:00
clean up & refine formatting
This commit is contained in:
parent
fa16d5e817
commit
b611a1bc63
@ -14,7 +14,6 @@
|
|||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
|
|
||||||
#include "DylibBundler.h"
|
#include "DylibBundler.h"
|
||||||
// #include "ParallelForEach.h"
|
|
||||||
#include "Settings.h"
|
#include "Settings.h"
|
||||||
#include "Utils.h"
|
#include "Utils.h"
|
||||||
|
|
||||||
@ -44,7 +43,7 @@ std::vector<std::string> paths;
|
|||||||
// initialize the dylib search paths
|
// initialize the dylib search paths
|
||||||
void initSearchPaths()
|
void initSearchPaths()
|
||||||
{
|
{
|
||||||
//Check the same paths the system would search for dylibs
|
// check the same paths the system would search for dylibs
|
||||||
std::string searchPaths;
|
std::string searchPaths;
|
||||||
char *dyldLibPath = std::getenv("DYLD_LIBRARY_PATH");
|
char *dyldLibPath = std::getenv("DYLD_LIBRARY_PATH");
|
||||||
if (dyldLibPath != 0)
|
if (dyldLibPath != 0)
|
||||||
@ -72,20 +71,20 @@ void initSearchPaths()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// if some libs are missing prefixes, this will be set to true
|
// if some libs are missing prefixes, then more stuff will be necessary to do
|
||||||
// more stuff will then be necessary to do
|
|
||||||
bool missing_prefixes = false;
|
bool missing_prefixes = false;
|
||||||
|
|
||||||
Dependency::Dependency(std::string path)
|
Dependency::Dependency(std::string path)
|
||||||
{
|
{
|
||||||
char original_file_buffer[PATH_MAX];
|
char original_file_buffer[PATH_MAX];
|
||||||
std::string original_file;
|
std::string original_file;
|
||||||
|
std::string warning_msg;
|
||||||
|
|
||||||
if (isRpath(path)) {
|
if (isRpath(path)) {
|
||||||
original_file = searchFilenameInRpaths(path);
|
original_file = searchFilenameInRpaths(path);
|
||||||
}
|
}
|
||||||
else if (!realpath(rtrim(path).c_str(), original_file_buffer)) {
|
else if (!realpath(rtrim(path).c_str(), original_file_buffer)) {
|
||||||
std::cerr << "\n/!\\ WARNING : Cannot resolve path '" << path << "'" << std::endl;
|
warning_msg = "\n/!\\ WARNING: Cannot resolve path '" + path + "'.\n";
|
||||||
original_file = path;
|
original_file = path;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -114,31 +113,35 @@ Dependency::Dependency(std::string path)
|
|||||||
// check if file is contained in one of the paths
|
// check if file is contained in one of the paths
|
||||||
for (size_t i=0; i<paths.size(); ++i) {
|
for (size_t i=0; i<paths.size(); ++i) {
|
||||||
if (fileExists(paths[i]+filename)) {
|
if (fileExists(paths[i]+filename)) {
|
||||||
std::cout << "FOUND " << filename << " in " << paths[i] << std::endl;
|
warning_msg += "FOUND " + filename + " in " + paths[i] + ".\n";
|
||||||
prefix = paths[i];
|
prefix = paths[i];
|
||||||
missing_prefixes = true; // the prefix was missing
|
missing_prefixes = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Settings::verboseOutput())
|
||||||
|
std::cout << warning_msg;
|
||||||
|
|
||||||
// if the location is still unknown, ask the user for search path
|
// if the location is still unknown, ask the user for search path
|
||||||
if (!Settings::isPrefixIgnored(prefix) && (prefix.empty() || !fileExists(prefix+filename))) {
|
if (!Settings::isPrefixIgnored(prefix) && (prefix.empty() || !fileExists(prefix+filename))) {
|
||||||
std::cerr << "\n/!\\ WARNING : Library " << filename << " has an incomplete name (location unknown)" << std::endl;
|
if (Settings::verboseOutput())
|
||||||
|
std::cerr << "\n/!\\ WARNING: Library " << filename << " has an incomplete name (location unknown).\n";
|
||||||
missing_prefixes = true;
|
missing_prefixes = true;
|
||||||
paths.push_back(getUserInputDirForFile(filename));
|
paths.push_back(getUserInputDirForFile(filename));
|
||||||
}
|
}
|
||||||
|
|
||||||
// new_name = filename.substr(0, filename.find(".")) + ".dylib";
|
|
||||||
new_name = filename;
|
new_name = filename;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Dependency::print()
|
void Dependency::print()
|
||||||
{
|
{
|
||||||
|
std::cout << "\n * " << filename << " from " << prefix << "\n";
|
||||||
|
|
||||||
const int symamount = symlinks.size();
|
const int symamount = symlinks.size();
|
||||||
std::cout << std::endl << " * " << filename << " from " << prefix << std::endl;
|
|
||||||
for (int n=0; n<symamount; ++n)
|
for (int n=0; n<symamount; ++n)
|
||||||
std::cout << " symlink --> " << symlinks[n] << std::endl;;
|
std::cout << " symlink --> " << symlinks[n] << "\n";;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string Dependency::getInstallPath()
|
std::string Dependency::getInstallPath()
|
||||||
@ -153,13 +156,12 @@ std::string Dependency::getInnerPath()
|
|||||||
|
|
||||||
void Dependency::addSymlink(std::string s)
|
void Dependency::addSymlink(std::string s)
|
||||||
{
|
{
|
||||||
// calling std::find on this vector is not near as slow as an extra invocation of install_name_tool
|
// calling std::find on this vector is not as slow as an extra invocation of install_name_tool
|
||||||
if (std::find(symlinks.begin(), symlinks.end(), s) == symlinks.end())
|
if (std::find(symlinks.begin(), symlinks.end(), s) == symlinks.end())
|
||||||
symlinks.push_back(s);
|
symlinks.push_back(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
// compare the given Dependency with this one.
|
// compare given Dependency with this one. if both refer to the same file, merge into one entry.
|
||||||
// if both refer to the same file, merge both entries into one
|
|
||||||
bool Dependency::mergeIfSameAs(Dependency& dep2)
|
bool Dependency::mergeIfSameAs(Dependency& dep2)
|
||||||
{
|
{
|
||||||
if (dep2.getOriginalFileName().compare(filename) == 0) {
|
if (dep2.getOriginalFileName().compare(filename) == 0) {
|
||||||
@ -174,10 +176,11 @@ bool Dependency::mergeIfSameAs(Dependency& dep2)
|
|||||||
void Dependency::copyYourself()
|
void Dependency::copyYourself()
|
||||||
{
|
{
|
||||||
copyFile(getOriginalPath(), getInstallPath());
|
copyFile(getOriginalPath(), getInstallPath());
|
||||||
// Fix the lib's inner name
|
|
||||||
|
// fix the lib's inner name
|
||||||
std::string command = std::string("install_name_tool -id ") + getInnerPath() + " " + getInstallPath();
|
std::string command = std::string("install_name_tool -id ") + getInnerPath() + " " + getInstallPath();
|
||||||
if (systemp(command) != 0) {
|
if (systemp(command) != 0) {
|
||||||
std::cerr << "\n\nError : An error occured while trying to change identity of library " << getInstallPath() << std::endl;
|
std::cerr << "\n\nError: An error occured while trying to change identity of library " << getInstallPath() << ".\n";
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -187,7 +190,7 @@ void Dependency::fixFileThatDependsOnMe(std::string file_to_fix)
|
|||||||
// for main lib file
|
// for main lib file
|
||||||
std::string command = std::string("install_name_tool -change ") + getOriginalPath() + " " + getInnerPath() + " " + file_to_fix;
|
std::string command = std::string("install_name_tool -change ") + getOriginalPath() + " " + getInnerPath() + " " + file_to_fix;
|
||||||
if (systemp(command) != 0) {
|
if (systemp(command) != 0) {
|
||||||
std::cerr << "\n\nError : An error occured while trying to fix dependencies of " << file_to_fix << std::endl;
|
std::cerr << "\n\nError: An error occured while trying to fix dependencies of " << file_to_fix << ".\n";
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -196,7 +199,7 @@ void Dependency::fixFileThatDependsOnMe(std::string file_to_fix)
|
|||||||
for (int n=0; n<symamount; ++n) {
|
for (int n=0; n<symamount; ++n) {
|
||||||
command = std::string("install_name_tool -change ") + symlinks[n] + " " + getInnerPath() + " " + file_to_fix;
|
command = std::string("install_name_tool -change ") + symlinks[n] + " " + getInnerPath() + " " + file_to_fix;
|
||||||
if (systemp(command) != 0) {
|
if (systemp(command) != 0) {
|
||||||
std::cerr << "\n\nError : An error occured while trying to fix dependencies of " << file_to_fix << std::endl;
|
std::cerr << "\n\nError: An error occured while trying to fix dependencies of " << file_to_fix << ".\n";
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -206,7 +209,7 @@ void Dependency::fixFileThatDependsOnMe(std::string file_to_fix)
|
|||||||
// for main lib file
|
// for main lib file
|
||||||
command = std::string("install_name_tool -change ") + filename + " " + getInnerPath() + " " + file_to_fix;
|
command = std::string("install_name_tool -change ") + filename + " " + getInnerPath() + " " + file_to_fix;
|
||||||
if (systemp(command) != 0) {
|
if (systemp(command) != 0) {
|
||||||
std::cerr << "\n\nError : An error occured while trying to fix dependencies of " << file_to_fix << std::endl;
|
std::cerr << "\n\nError: An error occured while trying to fix dependencies of " << file_to_fix << ".\n";
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -214,7 +217,7 @@ void Dependency::fixFileThatDependsOnMe(std::string file_to_fix)
|
|||||||
for (int n=0; n<symamount; ++n) {
|
for (int n=0; n<symamount; ++n) {
|
||||||
command = std::string("install_name_tool -change ") + symlinks[n] + " " + getInnerPath() + " " + file_to_fix;
|
command = std::string("install_name_tool -change ") + symlinks[n] + " " + getInnerPath() + " " + file_to_fix;
|
||||||
if (systemp(command) != 0) {
|
if (systemp(command) != 0) {
|
||||||
std::cerr << "\n\nError : An error occured while trying to fix dependencies of " << file_to_fix << std::endl;
|
std::cerr << "\n\nError: An error occured while trying to fix dependencies of " << file_to_fix << ".\n";
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,14 +6,11 @@
|
|||||||
#include <map>
|
#include <map>
|
||||||
#include <numeric>
|
#include <numeric>
|
||||||
#include <set>
|
#include <set>
|
||||||
|
|
||||||
#include <sys/wait.h>
|
|
||||||
#ifdef __linux
|
#ifdef __linux
|
||||||
#include <linux/limits.h>
|
#include <linux/limits.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "Dependency.h"
|
#include "Dependency.h"
|
||||||
// #include "ParallelForEach.h"
|
|
||||||
#include "Settings.h"
|
#include "Settings.h"
|
||||||
#include "Utils.h"
|
#include "Utils.h"
|
||||||
|
|
||||||
@ -21,32 +18,31 @@ std::vector<Dependency> deps;
|
|||||||
std::map<std::string, std::vector<Dependency>> deps_per_file;
|
std::map<std::string, std::vector<Dependency>> deps_per_file;
|
||||||
std::set<std::string> rpaths;
|
std::set<std::string> rpaths;
|
||||||
std::map<std::string, std::vector<std::string>> rpaths_per_file;
|
std::map<std::string, std::vector<std::string>> rpaths_per_file;
|
||||||
|
std::map<std::string, bool> deps_collected;
|
||||||
|
|
||||||
void changeLibPathsOnFile(std::string file_to_fix)
|
void changeLibPathsOnFile(std::string file_to_fix)
|
||||||
{
|
{
|
||||||
std::cout << "\n* Fixing dependencies on " << file_to_fix << std::endl;
|
if (deps_collected.find(file_to_fix) == deps_collected.end())
|
||||||
|
collectDependencies(file_to_fix);
|
||||||
|
|
||||||
|
std::cout << "\n* Fixing dependencies on " << file_to_fix << "\n";
|
||||||
|
|
||||||
// const int dep_amount = deps.size();
|
|
||||||
std::vector<Dependency> deps_in_file = deps_per_file[file_to_fix];
|
std::vector<Dependency> deps_in_file = deps_per_file[file_to_fix];
|
||||||
const int dep_amount = deps_in_file.size();
|
const int dep_amount = deps_in_file.size();
|
||||||
for (int n=0; n<dep_amount; ++n) {
|
for (int n=0; n<dep_amount; ++n)
|
||||||
// deps[n].fixFileThatDependsOnMe(file_to_fix);
|
|
||||||
deps_in_file[n].fixFileThatDependsOnMe(file_to_fix);
|
deps_in_file[n].fixFileThatDependsOnMe(file_to_fix);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isRpath(const std::string& path)
|
bool isRpath(const std::string& path)
|
||||||
{
|
{
|
||||||
std::cout << "path: " << path << std::endl;
|
|
||||||
size_t result = path.find("@rpath");
|
size_t result = path.find("@rpath");
|
||||||
std::cout << "isRpath? " << (result == 0 ? "yes" : "no") << std::endl;
|
|
||||||
return (result == 0);
|
return (result == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void collectRpaths(const std::string& filename)
|
void collectRpaths(const std::string& filename)
|
||||||
{
|
{
|
||||||
if (!fileExists(filename)) {
|
if (!fileExists(filename)) {
|
||||||
std::cerr << "\n/!\\ WARNING : can't collect rpaths for nonexistent file '" << filename << "'\n";
|
std::cerr << "\n/!\\ WARNING: Can't collect rpaths for nonexistent file '" << filename << "'.\n";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -66,7 +62,7 @@ void collectRpaths(const std::string& filename)
|
|||||||
size_t start_pos = line.find("path ");
|
size_t start_pos = line.find("path ");
|
||||||
size_t end_pos = line.find(" (");
|
size_t end_pos = line.find(" (");
|
||||||
if (start_pos == std::string::npos || end_pos == std::string::npos) {
|
if (start_pos == std::string::npos || end_pos == std::string::npos) {
|
||||||
std::cerr << "\n/!\\ WARNING: Unexpected LC_RPATH format\n";
|
std::cerr << "\n/!\\ WARNING: Unexpected LC_RPATH format.\n";
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
start_pos += 5;
|
start_pos += 5;
|
||||||
@ -86,10 +82,8 @@ void collectRpaths(const std::string& filename)
|
|||||||
|
|
||||||
void collectRpathsForFilename(const std::string& filename)
|
void collectRpathsForFilename(const std::string& filename)
|
||||||
{
|
{
|
||||||
std::cout << "collecting rpaths for: " << filename << std::endl;
|
if (rpaths_per_file.find(filename) == rpaths_per_file.end())
|
||||||
if (rpaths_per_file.find(filename) == rpaths_per_file.end()) {
|
|
||||||
collectRpaths(filename);
|
collectRpaths(filename);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string searchFilenameInRpaths(const std::string& rpath_file)
|
std::string searchFilenameInRpaths(const std::string& rpath_file)
|
||||||
@ -97,7 +91,6 @@ std::string searchFilenameInRpaths(const std::string& rpath_file)
|
|||||||
char buffer[PATH_MAX];
|
char buffer[PATH_MAX];
|
||||||
std::string fullpath;
|
std::string fullpath;
|
||||||
std::string suffix = rpath_file.substr(7, rpath_file.size()-6);
|
std::string suffix = rpath_file.substr(7, rpath_file.size()-6);
|
||||||
std::cout << "suffix: " << suffix << std::endl;
|
|
||||||
|
|
||||||
for (std::set<std::string>::iterator it = rpaths.begin(); it != rpaths.end(); ++it) {
|
for (std::set<std::string>::iterator it = rpaths.begin(); it != rpaths.end(); ++it) {
|
||||||
std::string path = *it + "/" + suffix;
|
std::string path = *it + "/" + suffix;
|
||||||
@ -109,10 +102,10 @@ std::string searchFilenameInRpaths(const std::string& rpath_file)
|
|||||||
|
|
||||||
if (fullpath.empty()) {
|
if (fullpath.empty()) {
|
||||||
if (Settings::verboseOutput())
|
if (Settings::verboseOutput())
|
||||||
std::cerr << "\n/!\\ WARNING : can't get path for '" << rpath_file << "'\n";
|
std::cerr << "\n/!\\ WARNING: Can't get path for '" << rpath_file << "'.\n";
|
||||||
fullpath = getUserInputDirForFile(suffix) + suffix;
|
fullpath = getUserInputDirForFile(suffix) + suffix;
|
||||||
if (!Settings::verboseOutput() && fullpath.empty())
|
if (!Settings::verboseOutput() && fullpath.empty())
|
||||||
std::cerr << "\n/!\\ WARNING : can't get path for '" << rpath_file << "'\n";
|
std::cerr << "\n/!\\ WARNING: Can't get path for '" << rpath_file << "'.\n";
|
||||||
if (realpath(fullpath.c_str(), buffer))
|
if (realpath(fullpath.c_str(), buffer))
|
||||||
fullpath = buffer;
|
fullpath = buffer;
|
||||||
}
|
}
|
||||||
@ -134,7 +127,7 @@ void fixRpathsOnFile(const std::string& original_file, const std::string& file_t
|
|||||||
+ Settings::inside_lib_path() + " "
|
+ Settings::inside_lib_path() + " "
|
||||||
+ file_to_fix;
|
+ file_to_fix;
|
||||||
if (systemp(command) != 0) {
|
if (systemp(command) != 0) {
|
||||||
std::cerr << "\n\nError : An error occured while trying to fix dependencies of " << file_to_fix << std::endl;
|
std::cerr << "\n\n/!\\ ERROR: An error occured while trying to fix dependencies of " << file_to_fix << ".\n";
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -190,21 +183,18 @@ void addDependency(std::string path, std::string filename)
|
|||||||
// Fill |lines| with dependencies of given |filename|
|
// Fill |lines| with dependencies of given |filename|
|
||||||
void collectDependencies(std::string filename, std::vector<std::string>& lines)
|
void collectDependencies(std::string filename, std::vector<std::string>& lines)
|
||||||
{
|
{
|
||||||
std::cout << "collecting deps for: " << filename << std::endl;
|
|
||||||
|
|
||||||
std::string cmd = "otool -L " + filename;
|
std::string cmd = "otool -L " + filename;
|
||||||
std::string output = system_get_output(cmd);
|
std::string output = system_get_output(cmd);
|
||||||
|
|
||||||
if (
|
if (output.find("can't open file") != std::string::npos
|
||||||
output.find("can't open file") != std::string::npos ||
|
|| output.find("No such file") != std::string::npos
|
||||||
output.find("No such file") != std::string::npos ||
|
|| output.size() < 1) {
|
||||||
output.size() < 1
|
std::cerr << "\n\n/!\\ ERROR: Cannot find file " << filename << " to read its dependencies.\n";
|
||||||
) {
|
|
||||||
std::cerr << "Cannot find file " << filename << " to read its dependencies" << std::endl;
|
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
// split output
|
// split output
|
||||||
tokenize(output, "\n", &lines);
|
tokenize(output, "\n", &lines);
|
||||||
|
deps_collected[filename] = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void collectDependencies(std::string filename)
|
void collectDependencies(std::string filename)
|
||||||
@ -212,22 +202,19 @@ void collectDependencies(std::string filename)
|
|||||||
std::vector<std::string> lines;
|
std::vector<std::string> lines;
|
||||||
collectDependencies(filename, lines);
|
collectDependencies(filename, lines);
|
||||||
|
|
||||||
// std::cout << "."; fflush(stdout);
|
|
||||||
|
|
||||||
const int line_amount = lines.size();
|
const int line_amount = lines.size();
|
||||||
for (int n=0; n<line_amount; n++) {
|
for (int n=0; n<line_amount; n++) {
|
||||||
// std::cout << "."; fflush(stdout);
|
// only lines beginning with a tab interest us
|
||||||
if (lines[n][0] != '\t')
|
if (lines[n][0] != '\t')
|
||||||
continue; // only lines beginning with a tab interest us
|
continue;
|
||||||
|
// ignore frameworks, we cannot handle them
|
||||||
if (lines[n].find(".framework") != std::string::npos)
|
if (lines[n].find(".framework") != std::string::npos)
|
||||||
continue; // ignore frameworks, we cannot handle them
|
continue;
|
||||||
// trim useless info, keep only library path
|
// trim useless info, keep only library path
|
||||||
std::string dep_path = lines[n].substr(1, lines[n].rfind(" (") - 1);
|
std::string dep_path = lines[n].substr(1, lines[n].rfind(" (") - 1);
|
||||||
if (isRpath(dep_path)) {
|
if (isRpath(dep_path))
|
||||||
std::cout << "collecting rpaths for " << filename << std::endl;
|
|
||||||
collectRpathsForFilename(filename);
|
collectRpathsForFilename(filename);
|
||||||
}
|
|
||||||
// addDependency(dep_path);
|
|
||||||
addDependency(dep_path, filename);
|
addDependency(dep_path, filename);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -241,49 +228,51 @@ void collectSubDependencies()
|
|||||||
dep_amount = deps.size();
|
dep_amount = deps.size();
|
||||||
|
|
||||||
for (int n=0; n<dep_amount; n++) {
|
for (int n=0; n<dep_amount; n++) {
|
||||||
// std::cout << "."; fflush(stdout);
|
|
||||||
std::vector<std::string> lines;
|
|
||||||
std::string original_path = deps[n].getOriginalPath();
|
std::string original_path = deps[n].getOriginalPath();
|
||||||
if (isRpath(original_path))
|
if (isRpath(original_path))
|
||||||
original_path = searchFilenameInRpaths(original_path);
|
original_path = searchFilenameInRpaths(original_path);
|
||||||
|
|
||||||
collectRpathsForFilename(original_path);
|
collectRpathsForFilename(original_path);
|
||||||
|
|
||||||
|
std::vector<std::string> lines;
|
||||||
collectDependencies(original_path, lines);
|
collectDependencies(original_path, lines);
|
||||||
|
|
||||||
const int line_amount = lines.size();
|
const int line_amount = lines.size();
|
||||||
for (int n=0; n<line_amount; n++) {
|
for (int n=0; n<line_amount; n++) {
|
||||||
|
// only lines beginning with a tab interest us
|
||||||
if (lines[n][0] != '\t')
|
if (lines[n][0] != '\t')
|
||||||
continue; // only lines beginning with a tab interest us
|
continue;
|
||||||
|
// ignore frameworks, we cannot handle them
|
||||||
if (lines[n].find(".framework") != std::string::npos)
|
if (lines[n].find(".framework") != std::string::npos)
|
||||||
continue; //Ignore frameworks, we cannot handle them
|
continue;
|
||||||
// trim useless info, keep only library name
|
// trim useless info, keep only library name
|
||||||
std::string dep_path = lines[n].substr(1, lines[n].rfind(" (") - 1);
|
std::string dep_path = lines[n].substr(1, lines[n].rfind(" (") - 1);
|
||||||
if (isRpath(dep_path)) {
|
if (isRpath(dep_path)) {
|
||||||
dep_path = searchFilenameInRpaths(dep_path);
|
dep_path = searchFilenameInRpaths(dep_path);
|
||||||
collectRpathsForFilename(dep_path);
|
collectRpathsForFilename(dep_path);
|
||||||
}
|
}
|
||||||
// addDependency(dep_path);
|
|
||||||
addDependency(dep_path, dep_path);
|
addDependency(dep_path, dep_path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// if no more dependencies were added on this iteration, stop searching
|
||||||
if (deps.size() == dep_amount)
|
if (deps.size() == dep_amount)
|
||||||
break; // no more dependencies were added on this iteration, stop searching
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void createDestDir()
|
void createDestDir()
|
||||||
{
|
{
|
||||||
std::string dest_folder = Settings::destFolder();
|
std::string dest_folder = Settings::destFolder();
|
||||||
std::cout << "* Checking output directory " << dest_folder << std::endl;
|
std::cout << "* Checking output directory " << dest_folder << "\n";
|
||||||
|
|
||||||
bool dest_exists = fileExists(dest_folder);
|
bool dest_exists = fileExists(dest_folder);
|
||||||
|
|
||||||
if (dest_exists && Settings::canOverwriteDir()) {
|
if (dest_exists && Settings::canOverwriteDir()) {
|
||||||
std::cout << "* Erasing old output directory " << dest_folder << std::endl;
|
std::cout << "* Erasing old output directory " << dest_folder << "\n";
|
||||||
std::string command = std::string("rm -r ") + dest_folder;
|
std::string command = std::string("rm -r ") + dest_folder;
|
||||||
if (systemp(command) != 0) {
|
if (systemp(command) != 0) {
|
||||||
std::cerr << "\n\nError : An error occured while attempting to overwrite dest folder." << std::endl;
|
std::cerr << "\n\n/!\\ ERROR: An error occured while attempting to overwrite dest folder.\n";
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
dest_exists = false;
|
dest_exists = false;
|
||||||
@ -291,59 +280,29 @@ void createDestDir()
|
|||||||
|
|
||||||
if (!dest_exists) {
|
if (!dest_exists) {
|
||||||
if (Settings::canCreateDir()) {
|
if (Settings::canCreateDir()) {
|
||||||
std::cout << "* Creating output directory " << dest_folder << std::endl;
|
std::cout << "* Creating output directory " << dest_folder << "\n";
|
||||||
std::string command = std::string("mkdir -p ") + dest_folder;
|
std::string command = std::string("mkdir -p ") + dest_folder;
|
||||||
if (systemp(command) != 0) {
|
if (systemp(command) != 0) {
|
||||||
std::cerr << "\n\nError : An error occured while creating dest folder." << std::endl;
|
std::cerr << "\n\n/!\\ ERROR: An error occured while creating dest folder.\n";
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
std::cerr << "\n\nError : Dest folder does not exist. Create it or pass the appropriate flag for automatic dest dir creation." << std::endl;
|
std::cerr << "\n\n/!\\ ERROR: Dest folder does not exist. Create it or pass the appropriate flag for automatic dest dir creation.\n";
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// void doneWithDeps_go()
|
|
||||||
// {
|
|
||||||
// std::cout << std::endl;
|
|
||||||
// const int dep_amount = deps.size();
|
|
||||||
// // print info to user
|
|
||||||
// for (int n=0; n<dep_amount; n++)
|
|
||||||
// deps[n].print();
|
|
||||||
// std::cout << std::endl;
|
|
||||||
|
|
||||||
// // copy files if requested by user
|
|
||||||
// if (Settings::bundleLibs()) {
|
|
||||||
// createDestDir();
|
|
||||||
// parallel_for(dep_amount, [&](int start, int end) {
|
|
||||||
// for (int i=start; i<end; ++i) {
|
|
||||||
// deps[i].copyYourself();
|
|
||||||
// changeLibPathsOnFile(deps[i].getInstallPath());
|
|
||||||
// fixRpathsOnFile(deps[i].getOriginalPath(), deps[i].getInstallPath());
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
// }
|
|
||||||
|
|
||||||
// const int fileToFixAmount = Settings::fileToFixAmount();
|
|
||||||
// parallel_for(fileToFixAmount, [&](int start, int end) {
|
|
||||||
// for (int i=start; i<end; ++i) {
|
|
||||||
// changeLibPathsOnFile(Settings::fileToFix(i));
|
|
||||||
// fixRpathsOnFile(Settings::fileToFix(i), Settings::fileToFix(i));
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
// }
|
|
||||||
|
|
||||||
void doneWithDeps_go()
|
void doneWithDeps_go()
|
||||||
{
|
{
|
||||||
const int dep_amount = deps.size();
|
const int dep_amount = deps.size();
|
||||||
|
|
||||||
std::cout << std::endl;
|
std::cout << "\n";
|
||||||
for (int n=0; n<dep_amount; n++)
|
for (int n=0; n<dep_amount; n++)
|
||||||
deps[n].print();
|
deps[n].print();
|
||||||
std::cout << std::endl;
|
std::cout << "\n";
|
||||||
|
|
||||||
// copy files if requested by user
|
// copy files if requested by user
|
||||||
if (Settings::bundleLibs()) {
|
if (Settings::bundleLibs()) {
|
||||||
@ -356,12 +315,6 @@ void doneWithDeps_go()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// auto files = Settings::filesToFix();
|
|
||||||
// parallel_for_each(files.begin(), files.end(), [](const std::string& file) {
|
|
||||||
// changeLibPathsOnFile(file);
|
|
||||||
// fixRpathsOnFile(file, file);
|
|
||||||
// });
|
|
||||||
|
|
||||||
const int fileToFixAmount = Settings::fileToFixAmount();
|
const int fileToFixAmount = Settings::fileToFixAmount();
|
||||||
for (int n=0; n<fileToFixAmount; n++) {
|
for (int n=0; n<fileToFixAmount; n++) {
|
||||||
changeLibPathsOnFile(Settings::fileToFix(n));
|
changeLibPathsOnFile(Settings::fileToFix(n));
|
||||||
|
@ -1,56 +0,0 @@
|
|||||||
#ifndef _parallel_for_h_
|
|
||||||
#define _parallel_for_h_
|
|
||||||
|
|
||||||
#include <algorithm>
|
|
||||||
#include <thread>
|
|
||||||
#include <functional>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param nb_elements size of your for loop
|
|
||||||
* @param functor(start, end) : your function processing a sub chunk of the for loop.
|
|
||||||
* "start" is the first index to process (included) until the index "end" (excluded)
|
|
||||||
* @code
|
|
||||||
* for(int i = start; i < end; ++i)
|
|
||||||
* computation(i);
|
|
||||||
* @endcode
|
|
||||||
* @param use_threads : enable / disable threads.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
static void parallel_for(unsigned nb_elements,
|
|
||||||
std::function<void (int start, int end)> functor,
|
|
||||||
bool use_threads = true)
|
|
||||||
{
|
|
||||||
unsigned nb_threads_hint = std::thread::hardware_concurrency();
|
|
||||||
unsigned nb_threads = nb_threads_hint == 0 ? 8 : nb_threads_hint;
|
|
||||||
|
|
||||||
unsigned batch_size = nb_elements / nb_threads;
|
|
||||||
unsigned batch_remainder = nb_elements % nb_threads;
|
|
||||||
|
|
||||||
std::vector<std::thread> my_threads(nb_threads);
|
|
||||||
|
|
||||||
if (use_threads) {
|
|
||||||
// Multithread execution
|
|
||||||
for (unsigned i = 0; i < nb_threads; ++i) {
|
|
||||||
int start = i * batch_size;
|
|
||||||
my_threads[i] = std::thread(functor, start, start+batch_size);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// Single thread execution (for easy debugging)
|
|
||||||
for (unsigned i = 0; i < nb_threads; ++i) {
|
|
||||||
int start = i * batch_size;
|
|
||||||
functor(start, start+batch_size);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Deform the elements left
|
|
||||||
int start = nb_threads * batch_size;
|
|
||||||
functor(start, start+batch_remainder);
|
|
||||||
|
|
||||||
// Wait for the other thread to finish their task
|
|
||||||
if (use_threads)
|
|
||||||
std::for_each(my_threads.begin(), my_threads.end(), std::mem_fn(&std::thread::join));
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,22 +0,0 @@
|
|||||||
#ifndef _ParallelForEach_h_
|
|
||||||
#define _ParallelForEach_h_
|
|
||||||
|
|
||||||
#include <dispatch/dispatch.h>
|
|
||||||
|
|
||||||
template<typename It, typename F>
|
|
||||||
inline void parallel_for_each(It a, It b, F&& f)
|
|
||||||
{
|
|
||||||
size_t count = std::distance(a,b);
|
|
||||||
using data_t = std::pair<It, F>;
|
|
||||||
data_t helper = data_t(a, std::forward<F>(f));
|
|
||||||
dispatch_apply_f(count,
|
|
||||||
dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0),
|
|
||||||
&helper,
|
|
||||||
[](void* ctx, size_t cnt) {
|
|
||||||
data_t* d = static_cast<data_t*>(ctx);
|
|
||||||
auto elem_it = std::next(d->first, cnt);
|
|
||||||
(*d).second(*(elem_it));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
@ -19,7 +19,7 @@ bool bundleLibs_bool = false;
|
|||||||
bool bundleLibs() { return bundleLibs_bool; }
|
bool bundleLibs() { return bundleLibs_bool; }
|
||||||
void bundleLibs(bool on) { bundleLibs_bool = on; }
|
void bundleLibs(bool on) { bundleLibs_bool = on; }
|
||||||
|
|
||||||
std::string dest_folder_str = "./libs/";
|
std::string dest_folder_str = "./Frameworks/";
|
||||||
std::string destFolder() { return dest_folder_str; }
|
std::string destFolder() { return dest_folder_str; }
|
||||||
void destFolder(std::string path)
|
void destFolder(std::string path)
|
||||||
{
|
{
|
||||||
|
@ -51,7 +51,7 @@ void copyFile(std::string from, std::string to)
|
|||||||
{
|
{
|
||||||
bool overwrite = Settings::canOverwriteFiles();
|
bool overwrite = Settings::canOverwriteFiles();
|
||||||
if (fileExists(to) && !overwrite) {
|
if (fileExists(to) && !overwrite) {
|
||||||
std::cerr << "\n\nError : File " << to << " already exists. Remove it or enable overwriting." << std::endl;
|
std::cerr << "\n\nError: File " << to << " already exists. Remove it or enable overwriting." << "\n";
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -60,14 +60,14 @@ void copyFile(std::string from, std::string to)
|
|||||||
// copy file to local directory
|
// copy file to local directory
|
||||||
std::string command = std::string("cp ") + overwrite_permission + from + std::string(" ") + to;
|
std::string command = std::string("cp ") + overwrite_permission + from + std::string(" ") + to;
|
||||||
if (from != to && systemp(command) != 0) {
|
if (from != to && systemp(command) != 0) {
|
||||||
std::cerr << "\n\nError : An error occured while trying to copy file " << from << " to " << to << std::endl;
|
std::cerr << "\n\nError: An error occured while trying to copy file " << from << " to " << to << "\n";
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// give it write permission
|
// give it write permission
|
||||||
std::string command2 = std::string("chmod +w ") + to;
|
std::string command2 = std::string("chmod +w ") + to;
|
||||||
if (systemp(command2) != 0) {
|
if (systemp(command2) != 0) {
|
||||||
std::cerr << "\n\nError : An error occured while trying to set write permissions on file " << to << std::endl;
|
std::cerr << "\n\nError: An error occured while trying to set write permissions on file " << to << "\n";
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -96,7 +96,7 @@ std::string system_get_output(std::string cmd)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (...) {
|
catch (...) {
|
||||||
std::cerr << "An error occured while executing command " << cmd << std::endl;
|
std::cerr << "An error occured while executing command " << cmd << "\n";
|
||||||
pclose(command_output);
|
pclose(command_output);
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
@ -111,7 +111,7 @@ std::string system_get_output(std::string cmd)
|
|||||||
int systemp(std::string& cmd)
|
int systemp(std::string& cmd)
|
||||||
{
|
{
|
||||||
if (Settings::verboseOutput()) {
|
if (Settings::verboseOutput()) {
|
||||||
std::cout << " " << cmd << std::endl;
|
std::cout << " " << cmd << "\n";
|
||||||
}
|
}
|
||||||
return system(cmd.c_str());
|
return system(cmd.c_str());
|
||||||
}
|
}
|
||||||
@ -129,18 +129,21 @@ std::string getUserInputDirForFile(const std::string& filename)
|
|||||||
else {
|
else {
|
||||||
if (Settings::verboseOutput()) {
|
if (Settings::verboseOutput()) {
|
||||||
std::cerr << (searchPath+filename) << " was found.\n"
|
std::cerr << (searchPath+filename) << " was found.\n"
|
||||||
<< "/!\\ dylibbundler MAY NOT CORRECTLY HANDLE THIS DEPENDENCY: Check the executable with 'otool -L'" << std::endl;
|
<< "/!\\ WARNING: dylibbundler MAY NOT CORRECTLY HANDLE THIS DEPENDENCY: Check the executable with 'otool -L'" << "\n";
|
||||||
}
|
}
|
||||||
return searchPath;
|
return searchPath;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
std::cout << "Please specify the directory where this library is located (or enter 'quit' to abort): "; fflush(stdout);
|
std::cout << "\nPlease specify the directory where this library is located (or enter 'quit' to abort): ";
|
||||||
|
// fflush(stdout);
|
||||||
|
|
||||||
std::string prefix;
|
std::string prefix;
|
||||||
std::cin >> prefix;
|
std::cin >> prefix;
|
||||||
std::cout << std::endl;
|
// std::cout << std::endl;
|
||||||
|
|
||||||
|
// getline(std::cin, prefix);
|
||||||
|
|
||||||
if (prefix.compare("quit") == 0)
|
if (prefix.compare("quit") == 0)
|
||||||
exit(1);
|
exit(1);
|
||||||
@ -149,14 +152,12 @@ std::string getUserInputDirForFile(const std::string& filename)
|
|||||||
prefix += "/";
|
prefix += "/";
|
||||||
|
|
||||||
if (!fileExists(prefix+filename)) {
|
if (!fileExists(prefix+filename)) {
|
||||||
std::cerr << (prefix+filename) << " does not exist. Try again" << std::endl;
|
std::cerr << (prefix+filename) << " does not exist. Try again\n";
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (Settings::verboseOutput()) {
|
std::cerr << (prefix+filename) << " was found.\n"
|
||||||
std::cerr << (prefix+filename) << " was found.\n"
|
<< "/!\\ WARNINGS: dylibbundler MAY NOT CORRECTLY HANDLE THIS DEPENDENCY: Check the executable with 'otool -L'\n";
|
||||||
<< "/!\\ dylibbundler MAY NOT CORRECTLY HANDLE THIS DEPENDENCY: Check the executable with 'otool -L'" << std::endl;
|
|
||||||
}
|
|
||||||
return prefix;
|
return prefix;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -106,7 +106,7 @@ int main (int argc, char * const argv[])
|
|||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::cout << "* Collecting dependencies"; fflush(stdout);
|
std::cout << "* Collecting dependencies...\n";
|
||||||
|
|
||||||
const int amount = Settings::fileToFixAmount();
|
const int amount = Settings::fileToFixAmount();
|
||||||
for (int n=0; n<amount; n++)
|
for (int n=0; n<amount; n++)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user