X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbuilder.cpp;h=92475869235ea98d8139151f83d7145eb31297d5;hb=217889f81407de43d8de469ad93e05b7d334ae0c;hp=bbb95b6634cb03292ae1d37a017bd82094ce6eba;hpb=1dad660f7bbda5ef3239fd6374e0f8a77e19eaaa;p=builder.git diff --git a/source/builder.cpp b/source/builder.cpp index bbb95b6..9247586 100644 --- a/source/builder.cpp +++ b/source/builder.cpp @@ -9,21 +9,17 @@ #include #include #include +#include "androidtools.h" #include "binarypackage.h" #include "builder.h" -#include "copy.h" +#include "builtintools.h" +#include "clangtools.h" #include "datatool.h" -#include "gnuarchiver.h" -#include "gnuccompiler.h" -#include "gnucxxcompiler.h" -#include "gnulinker.h" +#include "gnutools.h" #include "installedfile.h" -#include "mingwdlltool.h" #include "package.h" -#include "pkgconfiggenerator.h" #include "sharedlibrary.h" #include "sourcepackage.h" -#include "tar.h" #include "task.h" #include "virtualtarget.h" @@ -81,15 +77,12 @@ void Builder::set_temp_directory(const FS::Path &p) void Builder::add_default_tools() { - toolchain.add_tool(new GnuCCompiler(*this, *current_arch)); - toolchain.add_tool(new GnuCxxCompiler(*this, *current_arch)); - toolchain.add_tool(new GnuLinker(*this, *current_arch)); - toolchain.add_tool(new GnuArchiver(*this, *current_arch)); - toolchain.add_tool(new Copy(*this)); - toolchain.add_tool(new Tar(*this)); - toolchain.add_tool(new PkgConfigGenerator(*this)); - if(current_arch->get_system()=="windows") - toolchain.add_tool(new MingwDllTool(*this, *current_arch)); + if(current_arch->get_system()=="darwin" && vfs.find_binary("clang")) + toolchain.add_toolchain(new ClangTools(*this, *current_arch)); + if(current_arch->get_system()=="android") + toolchain.add_toolchain(new AndroidTools(*this, *current_arch)); + toolchain.add_toolchain(new GnuTools(*this, *current_arch)); + toolchain.add_toolchain(new BuiltinTools(*this)); toolchain.add_tool(new DataTool(*this)); } @@ -98,9 +91,57 @@ void Builder::set_logger(const Logger *l) logger = (l ? l : &default_logger); } -void Builder::problem(const string &p, const string &d) +list Builder::collect_problems() const { - problems.push_back(Problem(p, d)); + list problems; + set broken_packages; + set broken_components; + set broken_tools; + + const BuildGraph::TargetMap &targets = build_graph.get_targets(); + for(BuildGraph::TargetMap::const_iterator i=targets.begin(); i!=targets.end(); ++i) + if(i->second->is_broken()) + { + const list &tgt_problems = i->second->get_problems(); + for(list::const_iterator j=tgt_problems.begin(); j!=tgt_problems.end(); ++j) + problems.push_back(format("%s: %s", i->second->get_name(), *j)); + + const Package *package = i->second->get_package(); + if(package && !package->get_problems().empty()) + broken_packages.insert(package); + + const Component *component = i->second->get_component(); + if(component && !component->get_problems().empty()) + broken_components.insert(component); + + const Tool *tool = i->second->get_tool(); + if(tool && !tool->get_problems().empty()) + broken_tools.insert(tool); + } + + // TODO Sort components after their packages, and targets last + for(set::const_iterator i=broken_packages.begin(); i!=broken_packages.end(); ++i) + { + const list &pkg_problems = (*i)->get_problems(); + for(list::const_iterator j=pkg_problems.begin(); j!=pkg_problems.end(); ++j) + problems.push_back(format("%s: %s", (*i)->get_name(), *j)); + } + + for(set::const_iterator i=broken_components.begin(); i!=broken_components.end(); ++i) + { + const list &comp_problems = (*i)->get_problems(); + for(list::const_iterator j=comp_problems.begin(); j!=comp_problems.end(); ++j) + problems.push_back(format("%s/%s: %s", (*i)->get_package().get_name(), (*i)->get_name(), *j)); + } + + for(set::const_iterator i=broken_tools.begin(); i!=broken_tools.end(); ++i) + { + const list &tool_problems = (*i)->get_problems(); + for(list::const_iterator j=tool_problems.begin(); j!=tool_problems.end(); ++j) + problems.push_back(format("%s: %s", (*i)->get_tag(), *j)); + } + + return problems; } void Builder::load_build_file(const FS::Path &fn, const Config::InputOptions *opts, bool all) @@ -217,12 +258,12 @@ int Builder::clean(bool all, bool dry_run) set clean_tgts; list queue; - queue.push_back(build_graph.get_target("cmdline")); + queue.push_back(&build_graph.get_goals()); while(!queue.empty()) { Target *tgt = queue.front(); - queue.erase(queue.begin()); + queue.pop_front(); if(tgt->is_buildable() && (tgt->get_package()==&package_manager.get_main_package() || all)) clean_tgts.insert(tgt); @@ -252,7 +293,6 @@ Builder::Loader::Loader(Builder &b, const Config::InputOptions *o, bool a): add("architecture", &Loader::architecture); add("binary_package", &Loader::binpkg); add("build_type", &Loader::build_type); - add("profile", &Loader::profile); add("package", &Loader::package); if(!obj.top_loader) @@ -288,11 +328,6 @@ void Builder::Loader::build_type(const string &n) obj.build_type = &i->second; } -void Builder::Loader::profile(const string &) -{ - IO::print("Profiles are deprecated\n"); -} - void Builder::Loader::package(const string &n) { SourcePackage *pkg = new SourcePackage(obj, n, get_source());