From 026c827b978761bf0cb618ff9429df8508cd3190 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Thu, 19 May 2022 13:10:54 +0200 Subject: Make $config.origin() also available internally as config::origin() --- libbuild2/config/utility.cxx | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'libbuild2/config/utility.cxx') diff --git a/libbuild2/config/utility.cxx b/libbuild2/config/utility.cxx index a78b263..7437c5b 100644 --- a/libbuild2/config/utility.cxx +++ b/libbuild2/config/utility.cxx @@ -156,5 +156,38 @@ namespace build2 else return false; } + + pair + origin (const scope& rs, const string& n) + { + // Make sure this is a config.* variable. This could matter since we + // reply on the semantics of value::extra. We could also detect + // special variables like config.booted, some config.config.*, etc., + // (see config_save() for details) but that seems harmless. + // + if (n.compare (0, 7, "config.") != 0) + throw invalid_argument ("config.* variable expected"); + + const variable* var (rs.ctx.var_pool.find (n)); + + if (var == nullptr) + return make_pair (variable_origin::undefined, lookup ()); + + pair org (rs.lookup_original (*var)); + pair ovr (var->overrides == nullptr + ? org + : rs.lookup_override (*var, org)); + + if (!ovr.first.defined ()) + return make_pair (variable_origin::undefined, lookup ()); + + if (org.first != ovr.first) + return make_pair (variable_origin::override_, ovr.first); + + return make_pair (org.first->extra + ? variable_origin::default_ + : variable_origin::buildfile, + org.first); + } } } -- cgit v1.1