From c279979af18d59d935512d91c7e75762b914bdfd Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Tue, 18 Jul 2023 18:14:07 +0300 Subject: Don't reconfigure dependency if negotiated configuration doesn't change --- bpkg/package-skeleton.cxx | 62 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 60 insertions(+), 2 deletions(-) (limited to 'bpkg/package-skeleton.cxx') diff --git a/bpkg/package-skeleton.cxx b/bpkg/package-skeleton.cxx index a3cdcdc..567f2e7 100644 --- a/bpkg/package-skeleton.cxx +++ b/bpkg/package-skeleton.cxx @@ -1943,6 +1943,8 @@ namespace bpkg pair> package_skeleton:: collect_config () && { + // NOTE: remember to update config_checksum() if changing anything here. + assert (db_ != nullptr); // Must be called only once. using build2::config::variable_origin; @@ -1985,11 +1987,19 @@ namespace bpkg // variables which are project variables (i.e., names start with // config.). // + size_t pn (var_prefix_.size ()); for (const string& v: config_vars_) { - if (project_override (v, var_prefix_)) + size_t vn; + if (project_override (v, var_prefix_, &vn)) { - string n (var_name (v)); + // Skip config..develop (can potentially be passed by + // bdep-init) if the package doesn't use it. + // + if (!develop_ && v.compare (pn, vn - pn, ".develop") == 0) + continue; + + string n (v, 0, vn); // Check for a duplicate. // @@ -2055,6 +2065,54 @@ namespace bpkg return make_pair (move (vars), move (srcs)); } + string package_skeleton:: + config_checksum () + { + // Note: this is parallel to collect_config() logic but is not destructive. + + assert (db_ != nullptr); // Must be called before collect_config(). + + if (!loaded_old_config_) + load_old_config (); + + sha256 cs; + + if (!config_vars_.empty ()) + { + cstrings vs; + size_t pn (var_prefix_.size ()); + for (const string& v: config_vars_) + { + size_t vn; + if (project_override (v, var_prefix_, &vn)) + { + // Skip config..develop (can potentially be passed by + // bdep-init) if the package doesn't use it. + // + if (develop_ || v.compare (pn, vn - pn, ".develop") != 0) + cs.append (v); + } + } + } + + if (!dependent_vars_.empty ()) + { + for (const string& v: dependent_vars_) + cs.append (v); + } + + if (!reflect_.empty ()) + { + for (const reflect_variable_value& v: reflect_) + { + if (v.origin != build2::config::variable_origin::override_) + cs.append (serialize_cmdline (v.name, v.value)); + } + } + + return !cs.empty () ? cs.string () : string (); + } + const strings& package_skeleton:: merge_cmd_vars (const strings& dependent_vars, const strings& dependency_vars, -- cgit v1.1