aboutsummaryrefslogtreecommitdiff
path: root/build/algorithm.cxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2014-12-18 07:14:53 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2014-12-18 07:14:53 +0200
commitc0c85b67516653c181fbce7c61c2df3e31e4edd8 (patch)
tree535467b029b27b190e35064e4babd62825eba6a1 /build/algorithm.cxx
parent835ed5f7080a98e9ee80ac08d5585ccdbb63fe0e (diff)
Initial support for loading dependency info from buildfiles
Also a new iteration on the overall architecture. Now, for the first time, build can read the buildfile and build itself. g++-4.9 -std=c++14 -g -I.. -o bd bd.cxx algorithm.cxx scope.cxx parser.cxx lexer.cxx target.cxx prerequisite.cxx rule.cxx native.cxx cxx/target.cxx cxx/rule.cxx process.cxx timestamp.cxx path.cxx g++-4.9 -std=c++14 -g -I../../.. -o driver driver.cxx ../../../build/lexer.cxx g++-4.9 -std=c++14 -g -I../../.. -o driver driver.cxx ../../../build/lexer.cxx ../../../build/parser.cxx ../../../build/scope.cxx ../../../build/target.cxx ../../../build/native.cxx ../../../build/prerequisite.cxx ../../../build/path.cxx ../../../build/timestamp.cxx
Diffstat (limited to 'build/algorithm.cxx')
-rw-r--r--build/algorithm.cxx93
1 files changed, 93 insertions, 0 deletions
diff --git a/build/algorithm.cxx b/build/algorithm.cxx
new file mode 100644
index 0000000..fac0bf6
--- /dev/null
+++ b/build/algorithm.cxx
@@ -0,0 +1,93 @@
+// file : build/algorithm.cxx -*- C++ -*-
+// copyright : Copyright (c) 2014-2015 Code Synthesis Tools CC
+// license : MIT; see accompanying LICENSE file
+
+#include <build/algorithm>
+
+#include <memory> // unique_ptr
+#include <utility> // move
+#include <cassert>
+#include <iostream>
+
+#include <build/path>
+#include <build/scope>
+#include <build/target>
+#include <build/prerequisite>
+#include <build/rule>
+#include <build/diagnostics>
+
+using namespace std;
+
+namespace build
+{
+ target*
+ search (prerequisite& p)
+ {
+ assert (p.target == nullptr);
+
+ //@@ TODO for now we just default to the directory scope.
+ //
+ path d;
+ if (p.directory.absolute ())
+ d = p.directory; // Already normalized.
+ else
+ {
+ d = p.scope.path () / p.directory;
+ d.normalize ();
+ }
+
+ //@@ TODO would be nice to first check if this target is
+ // already in the set before allocating a new instance.
+
+ // Find or insert.
+ //
+ auto r (
+ targets.emplace (
+ unique_ptr<target> (p.type.factory (p.name, move (d)))));
+
+ //if (r.second)
+ // cout << "new target for prerequsite " << p << " " << d << endl;
+
+ return (p.target = r.first->get ());
+ }
+
+ bool
+ match (target& t)
+ {
+ assert (!t.recipe ());
+
+ for (auto tt (&t.type ());
+ tt != nullptr && !t.recipe ();
+ tt = tt->base)
+ {
+ for (auto rs (rules.equal_range (tt->id));
+ rs.first != rs.second;
+ ++rs.first)
+ {
+ const rule& ru (rs.first->second);
+
+ recipe re;
+
+ {
+ auto g (
+ make_exception_guard (
+ [] (target& t)
+ {
+ cerr << "info: while matching a rule for target " << t << endl;
+ },
+ t));
+
+ re = ru.match (t);
+ }
+
+ if (re)
+ {
+ t.recipe (re);
+ break;
+ }
+ }
+ }
+
+ return bool (t.recipe ());
+ }
+}