]> git.tdb.fi Git - builder.git/blobdiff - source/packagemanager.cpp
Deal with static build flags for binary packages
[builder.git] / source / packagemanager.cpp
index 55498467d636a694f957e58a3dd475fd3b185b87..2319c5a906022ffab072e09eb87531e888d08d95 100644 (file)
@@ -19,6 +19,7 @@ using namespace Msp;
 PackageManager::PackageManager(Builder &b):
        builder(b),
        no_externals(false),
+       main_pkg(0),
        env_set(false)
 { }
 
@@ -33,6 +34,11 @@ void PackageManager::append_package_path(const FS::Path &p)
        pkg_path.push_back(p);
 }
 
+void PackageManager::append_binary_package_path(const FS::Path &p)
+{
+       binpkg_path.push_back(p);
+}
+
 void PackageManager::set_no_externals(bool x)
 {
        no_externals = x;
@@ -49,45 +55,72 @@ 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(format("%s/%s", name, builder.get_current_arch().get_system()));
-       if(i==packages.end())
-               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;
                }
        }
 
-       Package *pkg = 0;
+       FS::Path path = get_binary_package_file(name);
+       if(!path.empty())
+       {
+               builder.load_build_file(path);
+               if(Package *pkg = get_package(name))
+                       return pkg;
+       }
+
        try
        {
                // Package source not found - create a binary package
                string flags_str = run_pkgconfig(name, "flags");
-               vector<string> 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)
@@ -119,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);
@@ -149,7 +184,7 @@ FS::Path PackageManager::get_package_location(const string &name)
 
        if(pkg_dirs.empty())
        {
-               for(list<FS::Path>::const_iterator i=pkg_path.begin(); i!=pkg_path.end(); ++i)
+               for(SearchPath::const_iterator i=pkg_path.begin(); i!=pkg_path.end(); ++i)
                {
                        builder.get_logger().log("files", format("Traversing %s", *i));
                        list<string> files = list_files(*i);
@@ -171,9 +206,9 @@ FS::Path PackageManager::get_package_location(const string &name)
        }
 
        bool msp = !name.compare(0, 3, "msp");
-       for(list<FS::Path>::const_iterator i=pkg_dirs.begin(); i!=pkg_dirs.end(); ++i)
+       for(SearchPath::const_iterator i=pkg_dirs.begin(); i!=pkg_dirs.end(); ++i)
        {
-               string base = basename(*i);
+               string base = FS::basename(*i);
                unsigned dash = base.rfind('-');
 
                if(!base.compare(0, dash, name))
@@ -184,3 +219,37 @@ FS::Path PackageManager::get_package_location(const string &name)
 
        return FS::Path();
 }
+
+FS::Path PackageManager::get_binary_package_file(const string &name)
+{
+       builder.get_logger().log("packagemgr", format("Looking for binary package %s", name));
+
+       if(binpkg_files.empty())
+       {
+               for(list<FS::Path>::const_iterator i=binpkg_path.begin(); i!=binpkg_path.end(); ++i)
+               {
+                       builder.get_logger().log("files", format("Traversing %s", *i));
+                       list<string> files = list_filtered(*i, "\\.bpk$");
+                       for(list<string>::const_iterator j=files.begin(); j!=files.end(); ++j)
+                               binpkg_files.push_back(*i / *j);
+                       builder.get_logger().log("packagemgr", format("%d binary packages found in %s", files.size(), *i));
+               }
+
+               builder.get_logger().log("packagemgr", format("%d binary packages found", binpkg_files.size()));
+       }
+
+       for(SearchPath::const_iterator i=binpkg_files.begin(); i!=binpkg_files.end(); ++i)
+       {
+               string base = FS::basepart(FS::basename(*i));
+               if(base==name)
+                       return *i;
+       }
+
+       return FS::Path();
+}
+
+void PackageManager::save_all_caches() const
+{
+       for(PackageMap::const_iterator i=packages.begin(); i!=packages.end(); ++i)
+               i->second->save_caches();
+}