diff options
Diffstat (limited to 'libbuild2/config/utility.cxx')
-rw-r--r-- | libbuild2/config/utility.cxx | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/libbuild2/config/utility.cxx b/libbuild2/config/utility.cxx index 12ec1fe..75c9de9 100644 --- a/libbuild2/config/utility.cxx +++ b/libbuild2/config/utility.cxx @@ -76,8 +76,12 @@ namespace build2 } bool - specified_config (scope& rs, const string& n) + specified_config (scope& rs, + const string& n, + initializer_list<const char*> ig) { + auto& vp (rs.var_pool ()); + // Search all outer scopes for any value in this namespace. // // What about "pure" overrides, i.e., those without any original values? @@ -86,19 +90,29 @@ namespace build2 // any original values, they will be "visible"; see find_override() for // details. // - const variable& vns (rs.var_pool ().insert ("config." + n)); + const variable& ns (vp.insert ("config." + n)); for (scope* s (&rs); s != nullptr; s = s->parent_scope ()) { - for (auto p (s->vars.lookup_namespace (vns)); + for (auto p (s->vars.lookup_namespace (ns)); p.first != p.second; ++p.first) { - const variable& var (p.first->first); + const variable* v (&p.first->first.get ()); + + // This can be one of the overrides (__override, __prefix, etc). + // + if (size_t n = v->override ()) + v = vp.find (string (v->name, 0, n)); + + auto match_tail = [&ns, v] (const char* t) + { + return v->name.compare (ns.name.size () + 1, string::npos, t) == 0; + }; - // Ignore config.*.configured. + // Ignore config.*.configured and user-supplied names. // - if (var.name.size () < 11 || - var.name.compare (var.name.size () - 11, 11, ".configured") != 0) + if (!match_tail ("configured") && + find_if (ig.begin (), ig.end (), match_tail) == ig.end ()) return true; } } |