X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcomponent.cpp;h=4fddcef79de59a9ca0ca6cf05e8a5b71ec565a79;hb=451ef4f33b5a57dcb56bd7cb671bed359ac86247;hp=0e183b5fc8039e509a0fecc87e9f4f66a8a138f5;hpb=7c2db9e2b91da953701be233336c5bfa1f3c4af0;p=builder.git diff --git a/source/component.cpp b/source/component.cpp index 0e183b5..4fddcef 100644 --- a/source/component.cpp +++ b/source/component.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -10,13 +11,6 @@ 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) @@ -30,18 +24,23 @@ void Component::create_build_info() 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 queue(direct_reqs.begin(), direct_reqs.end()); + while(!queue.empty()) { - BuildInfo::UpdateLevel level = BuildInfo::CHAINED; - if(find(direct_reqs.begin(), direct_reqs.end(), r)!=direct_reqs.end()) - level = BuildInfo::DEPENDENCY; - final_build_info.update_from(r->get_exported_build_info(), level); - - for(Package *q: r->get_required_packages()) - if(find(all_reqs.begin(), all_reqs.end(), q)==all_reqs.end()) - 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()); @@ -88,14 +87,15 @@ BuildInfo Component::get_build_info_for_path(const FS::Path &path) const return binfo; } -Component::SourceList Component::collect_source_files() const +vector Component::collect_source_files() const { - SourceList files; + vector files; for(const FS::Path &p: sources) { if(FS::is_dir(p)) { - SourceList dirs; + vector dirs; + dirs.reserve(1+overlays.size()); dirs.push_back(p); for(const string &o: overlays) { @@ -106,7 +106,7 @@ Component::SourceList Component::collect_source_files() const set 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())