]> git.tdb.fi Git - builder.git/blobdiff - source/lib/buildgraph.cpp
Rearrange sources into subdirectories
[builder.git] / source / lib / buildgraph.cpp
diff --git a/source/lib/buildgraph.cpp b/source/lib/buildgraph.cpp
new file mode 100644 (file)
index 0000000..070f934
--- /dev/null
@@ -0,0 +1,89 @@
+#include "builder.h"
+#include "buildgraph.h"
+#include "component.h"
+#include "sourcepackage.h"
+#include "tool.h"
+#include "virtualtarget.h"
+
+using namespace std;
+
+BuildGraph::BuildGraph(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, "archives"));
+}
+
+BuildGraph::~BuildGraph()
+{
+       for(const auto &kvp: targets)
+               delete kvp.second;
+}
+
+Target *BuildGraph::get_target(const string &n) const
+{
+       auto i = targets.find(n);
+       if(i!=targets.end())
+               return i->second;
+       return 0;
+}
+
+void BuildGraph::add_target(Target *t)
+{
+       targets.insert({ t->get_name(), t });
+}
+
+void BuildGraph::add_primary_target(Target &t)
+{
+       get_target("world")->add_dependency(t);
+
+       Package *main_pkg = &builder.get_package_manager().get_main_package();
+       if(t.get_package()==main_pkg && t.get_component() && t.get_component()->is_default())
+               get_target("default")->add_dependency(t);
+}
+
+void BuildGraph::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 = 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();
+}