From 83bb02cada0b894d9134cc5489999e0f0fe8bd7c Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Mon, 8 Jul 2019 14:55:35 +0200 Subject: Move in build system module to separate library --- libbuild2/in/init.cxx | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 libbuild2/in/init.cxx (limited to 'libbuild2/in/init.cxx') diff --git a/libbuild2/in/init.cxx b/libbuild2/in/init.cxx new file mode 100644 index 0000000..6ef996b --- /dev/null +++ b/libbuild2/in/init.cxx @@ -0,0 +1,126 @@ +// file : libbuild2/in/init.cxx -*- C++ -*- +// copyright : Copyright (c) 2014-2019 Code Synthesis Ltd +// license : MIT; see accompanying LICENSE file + +#include + +#include +#include +#include +#include + +#include +#include + +using namespace std; + +namespace build2 +{ + namespace in + { + static const rule rule_ ("in", "in"); + + bool + base_init (scope& rs, + scope&, + const location&, + unique_ptr&, + bool first, + bool, + const variable_map&) + { + tracer trace ("in::base_init"); + l5 ([&]{trace << "for " << rs;}); + + assert (first); + + // Enter variables. + // + { + auto& vp (var_pool.rw (rs)); + + // Alternative variable substitution symbol with '$' being the + // default. + // + vp.insert ("in.symbol"); + + // Substitution mode. Valid values are 'strict' (default) and 'lax'. + // In the strict mode every substitution symbol is expected to start a + // substitution with the double symbol (e.g., $$) serving as an escape + // sequence. + // + // In the lax mode a pair of substitution symbols is only treated as a + // substitution if what's between them looks like a build2 variable + // name (i.e., doesn't contain spaces, etc). Everything else, + // including unterminated substitution symbols, is copied as is. Note + // also that in this mode the double symbol is not treated as an + // escape sequence. + // + // The lax mode is mostly useful when trying to reuse existing .in + // files, for example, from autoconf. Note, however, that the lax mode + // is still stricter than the autoconf's semantics which also leaves + // unknown substitutions as is. + // + vp.insert ("in.substitution"); + } + + // Register target types. + // + rs.target_types.insert (); + + return true; + } + + bool + init (scope& rs, + scope& bs, + const location& loc, + unique_ptr&, + bool, + bool, + const variable_map&) + { + tracer trace ("in::init"); + l5 ([&]{trace << "for " << bs;}); + + // Load in.base. + // + if (!cast_false (rs["in.base.loaded"])) + load_module (rs, rs, "in.base", loc); + + // Register rules. + // + { + auto& r (bs.rules); + + // There are rules that are "derived" from this generic in rule in + // order to provide extended preprocessing functionality (see the + // version module for an example). To make sure they are tried first + // we register for path_target, not file, but in rule::match() we only + // match if the target is a file. A bit of a hack. + // + r.insert (perform_update_id, "in", rule_); + r.insert (perform_clean_id, "in", rule_); + r.insert (configure_update_id, "in", rule_); + } + + return true; + } + + static const module_functions mod_functions[] = + { + // NOTE: don't forget to also update the documentation in init.hxx if + // changing anything here. + + {"in.base", nullptr, base_init}, + {"in", nullptr, init}, + {nullptr, nullptr, nullptr} + }; + + const module_functions* + build2_in_load () + { + return mod_functions; + } + } +} -- cgit v1.1