]> git.tdb.fi Git - builder.git/commitdiff
Refactor gathering of package dependencies
authorMikko Rasa <tdb@tdb.fi>
Thu, 4 May 2023 08:35:15 +0000 (11:35 +0300)
committerMikko Rasa <tdb@tdb.fi>
Thu, 4 May 2023 08:35:15 +0000 (11:35 +0300)
plugins/msvc/vssolutionfile.cpp
plugins/msvc/vssolutionfile.h
source/lib/component.cpp
source/lib/component.h
source/lib/package.cpp
source/lib/package.h
source/lib/sourcepackage.cpp
source/lib/sourcepackage.h

index 38908df99ff7c842815db0363330992137328a11..1775f7b11cf4e3afb1982b7b02244f26443b832c 100644 (file)
@@ -14,18 +14,17 @@ VsSolutionFile::VsSolutionFile(Builder &b, const SourcePackage &p):
 
 void VsSolutionFile::find_dependencies()
 {
-       find_dependencies(*package);
+       add_project(*package);
+
+       Package::Requirements reqs;
+       package->collect_required_packages(reqs);
+       for(const Package *p: reqs)
+               if(const SourcePackage *spkg = dynamic_cast<const SourcePackage *>(p))
+                       add_project(*spkg);
 }
 
-void VsSolutionFile::find_dependencies(const SourcePackage &spkg)
+void VsSolutionFile::add_project(const SourcePackage &spkg)
 {
        if(FileTarget *project = builder.get_vfs().get_target(spkg.get_source_directory()/(spkg.get_name()+".vcxproj")))
-               if(!any_equals(depends, static_cast<Target *>(project)))
-               {
-                       add_dependency(*project);
-
-                       for(const Package *r: spkg.get_required_packages())
-                               if(const SourcePackage *s = dynamic_cast<const SourcePackage *>(r))
-                                       find_dependencies(*s);
-               }
+               add_dependency(*project);
 }
index 2c1e602a333c646c02767db738cea163e6c301c3..22da8e836fc56ac53f972b4a1972bd44df60a591 100644 (file)
@@ -11,7 +11,8 @@ public:
        const char *get_type() const override { return "VsSolutionFile"; }
 protected:
        void find_dependencies() override;
-       void find_dependencies(const SourcePackage &);
+private:
+       void add_project(const SourcePackage &);
 };
 
 #endif
index 1ba258bd70a00f4011587bd3617ccff24796a7ce..cbdc145b11e229df42ea1fba3d649d29785a48ec 100644 (file)
@@ -51,25 +51,17 @@ void Component::create_build_info()
        const Package::Requirements &pkg_reqs = package.get_required_packages();
        Package::Requirements direct_reqs = required_pkgs;
        direct_reqs.insert(direct_reqs.end(), pkg_reqs.begin(), pkg_reqs.end());
+       Package::Requirements chained_reqs;
        for(Package *r: direct_reqs)
-               final_build_info.update_from(r->get_exported_build_info(), BuildInfo::DEPENDENCY);
-
-       Package::Requirements all_reqs = direct_reqs;
-       deque<Package *> queue(direct_reqs.begin(), direct_reqs.end());
-       while(!queue.empty())
        {
-               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(r->get_exported_build_info(), BuildInfo::DEPENDENCY);
+               r->Package::collect_required_packages(chained_reqs);
        }
 
+       for(Package *r: chained_reqs)
+               if(!any_equals(direct_reqs, r))
+            final_build_info.update_from(r->get_exported_build_info(), BuildInfo::CHAINED);
+
        final_build_info.update_from(package.get_build_info());
        final_build_info.update_from(build_info);
        build_info = final_build_info;
@@ -80,6 +72,13 @@ void Component::create_build_info()
                p = (package.get_source_directory()/p).str();
 }
 
+void Component::collect_required_packages(Package::Requirements &reqs) const
+{
+       for(Package *p: required_pkgs)
+               if(!any_equals(reqs, p))
+                       reqs.push_back(p);
+}
+
 FS::Path Component::get_temp_directory() const
 {
        return package.get_temp_directory()/name;
index 2901f1b1fc53f3ba2c0e6deddbcca98f8143637b..f874149a239a8b993c53332d83037b6694e32397 100644 (file)
@@ -68,6 +68,7 @@ public:
        bool get_install() const { return install; }
        const InstallMap &get_install_map() const { return install_map; }
        const Package::Requirements &get_required_packages() const { return required_pkgs; }
+       void collect_required_packages(Package::Requirements &) const;
        bool is_default() const { return deflt; }
        bool is_broken() const { return broken; }
        const std::vector<std::string> &get_problems() const { return problems; }
index 0c3adc5eb1137756f5f7c455ea99b49d37776d85..719d4da389809badbbd9e1fc61e42e757a9911db 100644 (file)
@@ -1,3 +1,4 @@
+#include <msp/core/algorithm.h>
 #include <msp/strings/format.h>
 #include "builder.h"
 #include "package.h"
@@ -13,6 +14,16 @@ Package::Package(Builder &b, const string &n):
        builder.get_package_manager().add_package(this);
 }
 
+void Package::collect_required_packages(Requirements &reqs) const
+{
+       for(Package *p: required_pkgs)
+               if(!any_equals(reqs, p))
+               {
+                       reqs.push_back(p);
+                       p->collect_required_packages(reqs);
+               }
+}
+
 void Package::prepare()
 {
        if(prepared)
index 4d2c8dd2b454eb2bd2be18dd02049b6d7b4ffd34..ce1a3a40fc741adf8effe22acb37dd835b684a8d 100644 (file)
@@ -52,6 +52,9 @@ public:
        const std::string &get_label() const { return label; }
        const Requirements &get_required_packages() const { return required_pkgs; }
 
+       /// Recursively gathers all packages required by this package.
+       virtual void collect_required_packages(Requirements &) const;
+
        const BuildInfo &get_exported_build_info() const { return export_binfo; }
 
        /// Indicates whether or not this package supports pkg-config
index dabda21c99735ec0983171ccba76682848044c87..03f91395f7f9f4375ef9813c853ff4be3466a10e 100644 (file)
@@ -40,6 +40,13 @@ SourcePackage::~SourcePackage()
                delete c;
 }
 
+void SourcePackage::collect_required_packages(Requirements &reqs) const
+{
+       Package::collect_required_packages(reqs);
+       for(Component *c: components)
+               c->collect_required_packages(reqs);
+}
+
 FS::Path SourcePackage::get_temp_directory() const
 {
        string subdir = builder.get_current_arch().get_name();
index c311c210e86431f06fffd6a2932ffa49604deaea..de0916376a25ab8ae3e213abf2e2a9e227bd436b 100644 (file)
@@ -90,6 +90,10 @@ public:
        const std::string &get_interface_version() const { return interface_version; }
        const std::string &get_description() const { return description; }
 
+       /** Recursively gathers all packages required by this package, including
+       those required by components. */
+       void collect_required_packages(Requirements &) const override;
+
        FileTarget &get_build_file() const { return *build_file; }
        const Msp::FS::Path &get_source_directory() const { return source_dir; }
        Msp::FS::Path get_temp_directory() const;