From f355a4379f035df61a7702f5ff805eefb004fb20 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Tue, 1 Dec 2015 09:43:29 +0200 Subject: Override outer configuration install paths that contain package name --- build/config/utility | 24 +++++++++++++++++++----- build/config/utility.txx | 14 ++++++++------ 2 files changed, 27 insertions(+), 11 deletions(-) (limited to 'build/config') diff --git a/build/config/utility b/build/config/utility index 406c271..9a5dc5e 100644 --- a/build/config/utility +++ b/build/config/utility @@ -21,24 +21,38 @@ namespace build { // Set, if necessary, a required config.* variable. // + // If override is true and the variable doesn't come from this root + // scope or from the command line, then its value is "overridden" + // for this root scope. + // // Return the reference to the value as well as the indication of // whether the variable has actually been set. // template std::pair, bool> - required (scope& root, const variable&, const T& default_value); + required (scope& root, + const variable&, + const T& default_value, + bool override = false); template inline std::pair, bool> - required (scope& root, const std::string& name, const T& default_value) + required (scope& root, + const std::string& name, + const T& default_value, + bool override = false) { - return required (root, variable_pool.find (name), default_value); + return required ( + root, variable_pool.find (name), default_value, override); } inline std::pair, bool> - required (scope& root, const std::string& name, const char* default_value) + required (scope& root, + const std::string& name, + const char* default_value, + bool override = false) { - return required (root, name, std::string (default_value)); + return required (root, name, std::string (default_value), override); } // Set, if necessary, an optional config.* variable. In particular, diff --git a/build/config/utility.txx b/build/config/utility.txx index 943d308..06cb2eb 100644 --- a/build/config/utility.txx +++ b/build/config/utility.txx @@ -10,18 +10,20 @@ namespace build { template std::pair, bool> - required (scope& root, const variable& var, const T& def_value) + required (scope& root, const variable& var, const T& def_value, bool ovr) { using result = std::pair, bool>; if (auto l = root[var]) { - return l.belongs (*global_scope) - ? result (root.assign (var) = *l, true) - : result (*l, false); + if (l.belongs (*global_scope)) + return result (root.assign (var) = *l, true); + + if (!ovr || l.belongs (root)) + return result (*l, false); } - else - return result (root.assign (var) = def_value, true); + + return result (root.assign (var) = def_value, true); } template -- cgit v1.1