diff options
Diffstat (limited to 'libbuild2/config/utility.txx')
-rw-r--r-- | libbuild2/config/utility.txx | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/libbuild2/config/utility.txx b/libbuild2/config/utility.txx new file mode 100644 index 0000000..d2ffa69 --- /dev/null +++ b/libbuild2/config/utility.txx @@ -0,0 +1,66 @@ +// file : libbuild2/config/utility.txx -*- C++ -*- +// copyright : Copyright (c) 2014-2019 Code Synthesis Ltd +// license : MIT; see accompanying LICENSE file + +#include <libbuild2/scope.hxx> +#include <libbuild2/context.hxx> + +namespace build2 +{ + namespace config + { + template <typename T> + pair<lookup, bool> + required (scope& root, + const variable& var, + const T& def_val, + bool def_ovr, + uint64_t save_flags) + { + // Note: see also omitted() if changing anything here. + + if (current_mif->id == configure_id) + save_variable (root, var, save_flags); + + pair<lookup, size_t> org (root.find_original (var)); + + bool n (false); // New flag. + lookup l (org.first); + + // The interaction with command line overrides can get tricky. For + // example, the override to defaul value could make (non-recursive) + // command line override in the outer scope no longer apply. So what we + // are going to do is first ignore overrides and perform the normal + // logic on the original. Then we apply the overrides on the result. + // + if (!l.defined () || (def_ovr && !l.belongs (root))) + { + value& v (root.assign (var) = def_val); + v.extra = true; // Default value flag. + + n = (save_flags & save_commented) == 0; // Absence means default. + l = lookup (v, var, root); + org = make_pair (l, 1); // Lookup depth is 1 since it's in root.vars. + } + // Treat an inherited value that was set to default as new. + // + else if (l->extra) + n = (save_flags & save_commented) == 0; // Absence means default. + + if (var.overrides != nullptr) + { + pair<lookup, size_t> ovr (root.find_override (var, move (org))); + + if (l != ovr.first) // Overriden? + { + // Override is always treated as new. + // + n = true; + l = move (ovr.first); + } + } + + return pair<lookup, bool> (l, n); + } + } +} |