aboutsummaryrefslogtreecommitdiff
path: root/libbuild2/rule.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'libbuild2/rule.hxx')
-rw-r--r--libbuild2/rule.hxx107
1 files changed, 107 insertions, 0 deletions
diff --git a/libbuild2/rule.hxx b/libbuild2/rule.hxx
new file mode 100644
index 0000000..abd754e
--- /dev/null
+++ b/libbuild2/rule.hxx
@@ -0,0 +1,107 @@
+// file : libbuild2/rule.hxx -*- C++ -*-
+// copyright : Copyright (c) 2014-2019 Code Synthesis Ltd
+// license : MIT; see accompanying LICENSE file
+
+#ifndef LIBBUILD2_RULE_HXX
+#define LIBBUILD2_RULE_HXX
+
+#include <libbuild2/types.hxx>
+#include <libbuild2/utility.hxx>
+
+#include <libbuild2/action.hxx>
+#include <libbuild2/target.hxx>
+
+#include <libbuild2/export.hxx>
+
+namespace build2
+{
+ // Once a rule is registered (for a scope), it is treated as immutable. If
+ // you need to modify some state (e.g., counters or some such), then make
+ // sure it is MT-safe.
+ //
+ // Note: match() is only called once but may not be followed by apply().
+ //
+ class rule
+ {
+ public:
+ virtual bool
+ match (action, target&, const string& hint) const = 0;
+
+ virtual recipe
+ apply (action, target&) const = 0;
+ };
+
+ // Fallback rule that only matches if the file exists. It will also match
+ // an mtime_target provided it has a set timestamp.
+ //
+ class LIBBUILD2_SYMEXPORT file_rule: public rule
+ {
+ public:
+ virtual bool
+ match (action, target&, const string&) const override;
+
+ virtual recipe
+ apply (action, target&) const override;
+
+ file_rule () {}
+ static const file_rule instance;
+ };
+
+ class LIBBUILD2_SYMEXPORT alias_rule: public rule
+ {
+ public:
+ virtual bool
+ match (action, target&, const string&) const override;
+
+ virtual recipe
+ apply (action, target&) const override;
+
+ alias_rule () {}
+ static const alias_rule instance;
+ };
+
+ // Note that this rule ignores the dry_run flag; see mkdir() in filesystem
+ // for the rationale.
+ //
+ class LIBBUILD2_SYMEXPORT fsdir_rule: public rule
+ {
+ public:
+ virtual bool
+ match (action, target&, const string&) const override;
+
+ virtual recipe
+ apply (action, target&) const override;
+
+ static target_state
+ perform_update (action, const target&);
+
+ static target_state
+ perform_clean (action, const target&);
+
+ // Sometimes, as an optimization, we want to emulate execute_direct()
+ // of fsdir{} without the overhead of switching to the execute phase.
+ //
+ static void
+ perform_update_direct (action, const target&);
+
+ fsdir_rule () {}
+ static const fsdir_rule instance;
+ };
+
+ // Fallback rule that always matches and does nothing.
+ //
+ class LIBBUILD2_SYMEXPORT noop_rule: public rule
+ {
+ public:
+ virtual bool
+ match (action, target&, const string&) const override;
+
+ virtual recipe
+ apply (action, target&) const override;
+
+ noop_rule () {}
+ static const noop_rule instance;
+ };
+}
+
+#endif // LIBBUILD2_RULE_HXX