aboutsummaryrefslogtreecommitdiff
path: root/build2/config/module.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'build2/config/module.hxx')
-rw-r--r--build2/config/module.hxx94
1 files changed, 94 insertions, 0 deletions
diff --git a/build2/config/module.hxx b/build2/config/module.hxx
new file mode 100644
index 0000000..d997802
--- /dev/null
+++ b/build2/config/module.hxx
@@ -0,0 +1,94 @@
+// file : build2/config/module.hxx -*- C++ -*-
+// copyright : Copyright (c) 2014-2017 Code Synthesis Ltd
+// license : MIT; see accompanying LICENSE file
+
+#ifndef BUILD2_CONFIG_MODULE_HXX
+#define BUILD2_CONFIG_MODULE_HXX
+
+#include <map>
+#include <algorithm> // find_if()
+
+#include <libbutl/prefix-map.hxx>
+
+#include <build2/types.hxx>
+#include <build2/utility.hxx>
+
+#include <build2/module.hxx>
+#include <build2/variable.hxx>
+
+namespace build2
+{
+ namespace config
+ {
+ // An ordered list of modules each with an ordered list of list of
+ // config.* variables and their "save flags" (see save_variable()) that
+ // are used (as opposed to just being specified) in this configuration.
+ // Populated by the config utility functions (required(), optional())
+ // and saved in the order populated.
+ //
+ struct saved_variable
+ {
+ reference_wrapper<const variable> var;
+ uint64_t flags;
+ };
+
+ struct saved_variables: vector<saved_variable>
+ {
+ // Normally each module only have a handful of config variables and we
+ // only do this during configuration so for now we do linear search
+ // instead of adding a map.
+ //
+ const_iterator
+ find (const variable& var) const
+ {
+ return std::find_if (
+ begin (),
+ end (),
+ [&var] (const saved_variable& v) {return var == v.var;});
+ }
+ };
+
+ struct saved_modules: butl::prefix_map<string, saved_variables, '.'>
+ {
+ // Priority order with INT32_MIN being the highest. Modules with the
+ // same priority are saved in the order inserted.
+ //
+ // Generally, the idea is that we want higher-level modules at the top
+ // of the file since that's the configuration that we usualy want to
+ // change. So we have the following priority bands/defaults:
+ //
+ // 101-200/150 - code generators (e.g., yacc, bison)
+ // 201-300/250 - compilers (e.g., C, C++),
+ // 301-400/350 - binutils (ar, ld)
+ //
+ std::multimap<std::int32_t, const_iterator> order;
+
+ iterator
+ insert (string name, int prio = 0)
+ {
+ auto p (emplace (move (name), saved_variables ()));
+
+ if (p.second)
+ order.emplace (prio, p.first);
+
+ return p.first;
+ }
+ };
+
+ struct module: module_base
+ {
+ config::saved_modules saved_modules;
+
+ void
+ save_variable (const variable&, uint64_t flags = 0);
+
+ void
+ save_module (const char* name, int prio = 0);
+
+ static const string name;
+ static const uint64_t version;
+ };
+ }
+}
+
+#endif // BUILD2_CONFIG_MODULE_HXX