X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fpackagemanager.cpp;h=fc198814591f3f90a70af0dedbd4636ec859b142;hb=1e406373b33a5eb3e881fdd95e9ce33881fae2cd;hp=68189205abb8022ba1f272c0a066e4b1a210fa1f;hpb=519f2006e8b33e9b14fdc985766ab4e4e869544b;p=builder.git diff --git a/source/packagemanager.cpp b/source/packagemanager.cpp index 6818920..fc19881 100644 --- a/source/packagemanager.cpp +++ b/source/packagemanager.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -17,11 +18,9 @@ using namespace Msp; PackageManager::PackageManager(Builder &b): builder(b), - no_externals(false) -{ - pkg_path.push_back(builder.get_cwd()/"."); - pkg_path.push_back(builder.get_cwd()/".."); -} + no_externals(false), + env_set(false) +{ } PackageManager::~PackageManager() { @@ -29,6 +28,11 @@ PackageManager::~PackageManager() delete i->second; } +void PackageManager::append_package_path(const FS::Path &p) +{ + pkg_path.push_back(p); +} + void PackageManager::set_no_externals(bool x) { no_externals = x; @@ -59,8 +63,9 @@ Package *PackageManager::find_package(const string &name) if(!no_externals) { FS::Path path = get_package_location(name); - if(!path.empty() && !builder.load_build_file(path/"Build")) + if(!path.empty()) { + builder.load_build_file(path/"Build"); i = packages.find(name); if(i!=packages.end()) return i->second; @@ -87,6 +92,29 @@ Package *PackageManager::find_package(const string &name) string PackageManager::run_pkgconfig(const string &pkg, const string &what) { + if(!env_set) + { + const FS::Path &prefix = builder.get_prefix(); + if(prefix.str()!="/usr") + { + FS::Path pcdir = prefix/"lib/pkgconfig"; + if(const char *pcp = getenv("PKG_CONFIG_PATH")) + { + vector path = split(pcp, ':'); + bool found = false; + for(vector::const_iterator i=path.begin(); (!found && i!=path.end()); ++i) + found = (*i==pcdir.str()); + if(!found) + { + path.push_back(pcdir.str()); + setenv("PKG_CONFIG_PATH", join(path.begin(), path.end(), ":").c_str(), true); + } + } + else + setenv("PKG_CONFIG_PATH", pcdir.str().c_str(), true); + } + } + ExternalTask::Arguments argv; argv.push_back("pkg-config"); if(what=="cflags" || what=="libs") @@ -102,17 +130,7 @@ string PackageManager::run_pkgconfig(const string &pkg, const string &what) builder.get_logger().log("auxcommands", format("Running %s", join(argv.begin(), argv.end()))); - ExternalTask task(argv); - task.set_stdout(ExternalTask::CAPTURE); - task.set_stderr(ExternalTask::IGNORE); - task.start(); - Task::Status status; - while((status=task.check())==Task::RUNNING) - Time::sleep(10*Time::msec); - if(status==Task::ERROR) - throw runtime_error(format("pkg-config for package %s failed", pkg)); - - return task.get_output(); + return ExternalTask::run_and_capture_output(argv); } FS::Path PackageManager::get_package_location(const string &name) @@ -123,7 +141,7 @@ FS::Path PackageManager::get_package_location(const string &name) { // Try to get source directory with pkgconfig string srcdir = strip(run_pkgconfig(name, "source")); - if(!srcdir.empty()) + if(!srcdir.empty() && FS::exists(FS::Path(srcdir)/"Build")) return srcdir; } catch(...) @@ -133,6 +151,7 @@ FS::Path PackageManager::get_package_location(const string &name) { for(list::const_iterator i=pkg_path.begin(); i!=pkg_path.end(); ++i) { + builder.get_logger().log("files", format("Traversing %s", *i)); list files = list_files(*i); for(list::const_iterator j=files.begin(); j!=files.end(); ++j) { @@ -152,7 +171,7 @@ FS::Path PackageManager::get_package_location(const string &name) if(!base.compare(0, dash, name)) return *i; - else if(msp && !base.compare(0, dash-3, name, 3, string::npos)) + else if(msp && !base.compare(0, dash, name, 3, string::npos)) return *i; }