builder(b),
no_externals(false),
env_set(false)
-{
- pkg_path.push_back(builder.get_work_directory()/".");
- pkg_path.push_back(builder.get_work_directory()/"..");
-}
+{ }
PackageManager::~PackageManager()
{
delete i->second;
}
+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;
}
}
+ FS::Path path = get_binary_package_file(name);
+ if(!path.empty())
+ {
+ builder.load_build_file(path);
+ i = packages.find(name);
+ if(i!=packages.end())
+ return i->second;
+ }
+
Package *pkg = 0;
try
{
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(...)
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);
+ 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");
- 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))
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;
+ }
+
+ 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;
}