]> git.tdb.fi Git - builder.git/blobdiff - source/buildgraph.cpp
Add gcc's private library directory to ClangLinker's system path
[builder.git] / source / buildgraph.cpp
index 8c0ff1272507a7336bfaee32461f4b83e5eaace7..070f934f6665edaa079885a1f8efa7b1f864e76b 100644 (file)
@@ -8,23 +8,24 @@
 using namespace std;
 
 BuildGraph::BuildGraph(Builder &b):
-       builder(b)
+       builder(b),
+       goals(new VirtualTarget(builder, "goals"))
 {
        Target *world = new VirtualTarget(builder, "world");
        world->add_dependency(*new VirtualTarget(builder, "default"));
        world->add_dependency(*new VirtualTarget(builder, "install"));
-       world->add_dependency(*new VirtualTarget(builder, "tarballs"));
+       world->add_dependency(*new VirtualTarget(builder, "archives"));
 }
 
 BuildGraph::~BuildGraph()
 {
-       for(TargetMap::iterator i=targets.begin(); i!=targets.end(); ++i)
-               delete i->second;
+       for(const auto &kvp: targets)
+               delete kvp.second;
 }
 
 Target *BuildGraph::get_target(const string &n) const
 {
-       TargetMap::const_iterator i = targets.find(n);
+       auto i = targets.find(n);
        if(i!=targets.end())
                return i->second;
        return 0;
@@ -32,7 +33,7 @@ Target *BuildGraph::get_target(const string &n) const
 
 void BuildGraph::add_target(Target *t)
 {
-       targets.insert(TargetMap::value_type(t->get_name(), t));
+       targets.insert({ t->get_name(), t });
 }
 
 void BuildGraph::add_primary_target(Target &t)
@@ -53,3 +54,36 @@ void BuildGraph::add_installed_target(Target &t)
                inst_tgt = builder.get_toolchain().get_tool("CP").create_target(t);
        get_target("install")->add_dependency(*inst_tgt);
 }
+
+void BuildGraph::add_goal(Target &t)
+{
+       goals->add_dependency(t);
+}
+
+void BuildGraph::prepare()
+{
+       if(goals->get_dependencies().empty())
+               add_goal(*get_target("default"));
+       goals->prepare();
+}
+
+void BuildGraph::force_full_rebuild()
+{
+       for(const auto &kvp: targets)
+               if(kvp.second->is_buildable() && !kvp.second->needs_rebuild())
+                       kvp.second->force_rebuild();
+}
+
+unsigned BuildGraph::count_rebuild_targets() const
+{
+       unsigned count = 0;
+       for(const auto &kvp: targets)
+               if(kvp.second->is_buildable() && kvp.second->needs_rebuild())
+                       ++count;
+       return count;
+}
+
+Target *BuildGraph::get_buildable_target() const
+{
+       return goals->get_buildable_target();
+}