From 23cbbc7f7cdcb7721d8d1cf4e70ae58184f8cc7e Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Tue, 9 Jun 2020 08:19:33 +0200 Subject: Factor ad hoc C++ and Buildscript rules into separate files --- libbuild2/rule-adhoc-cxx.hxx | 83 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 libbuild2/rule-adhoc-cxx.hxx (limited to 'libbuild2/rule-adhoc-cxx.hxx') diff --git a/libbuild2/rule-adhoc-cxx.hxx b/libbuild2/rule-adhoc-cxx.hxx new file mode 100644 index 0000000..00ed279 --- /dev/null +++ b/libbuild2/rule-adhoc-cxx.hxx @@ -0,0 +1,83 @@ +// file : libbuild2/rule-adhoc-cxx.hxx -*- C++ -*- +// license : MIT; see accompanying LICENSE file + +#ifndef LIBBUILD2_RULE_ADHOC_CXX_HXX +#define LIBBUILD2_RULE_ADHOC_CXX_HXX + +#include +#include +#include + +#include + +#include + +namespace build2 +{ + // Ad hoc C++ rule. + // + // Note: exported but should not be used directly (i.e., registered). + // + class LIBBUILD2_SYMEXPORT cxx_rule: public rule + { + // For now this class is provided purely as an alias for rule in case the + // implementation (which is also called rule) needs to refer to something + // in its base. + }; + + class LIBBUILD2_SYMEXPORT cxx_rule_v1: public cxx_rule + { + public: + // A robust recipe may want to incorporate the recipe_state into its + // up-to-date decision as if the recipe library was a prerequisite (it + // cannot be injected as a real prerequisite since it's from a different + // build context). + // + const location recipe_loc; // Buildfile location of the recipe. + const target_state recipe_state; // State of recipe library target. + + cxx_rule_v1 (const location& l, target_state s) + : recipe_loc (l), recipe_state (s) {} + + // Return true by default. + // + virtual bool + match (action, target&, const string&) const override; + }; + + // Note: not exported. + // + class adhoc_cxx_rule: public adhoc_rule + { + public: + virtual bool + match (action, target&, const string&) const override; + + virtual recipe + apply (action, target&) const override; + + adhoc_cxx_rule (const location&, size_t, + uint64_t ver, + optional sep); + + virtual bool + recipe_text (context&, const target&, string&& t, attributes&) override; + + virtual + ~adhoc_cxx_rule () override; + + virtual void + dump_text (ostream&, string&) const override; + + public: + // Note that this recipe (rule instance) can be shared between multiple + // targets which could all be matched in parallel. + // + uint64_t version; + optional separator; + string code; + mutable atomic impl; + }; +} + +#endif // LIBBUILD2_RULE_ADHOC_CXX_HXX -- cgit v1.1