X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flib%2Fbuilder.cpp;h=738361bce2d3553db15844bc19b7e6e5a7353924;hb=19de47d18af9c3021d77a7f84622a352adbd6ae5;hp=72ee524dffe41fc22111863953d1549e5ad22a67;hpb=1dd53b56788697971f7aff08232aa91e610c3592;p=builder.git diff --git a/source/lib/builder.cpp b/source/lib/builder.cpp index 72ee524..738361b 100644 --- a/source/lib/builder.cpp +++ b/source/lib/builder.cpp @@ -12,20 +12,14 @@ #include #include #include -#include "android/androidtools.h" #include "binarypackage.h" #include "builder.h" -#include "builtin/builtintools.h" -#include "clang/clangtools.h" -#include "datafile/datatool.h" -#include "gnu/gnutools.h" #include "installedfile.h" -#include "msvc/microsofttools.h" #include "package.h" #include "plugin.h" #include "sharedlibrary.h" -#include "sourcepackage.h" #include "task.h" +#include "tool.h" #include "virtualtarget.h" using namespace std; @@ -85,8 +79,6 @@ void Builder::load_plugins() { logger->log("plugins", "Failed to initialize plugin %s: %s", f, exc.what()); } - - delete plugin.module; } } @@ -146,14 +138,6 @@ void Builder::update_auto_prefix() void Builder::add_default_tools() { - toolchain.add_toolchain(new GnuTools(*this, *current_arch)); - toolchain.add_toolchain(new ClangTools(*this, *current_arch)); - if(current_arch->get_system()=="android") - toolchain.add_toolchain(new AndroidTools(*this, *current_arch)); - if(current_arch->get_system()=="windows") - toolchain.add_toolchain(new MicrosoftTools(*this, *current_arch)); - toolchain.add_toolchain(new BuiltinTools(*this)); - toolchain.add_tool(new DataTool(*this)); for(const LoadedPlugin &p: plugins) p.plugin->add_tools(toolchain, *current_arch); @@ -173,46 +157,71 @@ void Builder::set_logger(const Logger *l) vector Builder::collect_problems() const { + vector target_problems; vector problems; - set broken_packages; - set broken_components; - set broken_tools; + vector broken_packages; + vector broken_components; + vector broken_tools; for(const auto &kvp: build_graph.get_targets()) if(kvp.second->is_broken()) { - for(const string &p: kvp.second->get_problems()) - problems.push_back(format("%s: %s", kvp.second->get_name(), p)); - const Package *package = kvp.second->get_package(); - if(package && !package->get_problems().empty()) - broken_packages.insert(package); + if(package && package->is_broken()) + collect_broken_packages(*package, broken_packages); const Component *component = kvp.second->get_component(); - if(component && !component->get_problems().empty()) - broken_components.insert(component); + if(component && component->is_broken() && !any_equals(broken_components, component)) + { + broken_components.push_back(component); + collect_broken_packages(component->get_package(), broken_packages); + for(const Package *r: component->get_required_packages()) + if(r->is_broken()) + collect_broken_packages(*r, broken_packages); + } const Tool *tool = kvp.second->get_tool(); - if(tool && !tool->get_problems().empty()) - broken_tools.insert(tool); + if(tool && tool->is_broken() && !any_equals(broken_tools, tool)) + { + broken_tools.push_back(tool); + for(const string &p: tool->get_problems()) + problems.push_back(format("%s: %s", tool->get_tag(), p)); + } + + for(const string &p: kvp.second->get_problems()) + target_problems.push_back(format("%s: %s", kvp.second->get_name(), p)); } - // TODO Sort components after their packages, and targets last for(const Package *p: broken_packages) + { for(const string &b: p->get_problems()) problems.push_back(format("%s: %s", p->get_name(), b)); - for(const Component *c: broken_components) - for(const string &b: c->get_problems()) - problems.push_back(format("%s/%s: %s", c->get_package().get_name(), c->get_name(), b)); + for(const Component *c: broken_components) + if(&c->get_package()==p) + { + for(const string &b: c->get_problems()) + problems.push_back(format("%s/%s: %s", p->get_name(), c->get_name(), b)); + } + } - for(const Tool *t: broken_tools) - for(const string &b: t->get_problems()) - problems.push_back(format("%s: %s", t->get_tag(), b)); + problems.insert(problems.end(), make_move_iterator(target_problems.begin()), make_move_iterator(target_problems.end())); return problems; } +void Builder::collect_broken_packages(const Package &pkg, vector &broken) const +{ + if(any_equals(broken, &pkg)) + return; + + broken.push_back(&pkg); + + for(const Package *r: pkg.get_required_packages()) + if(r->is_broken()) + collect_broken_packages(*r, broken); +} + void Builder::load_build_file(const FS::Path &fn, const Config::InputOptions *opts, bool all) { IO::BufferedFile in(fn.str());