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);
}
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
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;
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;
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; }
+#include <msp/core/algorithm.h>
#include <msp/strings/format.h>
#include "builder.h"
#include "package.h"
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)
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
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();
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;