]> git.tdb.fi Git - builder.git/blobdiff - source/packagemanager.cpp
Improve output from PackageManager::get_package_location
[builder.git] / source / packagemanager.cpp
index 68189205abb8022ba1f272c0a066e4b1a210fa1f..55498467d636a694f957e58a3dd475fd3b185b87 100644 (file)
@@ -1,3 +1,4 @@
+#include <cstdlib>
 #include <msp/fs/dir.h>
 #include <msp/fs/stat.h>
 #include <msp/fs/utils.h>
@@ -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<string> path = split(pcp, ':');
+                               bool found = false;
+                               for(vector<string>::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,28 +130,18 @@ 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)
 {
-       builder.get_logger().log("packagemgr", format("Looking for package %s", name));
+       builder.get_logger().log("packagemgr", format("Looking for source package %s", name));
 
        try
        {
                // 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,15 +151,23 @@ FS::Path PackageManager::get_package_location(const string &name)
        {
                for(list<FS::Path>::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);
+                       unsigned count = 0;
                        for(list<string>::const_iterator j=files.begin(); j!=files.end(); ++j)
                        {
                                FS::Path full = *i / *j;
                                if(FS::exists(full/"Build"))
+                               {
                                        pkg_dirs.push_back(full);
+                                       ++count;
+                               }
                        }
+
+                       builder.get_logger().log("packagemgr", format("%d source packages found in %s", count, *i));
                }
-               builder.get_logger().log("packagemgr", format("%d packages found in path", pkg_dirs.size()));
+
+               builder.get_logger().log("packagemgr", format("%d source packages found", pkg_dirs.size()));
        }
 
        bool msp = !name.compare(0, 3, "msp");
@@ -152,7 +178,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;
        }