X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fpackagemanager.cpp;h=2319c5a906022ffab072e09eb87531e888d08d95;hb=21ca3e98081c0dc0430d8e5301591aa71ec4fca2;hp=746755eaf2d36b4afac5273fbfc5fc9375c9f183;hpb=241934daad13f83e86983b474dcadb0190e1cf0b;p=builder.git diff --git a/source/packagemanager.cpp b/source/packagemanager.cpp index 746755e..2319c5a 100644 --- a/source/packagemanager.cpp +++ b/source/packagemanager.cpp @@ -19,6 +19,7 @@ using namespace Msp; PackageManager::PackageManager(Builder &b): builder(b), no_externals(false), + main_pkg(0), env_set(false) { } @@ -54,22 +55,43 @@ void PackageManager::add_package(Package *pkg) throw logic_error("Package is already managed"); } + if(packages.empty()) + main_pkg = pkg; + packages.insert(PackageMap::value_type(pkg->get_name(), pkg)); } -Package *PackageManager::find_package(const string &name) +Package *PackageManager::get_package(const string &name) const { - PackageMap::iterator i = packages.find(name); + PackageMap::const_iterator i = packages.find(name); if(i!=packages.end()) return i->second; + return 0; +} + +Package &PackageManager::get_main_package() const +{ + if(!main_pkg) + throw logic_error("No packages"); + return *main_pkg; +} + +Package *PackageManager::find_package(const string &name) +{ + if(not_found.count(name)) + return 0; + + if(Package *pkg = get_package(name)) + return pkg; + if(!no_externals) { FS::Path path = get_package_location(name); if(!path.empty()) { builder.load_build_file(path/"Build"); - i = packages.find(name); + PackageMap::iterator i = packages.find(name); if(i!=packages.end()) return i->second; } @@ -79,27 +101,26 @@ Package *PackageManager::find_package(const string &name) if(!path.empty()) { builder.load_build_file(path); - i = packages.find(name); - if(i!=packages.end()) - return i->second; + if(Package *pkg = get_package(name)) + return pkg; } - 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); + BinaryPackage::Flags flags = split(flags_str); + flags_str = run_pkgconfig(name, "staticflags"); + BinaryPackage::Flags static_flags = split(flags_str); + Package *pkg = BinaryPackage::from_flags(builder, name, flags, static_flags); + packages.insert(PackageMap::value_type(name, pkg)); + return pkg; } catch(...) { - builder.problem(name, "not found"); + not_found.insert(name); + return 0; } - - packages.insert(PackageMap::value_type(name, pkg)); - - return pkg; } string PackageManager::run_pkgconfig(const string &pkg, const string &what) @@ -131,10 +152,12 @@ string PackageManager::run_pkgconfig(const string &pkg, const string &what) argv.push_back("pkg-config"); if(what=="cflags" || what=="libs") argv.push_back("--"+what); - else if(what=="flags") + else if(what=="flags" || what=="staticflags") { argv.push_back("--cflags"); argv.push_back("--libs"); + if(what=="staticflags") + argv.push_back("--static"); } else argv.push_back("--variable="+what); @@ -224,3 +247,9 @@ FS::Path PackageManager::get_binary_package_file(const string &name) return FS::Path(); } + +void PackageManager::save_all_caches() const +{ + for(PackageMap::const_iterator i=packages.begin(); i!=packages.end(); ++i) + i->second->save_caches(); +}