From: Mikko Rasa Date: Thu, 4 May 2023 08:35:15 +0000 (+0300) Subject: Refactor gathering of package dependencies X-Git-Url: https://git.tdb.fi/?a=commitdiff_plain;h=743087820451bb32e8f97cbd3afd5de3997faa77;p=builder.git Refactor gathering of package dependencies --- diff --git a/plugins/msvc/vssolutionfile.cpp b/plugins/msvc/vssolutionfile.cpp index 38908df..1775f7b 100644 --- a/plugins/msvc/vssolutionfile.cpp +++ b/plugins/msvc/vssolutionfile.cpp @@ -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(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(project))) - { - add_dependency(*project); - - for(const Package *r: spkg.get_required_packages()) - if(const SourcePackage *s = dynamic_cast(r)) - find_dependencies(*s); - } + add_dependency(*project); } diff --git a/plugins/msvc/vssolutionfile.h b/plugins/msvc/vssolutionfile.h index 2c1e602..22da8e8 100644 --- a/plugins/msvc/vssolutionfile.h +++ b/plugins/msvc/vssolutionfile.h @@ -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 diff --git a/source/lib/component.cpp b/source/lib/component.cpp index 1ba258b..cbdc145 100644 --- a/source/lib/component.cpp +++ b/source/lib/component.cpp @@ -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 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; diff --git a/source/lib/component.h b/source/lib/component.h index 2901f1b..f874149 100644 --- a/source/lib/component.h +++ b/source/lib/component.h @@ -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 &get_problems() const { return problems; } diff --git a/source/lib/package.cpp b/source/lib/package.cpp index 0c3adc5..719d4da 100644 --- a/source/lib/package.cpp +++ b/source/lib/package.cpp @@ -1,3 +1,4 @@ +#include #include #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) diff --git a/source/lib/package.h b/source/lib/package.h index 4d2c8dd..ce1a3a4 100644 --- a/source/lib/package.h +++ b/source/lib/package.h @@ -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 diff --git a/source/lib/sourcepackage.cpp b/source/lib/sourcepackage.cpp index dabda21..03f9139 100644 --- a/source/lib/sourcepackage.cpp +++ b/source/lib/sourcepackage.cpp @@ -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(); diff --git a/source/lib/sourcepackage.h b/source/lib/sourcepackage.h index c311c21..de09163 100644 --- a/source/lib/sourcepackage.h +++ b/source/lib/sourcepackage.h @@ -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;