summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--build2/b.cxx9
-rw-r--r--build2/bin/init.cxx2
-rw-r--r--build2/c/init.cxx4
-rw-r--r--build2/cc/compile-rule.cxx2
-rw-r--r--build2/config/init.cxx4
-rw-r--r--build2/config/operation.cxx14
-rw-r--r--build2/config/utility.cxx4
-rw-r--r--build2/cxx/init.cxx4
-rw-r--r--build2/dist/init.cxx4
-rw-r--r--build2/dist/operation.cxx16
-rw-r--r--build2/file.cxx61
-rw-r--r--build2/install/init.cxx10
-rw-r--r--build2/module.cxx4
-rw-r--r--build2/operation.cxx4
-rw-r--r--build2/scope.cxx8
-rw-r--r--build2/scope.hxx59
-rw-r--r--build2/test/init.cxx4
-rw-r--r--build2/version/init.cxx2
-rw-r--r--build2/version/rule.cxx4
19 files changed, 124 insertions, 95 deletions
diff --git a/build2/b.cxx b/build2/b.cxx
index a7207b9d..789bbc2e 100644
--- a/build2/b.cxx
+++ b/build2/b.cxx
@@ -1076,7 +1076,7 @@ main (int argc, char* argv[])
if (first)
{
mid = m;
- mif = rs.meta_operations[m];
+ mif = rs.root_extra->meta_operations[m];
if (mif == nullptr)
fail (l) << "target " << tn << " does not support meta-"
@@ -1088,7 +1088,8 @@ main (int argc, char* argv[])
//
else
{
- const meta_operation_info* mi (rs.meta_operations[mid]);
+ const meta_operation_info* mi (
+ rs.root_extra->meta_operations[mid]);
if (mi == nullptr)
fail (l) << "target " << tn << " does not support meta-"
@@ -1132,7 +1133,7 @@ main (int argc, char* argv[])
auto lookup =
[&rs, &l, &tn] (operation_id o) -> const operation_info*
{
- const operation_info* r (rs.operations[o]);
+ const operation_info* r (rs.root_extra->operations[o]);
if (r == nullptr)
fail (l) << "target " << tn << " does not support "
@@ -1209,7 +1210,7 @@ main (int argc, char* argv[])
auto check =
[&rs, &l, &tn] (operation_id o, const operation_info* i)
{
- const operation_info* r (rs.operations[o]);
+ const operation_info* r (rs.root_extra->operations[o]);
if (r == nullptr)
fail (l) << "target " << tn << " does not support "
diff --git a/build2/bin/init.cxx b/build2/bin/init.cxx
index 6cfb3f82..52197d2e 100644
--- a/build2/bin/init.cxx
+++ b/build2/bin/init.cxx
@@ -492,7 +492,7 @@ namespace build2
r.insert<lib> (perform_uninstall_id, "bin.lib", gr);
}
- if (const test::module* m = rs.modules.lookup<test::module> ("test"))
+ if (const test::module* m = rs.lookup_module<test::module> ("test"))
{
r.insert<lib> (perform_test_id, "bin.lib", m->group_rule ());
}
diff --git a/build2/c/init.cxx b/build2/c/init.cxx
index ef4e72d4..08deb548 100644
--- a/build2/c/init.cxx
+++ b/build2/c/init.cxx
@@ -267,7 +267,7 @@ namespace build2
if (!cast_false<bool> (rs["c.guess.loaded"]))
load_module (rs, rs, "c.guess", loc, false, hints);
- config_module& cm (*rs.modules.lookup<config_module> ("c.guess"));
+ config_module& cm (*rs.lookup_module<config_module> ("c.guess"));
cm.init (rs, loc, hints);
return true;
}
@@ -307,7 +307,7 @@ namespace build2
if (!cast_false<bool> (rs["c.config.loaded"]))
load_module (rs, rs, "c.config", loc, false, hints);
- config_module& cm (*rs.modules.lookup<config_module> ("c.guess"));
+ config_module& cm (*rs.lookup_module<config_module> ("c.guess"));
cc::data d {
cm,
diff --git a/build2/cc/compile-rule.cxx b/build2/cc/compile-rule.cxx
index e0faf7f8..4d6068d2 100644
--- a/build2/cc/compile-rule.cxx
+++ b/build2/cc/compile-rule.cxx
@@ -3981,7 +3981,7 @@ namespace build2
//
#ifndef NDEBUG
assert (ps->root ());
- const module* m (ps->modules.lookup<module> (x));
+ const module* m (ps->lookup_module<module> (x));
assert (m != nullptr && m->modules);
#endif
}
diff --git a/build2/config/init.cxx b/build2/config/init.cxx
index 9dc3a3c2..9c503359 100644
--- a/build2/config/init.cxx
+++ b/build2/config/init.cxx
@@ -52,8 +52,8 @@ namespace build2
// Register meta-operations. Note that we don't register create_id
// since it will be pre-processed into configure.
//
- rs.meta_operations.insert (configure_id, mo_configure);
- rs.meta_operations.insert (disfigure_id, mo_disfigure);
+ rs.insert_meta_operation (configure_id, mo_configure);
+ rs.insert_meta_operation (disfigure_id, mo_disfigure);
return true; // Initialize first (load config.build).
}
diff --git a/build2/config/operation.cxx b/build2/config/operation.cxx
index 1064ebbe..724b92d4 100644
--- a/build2/config/operation.cxx
+++ b/build2/config/operation.cxx
@@ -95,7 +95,7 @@ namespace build2
if (verb)
text << (verb >= 2 ? "cat >" : "save ") << f;
- const module& mod (*root.modules.lookup<const module> (module::name));
+ const module& mod (*root.lookup_module<const module> (module::name));
try
{
@@ -169,7 +169,7 @@ namespace build2
{
// Find the config module.
//
- if (auto* m = r->modules.lookup<const module> (module::name))
+ if (auto* m = r->lookup_module<const module> (module::name))
{
// Find the corresponding saved module.
//
@@ -539,11 +539,13 @@ namespace build2
if (rs == nullptr)
fail << "out of project target " << t;
- for (operation_id id (default_id + 1); // Skip default_id
- id < rs->operations.size ();
+ const operations& ops (rs->root_extra->operations);
+
+ for (operation_id id (default_id + 1); // Skip default_id.
+ id < ops.size ();
++id)
{
- if (const operation_info* oif = rs->operations[id])
+ if (const operation_info* oif = ops[id])
{
// Skip aliases (e.g., update-for-install).
//
@@ -846,7 +848,7 @@ namespace build2
//
scope& gs (*scope::global_);
scope& rs (load_project (gs, d, d, false /* fwd */, false /* load */));
- module& m (*rs.modules.lookup<module> (module::name));
+ module& m (*rs.lookup_module<module> (module::name));
// Save all the global config.import.* variables.
//
diff --git a/build2/config/utility.cxx b/build2/config/utility.cxx
index d2e86997..cc89d2fa 100644
--- a/build2/config/utility.cxx
+++ b/build2/config/utility.cxx
@@ -141,7 +141,7 @@ namespace build2
// The project might not be using the config module. But then how
// could we be configuring it? Good question.
//
- if (module* m = r.modules.lookup<module> (module::name))
+ if (module* m = r.lookup_module<module> (module::name))
m->save_variable (var, flags);
}
@@ -151,7 +151,7 @@ namespace build2
if (current_mif->id != configure_id)
return;
- if (module* m = r.modules.lookup<module> (module::name))
+ if (module* m = r.lookup_module<module> (module::name))
m->save_module (name, prio);
}
diff --git a/build2/cxx/init.cxx b/build2/cxx/init.cxx
index c42f4839..0326d228 100644
--- a/build2/cxx/init.cxx
+++ b/build2/cxx/init.cxx
@@ -482,7 +482,7 @@ namespace build2
if (!cast_false<bool> (rs["cxx.guess.loaded"]))
load_module (rs, rs, "cxx.guess", loc, false, hints);
- config_module& cm (*rs.modules.lookup<config_module> ("cxx.guess"));
+ config_module& cm (*rs.lookup_module<config_module> ("cxx.guess"));
cm.init (rs, loc, hints);
return true;
}
@@ -531,7 +531,7 @@ namespace build2
if (!cast_false<bool> (rs["cxx.config.loaded"]))
load_module (rs, rs, "cxx.config", loc, false, hints);
- config_module& cm (*rs.modules.lookup<config_module> ("cxx.guess"));
+ config_module& cm (*rs.lookup_module<config_module> ("cxx.guess"));
auto& vp (var_pool.rw (rs));
diff --git a/build2/dist/init.cxx b/build2/dist/init.cxx
index b51930bd..dabaf45f 100644
--- a/build2/dist/init.cxx
+++ b/build2/dist/init.cxx
@@ -30,9 +30,9 @@ namespace build2
l5 ([&]{trace << "for " << rs.out_path ();});
- // Register meta-operation.
+ // Register the meta-operation.
//
- rs.meta_operations.insert (dist_id, mo_dist);
+ rs.insert_meta_operation (dist_id, mo_dist);
// Enter module variables. Do it during boot in case they get assigned
// in bootstrap.build (which is customary for, e.g., dist.package).
diff --git a/build2/dist/operation.cxx b/build2/dist/operation.cxx
index b227bbdc..5d46b6e1 100644
--- a/build2/dist/operation.cxx
+++ b/build2/dist/operation.cxx
@@ -143,11 +143,13 @@ namespace build2
const path locf ("<dist>");
const location loc (&locf); // Dummy location.
- for (operations::size_type id (default_id + 1);
- id < rs->operations.size ();
+ const operations& ops (rs->root_extra->operations);
+
+ for (operations::size_type id (default_id + 1); // Skip default_id.
+ id < ops.size ();
++id)
{
- if (const operation_info* oif = rs->operations[id])
+ if (const operation_info* oif = ops[id])
{
// Skip aliases (e.g., update-for-install). In fact, one can argue
// the default update should be sufficient since it is assumed to
@@ -164,7 +166,7 @@ namespace build2
{
if (operation_id pid = oif->pre (params, dist_id, loc))
{
- const operation_info* poif (rs->operations[pid]);
+ const operation_info* poif (ops[pid]);
set_current_oif (*poif, oif, false /* diag_noise */);
action a (dist_id, poif->id, oif->id);
match (params, a, ts,
@@ -183,7 +185,7 @@ namespace build2
{
if (operation_id pid = oif->post (params, dist_id))
{
- const operation_info* poif (rs->operations[pid]);
+ const operation_info* poif (ops[pid]);
set_current_oif (*poif, oif, false /* diag_noise */);
action a (dist_id, poif->id, oif->id);
match (params, a, ts,
@@ -340,7 +342,7 @@ namespace build2
// Copy over all the files. Apply post-processing callbacks.
//
- module& mod (*rs->modules.lookup<module> (module::name));
+ module& mod (*rs->lookup_module<module> (module::name));
prog = prog && show_progress (1 /* max_verb */);
size_t prog_percent (0);
@@ -374,7 +376,7 @@ namespace build2
{
srs = &scopes.find (out_root / pd);
- if (auto* m = srs->modules.lookup<module> (module::name))
+ if (auto* m = srs->lookup_module<module> (module::name))
cbs = &m->callbacks_;
else
fail << "dist module not loaded in subproject " << pd;
diff --git a/build2/file.cxx b/build2/file.cxx
index e205f271..b12d39c1 100644
--- a/build2/file.cxx
+++ b/build2/file.cxx
@@ -278,25 +278,6 @@ namespace build2
rs.out_path_ = &i->first;
}
- // First time create_root() is called on this scope.
- //
- bool first (rs.meta_operations.empty ());
-
- // Enter built-in meta-operation and operation names. Loading of
- // modules (via the src bootstrap; see below) can result in
- // additional meta/operations being added.
- //
- if (first)
- {
- rs.meta_operations.insert (noop_id, mo_noop);
- rs.meta_operations.insert (perform_id, mo_perform);
- rs.meta_operations.insert (info_id, mo_info);
-
- rs.operations.insert (default_id, op_default);
- rs.operations.insert (update_id, op_update);
- rs.operations.insert (clean_id, op_clean);
- }
-
// If this is already a root scope, verify that things are consistent.
//
{
@@ -474,7 +455,23 @@ namespace build2
a ? alt_root_file : std_root_file,
a ? alt_export_file : std_export_file,
a ? alt_src_root_file : std_src_root_file,
- a ? alt_out_root_file : std_out_root_file});
+ a ? alt_out_root_file : std_out_root_file,
+ {}, /* meta_operations */
+ {}, /* operations */
+ {}, /* modules */
+ {} /* override_cache */});
+
+ // Enter built-in meta-operation and operation names. Loading of
+ // modules (via the src bootstrap; see below) can result in
+ // additional meta/operations being added.
+ //
+ root.insert_meta_operation (noop_id, mo_noop);
+ root.insert_meta_operation (perform_id, mo_perform);
+ root.insert_meta_operation (info_id, mo_info);
+
+ root.insert_operation (default_id, op_default);
+ root.insert_operation (update_id, op_update);
+ root.insert_operation (clean_id, op_clean);
}
void
@@ -723,6 +720,16 @@ namespace build2
{
path f (exists (src_root, std_bootstrap_file, alt_bootstrap_file, altn));
+ if (root.root_extra == nullptr)
+ {
+ // If nothing so far has indicated the naming, assume standard.
+ //
+ if (!altn)
+ altn = false;
+
+ setup_root_extra (root, altn);
+ }
+
if (!f.empty ())
{
// We assume that bootstrap out cannot load this file explicitly. It
@@ -739,16 +746,6 @@ namespace build2
}
}
- if (root.root_extra == nullptr)
- {
- // If nothing so far has indicated the naming, assume standard.
- //
- if (!altn)
- altn = false;
-
- setup_root_extra (root, altn);
- }
-
// See if we are a part of an amalgamation. There are two key players: the
// outer root scope which may already be present (i.e., we were loaded as
// part of an amalgamation) and the amalgamation variable that may or may
@@ -1176,7 +1173,7 @@ namespace build2
// Finish off loading bootstrapped modules.
//
- for (auto& p: root.modules)
+ for (auto& p: root.root_extra->modules)
{
module_state& s (p.second);
@@ -1184,7 +1181,7 @@ namespace build2
load_module (root, root, p.first, s.loc);
}
- for (auto& p: root.modules)
+ for (auto& p: root.root_extra->modules)
{
module_state& s (p.second);
diff --git a/build2/install/init.cxx b/build2/install/init.cxx
index 27f9e9e8..3c2b0d1e 100644
--- a/build2/install/init.cxx
+++ b/build2/install/init.cxx
@@ -129,10 +129,10 @@ namespace build2
functions (); // functions.cxx
bool
- boot (scope& r, const location&, unique_ptr<module_base>&)
+ boot (scope& rs, const location&, unique_ptr<module_base>&)
{
tracer trace ("install::boot");
- l5 ([&]{trace << "for " << r.out_path ();});
+ l5 ([&]{trace << "for " << rs.out_path ();});
// Register install function family if this is the first instance of the
// install modules.
@@ -142,9 +142,9 @@ namespace build2
// Register our operations.
//
- r.operations.insert (install_id, op_install);
- r.operations.insert (uninstall_id, op_uninstall);
- r.operations.insert (update_for_install_id, op_update_for_install);
+ rs.insert_operation (install_id, op_install);
+ rs.insert_operation (uninstall_id, op_uninstall);
+ rs.insert_operation (update_for_install_id, op_update_for_install);
return false;
}
diff --git a/build2/module.cxx b/build2/module.cxx
index 9561376b..a4a03419 100644
--- a/build2/module.cxx
+++ b/build2/module.cxx
@@ -19,7 +19,7 @@ namespace build2
{
// First see if this modules has already been loaded for this project.
//
- loaded_module_map& lm (rs.modules);
+ loaded_module_map& lm (rs.root_extra->modules);
auto i (lm.find (name));
if (i != lm.end ())
@@ -62,7 +62,7 @@ namespace build2
{
// First see if this modules has already been loaded for this project.
//
- loaded_module_map& lm (rs.modules);
+ loaded_module_map& lm (rs.root_extra->modules);
auto i (lm.find (name));
bool f (i == lm.end ());
diff --git a/build2/operation.cxx b/build2/operation.cxx
index facd1fce..74db2f31 100644
--- a/build2/operation.cxx
+++ b/build2/operation.cxx
@@ -524,8 +524,8 @@ namespace build2
<< "out_root: " << cast<dir_path> (rs[var_out_root]) << endl
<< "amalgamation: " << cast_empty<dir_path> (rs[var_amalgamation]) << endl
<< "subprojects: " << cast_empty<subprojects> (rs[var_subprojects]) << endl
- << "operations:"; print_ops (rs.operations, operation_table); cout << endl
- << "meta-operations:"; print_ops (rs.meta_operations, meta_operation_table); cout << endl;
+ << "operations:"; print_ops (rs.root_extra->operations, operation_table); cout << endl
+ << "meta-operations:"; print_ops (rs.root_extra->meta_operations, meta_operation_table); cout << endl;
}
}
diff --git a/build2/scope.cxx b/build2/scope.cxx
index ce6945ed..bae98182 100644
--- a/build2/scope.cxx
+++ b/build2/scope.cxx
@@ -424,8 +424,13 @@ namespace build2
// Check the cache.
//
+ variable_override_cache& cache (
+ inner_proj == global_scope
+ ? global_override_cache
+ : inner_proj->root_extra->override_cache);
+
pair<value&, ulock> entry (
- inner_proj->override_cache.insert (
+ cache.insert (
make_pair (&var, inner_vars),
stem,
0, // Overrides are immutable.
@@ -792,6 +797,7 @@ namespace build2
}
scope* scope::global_;
+ scope::variable_override_cache scope::global_override_cache;
// scope_map
//
diff --git a/build2/scope.hxx b/build2/scope.hxx
index fe7b0b6e..6e48de35 100644
--- a/build2/scope.hxx
+++ b/build2/scope.hxx
@@ -183,7 +183,8 @@ namespace build2
//
variable_type_map target_vars;
- // Variable override cache (project root and global scope only).
+ // Variable override caches. Only on project roots (in root_extra) plus a
+ // global one for the global scope.
//
// The key is the variable plus the innermost (scope-wise) variable map to
// which this override applies. See find_override() for details.
@@ -191,24 +192,17 @@ namespace build2
// Note: since it can be modified on any lookup (including during the
// execute phase), the cache is protected by its own mutex shard.
//
- mutable
- variable_cache<pair<const variable*, const variable_map*>>
- override_cache;
+ using variable_override_cache = variable_cache<pair<const variable*,
+ const variable_map*>>;
- // Meta/operations supported by this project (set on the root
- // scope only).
- //
- public:
- build2::meta_operations meta_operations;
- build2::operations operations;
-
- using path_type = build2::path;
+ static variable_override_cache global_override_cache;
// Set of buildfiles already loaded for this scope. The included
// buildfiles are checked against the project's root scope while
// imported -- against the global scope (global_scope).
//
- std::unordered_set<path_type> buildfiles;
+ public:
+ std::unordered_set<path> buildfiles;
// Target types.
//
@@ -274,11 +268,6 @@ namespace build2
operation_callback_map operation_callbacks;
- // Modules.
- //
- public:
- loaded_module_map modules; // Only on root scope.
-
// Extra root scope-only data.
//
public:
@@ -300,10 +289,42 @@ namespace build2
const path& export_file; // build[2]/export.build[2]
const path& src_root_file; // build[2]/bootstrap/src-root.build[2]
const path& out_root_file; // build[2]/bootstrap/src-root.build[2]
+
+ // Meta/operations supported by this project.
+ //
+ build2::meta_operations meta_operations;
+ build2::operations operations;
+
+ // Modules.
+ //
+ loaded_module_map modules;
+
+ // Variable override cache (see above).
+ //
+ mutable variable_override_cache override_cache;
};
unique_ptr<root_data> root_extra;
+ void
+ insert_operation (operation_id id, const operation_info& in)
+ {
+ root_extra->operations.insert (id, in);
+ }
+
+ void
+ insert_meta_operation (meta_operation_id id, const meta_operation_info& in)
+ {
+ root_extra->meta_operations.insert (id, in);
+ }
+
+ template <typename T>
+ T*
+ lookup_module (const string& name) const
+ {
+ return root_extra->modules.lookup<T> (name);
+ }
+
public:
// RW access.
//
@@ -337,7 +358,7 @@ namespace build2
scope* parent_;
scope* root_;
- scope* strong_ = nullptr; // Only set on root sopes.
+ scope* strong_ = nullptr; // Only set on root scopes.
// NULL means no strong amalgamtion.
};
diff --git a/build2/test/init.cxx b/build2/test/init.cxx
index 9f63781a..aa2533af 100644
--- a/build2/test/init.cxx
+++ b/build2/test/init.cxx
@@ -31,8 +31,8 @@ namespace build2
// Register our operations.
//
- rs.operations.insert (test_id, op_test);
- rs.operations.insert (update_for_test_id, op_update_for_test);
+ rs.insert_operation (test_id, op_test);
+ rs.insert_operation (update_for_test_id, op_update_for_test);
// Enter module variables. Do it during boot in case they get assigned
// in bootstrap.build.
diff --git a/build2/version/init.cxx b/build2/version/init.cxx
index 2c80cece..7e8f0ffe 100644
--- a/build2/version/init.cxx
+++ b/build2/version/init.cxx
@@ -284,7 +284,7 @@ namespace build2
// If the dist module is used, set its dist.package and register the
// post-processing callback.
//
- if (auto* dm = rs.modules.lookup<dist::module> (dist::module::name))
+ if (auto* dm = rs.lookup_module<dist::module> (dist::module::name))
{
// Make sure dist is init'ed, not just boot'ed.
//
diff --git a/build2/version/rule.cxx b/build2/version/rule.cxx
index 1ff5b41a..83f402fe 100644
--- a/build2/version/rule.cxx
+++ b/build2/version/rule.cxx
@@ -80,7 +80,7 @@ namespace build2
// If we match, lookup and cache the module for the update operation.
//
if (r && a == perform_update_id)
- t.data (rs.modules.lookup<module> (module::name));
+ t.data (rs.lookup_module<module> (module::name));
return r;
}
@@ -314,7 +314,7 @@ namespace build2
const path& p (t.path ());
const scope& rs (t.root_scope ());
- const module& m (*rs.modules.lookup<module> (module::name));
+ const module& m (*rs.lookup_module<module> (module::name));
if (!m.rewritten)
return auto_rmfile (p, false /* active */);