+#include <deque>
#include <msp/core/algorithm.h>
#include <msp/fs/dir.h>
#include <msp/fs/stat.h>
using namespace std;
using namespace Msp;
-Component::Component(SourcePackage &p, const string &n):
- package(p),
- name(n),
- install(false),
- deflt(true)
-{ }
-
void Component::prepare()
{
for(Package *r: requires)
const Package::Requirements &pkg_reqs = package.get_required_packages();
Package::Requirements direct_reqs = requires;
direct_reqs.insert(direct_reqs.end(), pkg_reqs.begin(), pkg_reqs.end());
+ for(Package *r: direct_reqs)
+ final_build_info.update_from(r->get_exported_build_info(), BuildInfo::DEPENDENCY);
Package::Requirements all_reqs = direct_reqs;
- for(Package *r: all_reqs)
+ deque<Package *> queue(direct_reqs.begin(), direct_reqs.end());
+ while(!queue.empty())
{
- BuildInfo::UpdateLevel level = BuildInfo::CHAINED;
- if(any_equals(direct_reqs, r))
- level = BuildInfo::DEPENDENCY;
- final_build_info.update_from(r->get_exported_build_info(), level);
-
- for(Package *q: r->get_required_packages())
- if(!any_equals(all_reqs, q))
- all_reqs.push_back(q);
+ Package *req = queue.front();
+ queue.pop_front();
+
+ for(Package *r: req->get_required_packages())
+ if(!any_equals(all_reqs, r))
+ {
+ final_build_info.update_from(r->get_exported_build_info(), BuildInfo::CHAINED);
+ all_reqs.push_back(r);
+ queue.push_back(r);
+ }
}
final_build_info.update_from(package.get_build_info());
return binfo;
}
-Component::SourceList Component::collect_source_files() const
+vector<FS::Path> Component::collect_source_files() const
{
- SourceList files;
+ vector<FS::Path> files;
for(const FS::Path &p: sources)
{
if(FS::is_dir(p))
{
- SourceList dirs;
+ vector<FS::Path> dirs;
+ dirs.reserve(1+overlays.size());
dirs.push_back(p);
for(const string &o: overlays)
{
set<string> overlay_files;
for(auto j=dirs.begin(); j!=dirs.end(); ++j)
{
- package.get_builder().get_logger().log("files", format("Traversing %s", *j));
+ package.get_builder().get_logger().log("files", "Traversing %s", *j);
for(const string &f: list_files(*j))
{
if(j!=dirs.begin())