From 5e9eb843f6ccadfb47fa603260783425da9e7805 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Wed, 10 Dec 2014 10:20:26 +0200 Subject: Add rules g++-4.9 -std=c++11 -g -I.. -o bd bd.cxx target.cxx native.cxx rule.cxx cxx/rule.cxx cxx/target.cxx process.cxx timestamp.cxx path.cxx --- build/rule.cxx | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 build/rule.cxx (limited to 'build/rule.cxx') diff --git a/build/rule.cxx b/build/rule.cxx new file mode 100644 index 0000000..fe4c4b2 --- /dev/null +++ b/build/rule.cxx @@ -0,0 +1,72 @@ +// file : build/rule.cxx -*- C++ -*- +// copyright : Copyright (c) 2014-2015 Code Synthesis Tools CC +// license : MIT; see accompanying LICENSE file + +#include + +#include + +using namespace std; + +namespace build +{ + rule_map rules; + + // default_path_rule + // + recipe default_path_rule:: + match (target& t) const + { + // @@ TODO: + // + // - need to assign path somehow. Get (potentially several) + // extensions from target type? Maybe target type should + // generate a list of potential paths that we can try here. + // + + path_target& pt (dynamic_cast (t)); + + return pt.mtime () != timestamp_nonexistent ? &update : nullptr; + } + + target_state default_path_rule:: + update (target& t) + { + // Make sure the target is not older than any of its prerequisites. + // + path_target& pt (dynamic_cast (t)); + timestamp mt (pt.mtime ()); + + for (const target& p: t.prerequisites ()) + { + // If this is an mtime-based target, then simply compare timestamps. + // + if (auto mtp = dynamic_cast (&p)) + { + if (mt < mtp->mtime ()) + { + cerr << "error: no rule to update target " << t << endl + << "info: prerequisite " << p << " is ahead of " << t << + " by " << (mtp->mtime () - mt) << endl; + + return target_state::failed; + } + } + else + { + // Otherwise we assume the prerequisite is newer if it was updated. + // + if (p.state () == target_state::updated) + { + cerr << "error: no rule to update target " << t << endl + << "info: prerequisite " << p << " is ahead of " << t << + " because it was updated" << endl; + + return target_state::failed; + } + } + } + + return target_state::uptodate; + } +} -- cgit v1.1