]> git.tdb.fi Git - builder.git/blobdiff - source/builder.cpp
Refactor build graph into its own class
[builder.git] / source / builder.cpp
index 813f8ed788deff1c85f8eca5810134e85f8cfb63..8b900a4987af9230c4f8d860a004bcb49379825a 100644 (file)
@@ -38,6 +38,7 @@ Builder::Builder(int argc, char **argv):
        native_arch(*this, string()),
        build_type(0),
        vfs(*this),
+       build_graph(*this),
        analyzer(0),
        build(false),
        clean(0),
@@ -209,8 +210,6 @@ Builder::Builder(int argc, char **argv):
 
 Builder::~Builder()
 {
-       for(TargetMap::iterator i=targets.begin(); i!=targets.end(); ++i)
-               delete i->second;
        delete analyzer;
 }
 
@@ -271,7 +270,8 @@ int Builder::main()
 
                        unsigned count = 0;
                        unsigned to_be_built = 0;
-                       for(TargetMap::iterator j=targets.begin(); j!=targets.end(); ++j)
+                       const BuildGraph::TargetMap &targets = build_graph.get_targets();
+                       for(BuildGraph::TargetMap::const_iterator j=targets.begin(); j!=targets.end(); ++j)
                                if(j->second->get_package()==i->second)
                                {
                                        ++count;
@@ -290,7 +290,7 @@ int Builder::main()
                package_details.push_back(line);
        }
 
-       logger.log("summary", format("%d active packages, %d targets", package_details.size(), targets.size()));
+       logger.log("summary", format("%d active packages, %d targets", package_details.size(), build_graph.get_targets().size()));
        for(list<string>::const_iterator i=package_details.begin(); i!=package_details.end(); ++i)
                logger.log("packages", *i);
 
@@ -315,42 +315,11 @@ int Builder::main()
        return exit_code;
 }
 
-Target *Builder::get_target(const string &n) const
-{
-       TargetMap::const_iterator i = targets.find(n);
-       if(i!=targets.end())
-               return i->second;
-       return 0;
-}
-
 void Builder::problem(const string &p, const string &d)
 {
        problems.push_back(Problem(p, d));
 }
 
-void Builder::add_target(Target *t)
-{
-       targets.insert(TargetMap::value_type(t->get_name(), t));
-}
-
-void Builder::add_primary_target(Target &t)
-{
-       get_target("world")->add_dependency(t);
-
-       if(t.get_package()==main_pkg && t.get_component() && t.get_component()->is_default())
-               get_target("default")->add_dependency(t);
-}
-
-void Builder::add_installed_target(Target &t)
-{
-       Target *inst_tgt = 0;
-       if(const Tool *tool = t.get_tool())
-               inst_tgt = tool->create_install(t);
-       if(!inst_tgt)
-               inst_tgt = toolchain.get_tool("CP").create_target(t);
-       get_target("install")->add_dependency(*inst_tgt);
-}
-
 void Builder::usage(const char *reason, const char *argv0, bool brief)
 {
        if(reason)
@@ -380,24 +349,13 @@ void Builder::load_build_file(const FS::Path &fn)
 
 bool Builder::prepare_build()
 {
-       Target *world = new VirtualTarget(*this, "world");
-
-       Target *def_tgt = new VirtualTarget(*this, "default");
-       world->add_dependency(*def_tgt);
-
-       Target *install = new VirtualTarget(*this, "install");
-       world->add_dependency(*install);
-
-       Target *tarballs = new VirtualTarget(*this, "tarballs");
-       world->add_dependency(*tarballs);
-
        package_manager.get_main_package().prepare();
 
        // Make the cmdline target depend on all targets mentioned on the command line
        Target *cmdline = new VirtualTarget(*this, "cmdline");
        for(NameList::iterator i=cmdline_targets.begin(); i!=cmdline_targets.end(); ++i)
        {
-               Target *tgt = get_target(*i);
+               Target *tgt = build_graph.get_target(*i);
                if(!tgt)
                        tgt = vfs.get_target(*i);
                if(!tgt)
@@ -444,9 +402,10 @@ bool Builder::prepare_build()
 
 int Builder::do_build()
 {
-       Target *cmdline = get_target("cmdline");
+       Target *cmdline = build_graph.get_target("cmdline");
 
        unsigned total = 0;
+       const BuildGraph::TargetMap &targets = build_graph.get_targets();
        for(map<string, Target *>::const_iterator i=targets.begin(); i!=targets.end(); ++i)
                if(i->second->is_buildable() && i->second->needs_rebuild())
                        ++total;
@@ -550,7 +509,7 @@ int Builder::do_clean()
 
        set<Target *> clean_tgts;
        list<Target *> queue;
-       queue.push_back(get_target("cmdline"));
+       queue.push_back(build_graph.get_target("cmdline"));
 
        while(!queue.empty())
        {