diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2014-12-18 07:14:53 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2014-12-18 07:14:53 +0200 |
commit | c0c85b67516653c181fbce7c61c2df3e31e4edd8 (patch) | |
tree | 535467b029b27b190e35064e4babd62825eba6a1 /build/algorithm.cxx | |
parent | 835ed5f7080a98e9ee80ac08d5585ccdbb63fe0e (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.cxx | 93 |
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 ()); + } +} |