]> git.tdb.fi Git - builder.git/blobdiff - source/component.cpp
Refactor logger to do message formatting internally
[builder.git] / source / component.cpp
index 0e183b5fc8039e509a0fecc87e9f4f66a8a138f5..e3f80fbc95b9becfd93c89ec9968784783d90dbf 100644 (file)
@@ -1,3 +1,4 @@
+#include <deque>
 #include <msp/core/algorithm.h>
 #include <msp/fs/dir.h>
 #include <msp/fs/stat.h>
@@ -30,18 +31,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<Package *> 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 +94,15 @@ BuildInfo Component::get_build_info_for_path(const FS::Path &path) const
        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)
                        {
@@ -106,7 +113,7 @@ Component::SourceList Component::collect_source_files() const
                        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())