aboutsummaryrefslogtreecommitdiff
path: root/libbuild2/bash/rule.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'libbuild2/bash/rule.hxx')
-rw-r--r--libbuild2/bash/rule.hxx91
1 files changed, 91 insertions, 0 deletions
diff --git a/libbuild2/bash/rule.hxx b/libbuild2/bash/rule.hxx
new file mode 100644
index 0000000..665a6c2
--- /dev/null
+++ b/libbuild2/bash/rule.hxx
@@ -0,0 +1,91 @@
+// file : libbuild2/bash/rule.hxx -*- C++ -*-
+// copyright : Copyright (c) 2014-2019 Code Synthesis Ltd
+// license : MIT; see accompanying LICENSE file
+
+#ifndef LIBBUILD2_BASH_RULE_HXX
+#define LIBBUILD2_BASH_RULE_HXX
+
+#include <libbuild2/types.hxx>
+#include <libbuild2/utility.hxx>
+
+#include <libbuild2/install/rule.hxx>
+
+#include <libbuild2/in/rule.hxx>
+
+#include <libbuild2/bash/export.hxx>
+
+namespace build2
+{
+ namespace bash
+ {
+ // Preprocess a bash script (exe{}) or module (bash{}) .in file that
+ // imports one or more bash modules.
+ //
+ // Note that the default substitution symbol is '@' and the mode is lax
+ // (think bash arrays). The idea is that '@' is normally used in ways that
+ // are highly unlikely to be misinterpreted as substitutions. The user,
+ // however, is still able to override both of these choices with the
+ // corresponding in.* variables (e.g., to use '`' and strict mode).
+ //
+ class LIBBUILD2_BASH_SYMEXPORT in_rule: public in::rule
+ {
+ public:
+ in_rule (): rule ("bash.in 1", "bash.in", '@', false /* strict */) {}
+
+ virtual bool
+ match (action, target&, const string&) const override;
+
+ virtual recipe
+ apply (action, target&) const override;
+
+ virtual target_state
+ perform_update (action, const target&) const override;
+
+ virtual prerequisite_target
+ search (action,
+ const target&,
+ const prerequisite_member&,
+ include_type) const override;
+
+ virtual optional<string>
+ substitute (const location&,
+ action a,
+ const target&,
+ const string&,
+ bool) const override;
+
+ string
+ substitute_import (const location&,
+ action a,
+ const target&,
+ const string&) const;
+ };
+
+ // Installation rule for bash scripts (exe{}) and modules (bash{}). Here
+ // we do:
+ //
+ // 1. Signal to in_rule that this is update for install.
+ //
+ // 2. Custom filtering of prerequisites.
+ //
+ class LIBBUILD2_BASH_SYMEXPORT install_rule: public install::file_rule
+ {
+ public:
+ install_rule (const in_rule& in): in_ (in) {}
+
+ virtual bool
+ match (action, target&, const string&) const override;
+
+ virtual recipe
+ apply (action, target&) const override;
+
+ virtual const target*
+ filter (action, const target&, const prerequisite&) const override;
+
+ protected:
+ const in_rule& in_;
+ };
+ }
+}
+
+#endif // LIBBUILD2_BASH_RULE_HXX