X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fpackagemanager.cpp;h=9ca11bae94e3b80dd07e94b6509da26b67403561;hb=HEAD;hp=5cc768a648c6d607507342cf977b2879191bd416;hpb=06678c3bb61404c483e4b9c39eaa7e7fb3f40c62;p=builder.git diff --git a/source/packagemanager.cpp b/source/packagemanager.cpp deleted file mode 100644 index 5cc768a..0000000 --- a/source/packagemanager.cpp +++ /dev/null @@ -1,150 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include "binarypackage.h" -#include "builder.h" -#include "externaltask.h" -#include "package.h" -#include "packagemanager.h" - -using namespace std; -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()/".."); -} - -PackageManager::~PackageManager() -{ - for(PackageMap::iterator i=packages.begin(); i!=packages.end(); ++i) - delete i->second; -} - -void PackageManager::set_no_externals(bool x) -{ - no_externals = x; -} - -void PackageManager::add_package(Package *pkg) -{ - PackageMap::iterator i = packages.find(pkg->get_name()); - if(i!=packages.end()) - { - if(i->second!=pkg) - throw invalid_argument("Package name conflict"); - else - throw logic_error("Package is already managed"); - } - - packages.insert(PackageMap::value_type(pkg->get_name(), pkg)); -} - -Package *PackageManager::find_package(const string &name) -{ - PackageMap::iterator i = packages.find(format("%s/%s", name, builder.get_current_arch().get_system())); - if(i==packages.end()) - i = packages.find(name); - if(i!=packages.end()) - return i->second; - - if(!no_externals) - { - FS::Path path = get_package_location(name); - if(!path.empty() && !builder.load_build_file(path/"Build")) - { - i = packages.find(name); - if(i!=packages.end()) - return i->second; - } - } - - Package *pkg = 0; - try - { - // Package source not found - create a binary package - string flags_str = run_pkgconfig(name, "flags"); - vector flags = split(flags_str); - pkg = BinaryPackage::from_flags(builder, name, flags); - } - catch(...) - { - builder.problem(name, "not found"); - } - - packages.insert(PackageMap::value_type(name, pkg)); - - return pkg; -} - -string PackageManager::run_pkgconfig(const string &pkg, const string &what) -{ - ExternalTask::Arguments argv; - argv.push_back("pkg-config"); - if(what=="cflags" || what=="libs") - argv.push_back("--"+what); - else if(what=="flags") - { - argv.push_back("--cflags"); - argv.push_back("--libs"); - } - else - argv.push_back("--variable="+what); - argv.push_back(pkg); - - builder.get_logger().log("auxcommands", format("Running %s", join(argv.begin(), argv.end()))); - - return ExternalTask::run_and_capture_output(argv); -} - -FS::Path PackageManager::get_package_location(const string &name) -{ - builder.get_logger().log("packagemgr", format("Looking for package %s", name)); - - try - { - // Try to get source directory with pkgconfig - string srcdir = strip(run_pkgconfig(name, "source")); - if(!srcdir.empty()) - return srcdir; - } - catch(...) - { } - - if(pkg_dirs.empty()) - { - for(list::const_iterator i=pkg_path.begin(); i!=pkg_path.end(); ++i) - { - list files = list_files(*i); - for(list::const_iterator j=files.begin(); j!=files.end(); ++j) - { - FS::Path full = *i / *j; - if(FS::exists(full/"Build")) - pkg_dirs.push_back(full); - } - } - builder.get_logger().log("packagemgr", format("%d packages found in path", pkg_dirs.size())); - } - - bool msp = !name.compare(0, 3, "msp"); - for(list::const_iterator i=pkg_dirs.begin(); i!=pkg_dirs.end(); ++i) - { - string base = basename(*i); - unsigned dash = base.rfind('-'); - - if(!base.compare(0, dash, name)) - return *i; - else if(msp && !base.compare(0, dash-3, name, 3, string::npos)) - return *i; - } - - return FS::Path(); -}