aboutsummaryrefslogtreecommitdiff
path: root/build/install/module.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'build/install/module.cxx')
-rw-r--r--build/install/module.cxx105
1 files changed, 105 insertions, 0 deletions
diff --git a/build/install/module.cxx b/build/install/module.cxx
new file mode 100644
index 0000000..dc88ec2
--- /dev/null
+++ b/build/install/module.cxx
@@ -0,0 +1,105 @@
+// file : build/install/module.cxx -*- C++ -*-
+// copyright : Copyright (c) 2014-2015 Code Synthesis Ltd
+// license : MIT; see accompanying LICENSE file
+
+#include <build/install/module>
+
+#include <build/scope>
+#include <build/target>
+#include <build/rule>
+#include <build/diagnostics>
+
+#include <build/config/utility>
+
+#include <build/install/operation>
+
+using namespace std;
+using namespace butl;
+
+namespace build
+{
+ namespace install
+ {
+ // Set install.<name> values based on config.install.<name> values
+ // or the defaults.
+ //
+ static void
+ set_dir (scope& r, const char* name, const char* path, const char* mode)
+ {
+ string vn ("config.install.");
+ vn += name;
+
+ const list_value* pv (config::optional<list_value> (r, vn));
+
+ vn += ".mode";
+ const list_value* mv (config::optional<list_value> (r, vn));
+
+ vn = "install.";
+ vn += name;
+ auto p (r.assign (vn));
+
+ if (pv != nullptr && !pv->empty ())
+ p = *pv;
+ else if (path != nullptr)
+ p = path;
+
+ vn += ".mode";
+ auto m (r.assign (vn));
+
+ if (mv != nullptr && !mv->empty ())
+ p = *mv;
+ else if (mode != nullptr)
+ p = mode;
+ }
+
+ extern "C" void
+ install_init (scope& root,
+ scope& base,
+ const location& l,
+ unique_ptr<build::module>&,
+ bool first)
+ {
+ tracer trace ("install::init");
+
+ if (&root != &base)
+ fail (l) << "install module must be initialized in bootstrap.build";
+
+ if (!first)
+ {
+ warn (l) << "multiple install module initializations";
+ return;
+ }
+
+ const dir_path& out_root (root.path ());
+ level4 ([&]{trace << "for " << out_root;});
+
+ // Register the install operation.
+ //
+ operation_id install_id (root.operations.insert (install));
+
+ {
+ auto& rs (base.rules);
+
+ // Register the standard alias rule for the install operation.
+ //
+ rs.insert<alias> (install_id, "alias", alias_rule::instance);
+ }
+
+ // Configuration.
+ //
+ // Note that we don't use any defaults -- the location must
+ // be explicitly specified or the installer will complain if
+ // and when we try to install.
+ //
+ if (first)
+ {
+ set_dir (root, "root", nullptr, nullptr);
+ set_dir (root, "data_root", "root", "644");
+ set_dir (root, "exec_root", "root", "755");
+
+ set_dir (root, "bin", "exec_root/bin", nullptr);
+ set_dir (root, "sbin", "exec_root/sbin", nullptr);
+ }
+ }
+ }
+}