clean up & refine formatting

This commit is contained in:
SCG82 2019-12-14 13:03:55 -08:00
parent fa16d5e817
commit b611a1bc63
7 changed files with 79 additions and 200 deletions

View File

@ -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);
} }
} }

View File

@ -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));

View File

@ -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

View File

@ -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

View File

@ -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)
{ {

View File

@ -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;
} }
} }

View File

@ -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++)