From ea24f530048cbce0c5335ca3fd3632c8ce34315a Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Sat, 24 Aug 2019 16:37:29 +0300 Subject: Move bin build system module to separate library --- libbuild2/bin/rule.cxx | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 libbuild2/bin/rule.cxx (limited to 'libbuild2/bin/rule.cxx') diff --git a/libbuild2/bin/rule.cxx b/libbuild2/bin/rule.cxx new file mode 100644 index 0000000..8c1174a --- /dev/null +++ b/libbuild2/bin/rule.cxx @@ -0,0 +1,89 @@ +// file : build2/bin/rule.cxx -*- C++ -*- +// copyright : Copyright (c) 2014-2019 Code Synthesis Ltd +// license : MIT; see accompanying LICENSE file + +#include + +#include +#include +#include +#include + +#include + +using namespace std; + +namespace build2 +{ + namespace bin + { + // fail_rule + // + bool fail_rule:: + match (action a, target& t, const string&) const + { + const char* n (t.dynamic_type ().name); // Ignore derived type. + + fail << diag_doing (a, t) << " target group" << + info << "explicitly select " << n << "e{}, " << n << "a{}, or " + << n << "s{} member" << endf; + } + + recipe fail_rule:: + apply (action, target&) const {return empty_recipe;} + + // lib_rule + // + // The whole logic is pretty much as if we had our two group members as + // our prerequisites. + // + lib_rule::members lib_rule:: + build_members (const scope& rs) + { + const string& type (cast (rs["bin.lib"])); + + bool a (type == "static" || type == "both"); + bool s (type == "shared" || type == "both"); + + if (!a && !s) + fail << "unknown library type: " << type << + info << "'static', 'shared', or 'both' expected"; + + return members {a, s}; + } + + bool lib_rule:: + match (action, target& xt, const string&) const + { + lib& t (xt.as ()); + + members bm (build_members (t.root_scope ())); + t.a = bm.a ? &search (t, t.dir, t.out, t.name) : nullptr; + t.s = bm.s ? &search (t, t.dir, t.out, t.name) : nullptr; + + return true; + } + + recipe lib_rule:: + apply (action a, target& xt) const + { + lib& t (xt.as ()); + + //@@ outer: also prerequisites (if outer) or not? + + const target* m[] = {t.a, t.s}; + match_members (a, t, m); + + return &perform; + } + + target_state lib_rule:: + perform (action a, const target& xt) + { + const lib& t (xt.as ()); + + const target* m[] = {t.a, t.s}; + return execute_members (a, t, m); + } + } +} -- cgit v1.1