diff options
-rw-r--r-- | bpkg/pkg-build.cxx | 391 | ||||
-rw-r--r-- | tests/pkg-build.testscript | 539 |
2 files changed, 560 insertions, 370 deletions
diff --git a/bpkg/pkg-build.cxx b/bpkg/pkg-build.cxx index 0196dcc..91f32c3 100644 --- a/bpkg/pkg-build.cxx +++ b/bpkg/pkg-build.cxx @@ -1284,11 +1284,10 @@ namespace bpkg } }; - using dependents_map = map<config_package, dependent_info>; - using dependencies_set = set<config_package>; + using dependents_map = map<config_package, dependent_info>; - dependents_map dependents; - dependencies_set dependencies; + dependents_map dependents; + packages dependencies; using positions = small_vector<pair<size_t, size_t>, 1>; using shadow_dependents_map = map<config_package, positions>; @@ -1334,6 +1333,9 @@ namespace bpkg packages ({move (dep)})); } + // Note: adds the specified dependencies to the end of the configuration + // dependencies list suppressing duplicates. + // void add (config_package&& dependent, bool existing, @@ -1342,7 +1344,7 @@ namespace bpkg { assert (position.first != 0 && position.second != 0); - dependencies.insert (deps.begin (), deps.end ()); + add_dependencies (deps); // Don't move from since will be used later. auto i (dependents.find (dependent)); @@ -1373,7 +1375,8 @@ namespace bpkg bool contains_dependency (const config_package& d) const { - return dependencies.find (d) != dependencies.end (); + return find (dependencies.begin (), dependencies.end (), d) != + dependencies.end (); } // Return true if this configuration contains any of the specified @@ -1406,7 +1409,13 @@ namespace bpkg return false; } - // Note: doesn't change the negotiate member of this configuration. + // Notes: + // + // - Adds dependencies of the being merged from configuration to the end + // of the current configuration dependencies list suppressing + // duplicates. + // + // - Doesn't change the negotiate member of this configuration. // void merge (postponed_configuration&& c) @@ -1439,16 +1448,7 @@ namespace bpkg // Merge dependencies. // - // Looks like C++17 set::merge() is what we need. Note, however, that - // some older standard libraries (for example libc++ 7.0.0) don't - // support this function. Thus, let's enable its use based on the - // feature test invented by C++20. - // -#ifdef __cpp_lib_node_extract - dependencies.merge (move (c.dependencies)); -#else - dependencies.insert (c.dependencies.begin (), c.dependencies.end ()); -#endif + add_dependencies (move (c.dependencies)); // Pick the depth of the outermost negotiated configuration (minimum // non-zero depth) between the two. @@ -1629,6 +1629,32 @@ namespace bpkg return r; } + + private: + // Add the specified packages to the end of the dependencies list + // suppressing duplicates. + // + void + add_dependencies (packages&& deps) + { + for (auto& d: deps) + { + if (find (dependencies.begin (), dependencies.end (), d) == + dependencies.end ()) + dependencies.push_back (move (d)); + } + } + + void + add_dependencies (const packages& deps) + { + for (const auto& d: deps) + { + if (find (dependencies.begin (), dependencies.end (), d) == + dependencies.end ()) + dependencies.push_back (d); + } + } }; // @@ TODO: describe. @@ -4012,8 +4038,11 @@ namespace bpkg // Note: the dependent may already exist in the cluster with a // subset of dependencies. // - pair<postponed_configuration&, optional<bool>> r ( - postponed_cfgs.add (cp, true /* existing */, dp, cfg_deps)); + postponed_configuration& cfg ( + postponed_cfgs.add (cp, + true /* existing */, + dp, + cfg_deps).first); // Can we merge clusters as a result? Seems so. // @@ -4027,24 +4056,34 @@ namespace bpkg // // Note: this is a special case of the below more general logic. // -#if 0 - postponed_configuration& cfg (r.first); + // Also note that we can distinguish the simple case by the fact + // that the resulting cluster is not negotiated. Note however, + // that in this case it is guaranteed that all the involved + // clusters will be merged into the cluster which the being + // re-evaluated dependent belongs to since this cluster (while + // not being negotiated) already has non-zero depth (see + // collect_build_postponed() for details). + // + assert (cfg.depth != 0); - if (!simple) // @@ TODO + if (cfg.negotiated) { + l5 ([&]{trace << "re-evaluating dependent " + << pkg.available_name_version_db () + << " involves non-negotiated configurations " + << "and results in " << cfg << ", throwing " + << "merge_configuration";}); + // Don't print the "while satisfying..." chain. // dep_chain.clear (); throw merge_configuration {cfg.depth}; } -#endif l5 ([&]{trace << "re-evaluating dependent " << pkg.available_name_version_db () - << " results in " << r.first;}); - - assert (r.second && !*r.second); + << " results in " << cfg;}); return false; } @@ -5037,165 +5076,192 @@ namespace bpkg struct existing_dependent_ex: existing_dependent { packages dependencies; + bool reevaluated = false; existing_dependent_ex (existing_dependent&& ed) : existing_dependent (move (ed)) {} }; map<config_package, existing_dependent_ex> dependents; - // @@ TODO: looks like we may end up adding additional - // dependencies to pcfg->dependencies which in turn may - // have additional existing dependents which we need to - // process? Feels like doing this iteratively is the - // best option? + // Looks like we may end up adding additional dependencies to + // pcfg->dependencies which in turn may have additional existing + // dependents which we need to process. Feels like doing this + // iteratively is the best option. // - // Need to make sure we don't re-process the same existing - // dependents (maybe keep a "global" dependents set outside - // the loop that gets merged into from inner loop). Or, better, - // just a flag in existing_dependent_ex! + // Note that we need to make sure we don't re-process the same + // existing dependents. // - for (const config_package& p: pcfg->dependencies) + const packages& deps (pcfg->dependencies); + + // Note that the below collect_build_prerequisites() call can add + // new dependencies to the end of the cluster's dependencies list. + // Thus on each iteration we will only add existing dependents of + // unprocessed/new dependencies. We will also skip the already + // re-evaluated existing dependents. + // + for (size_t i (0); i != deps.size (); ) { - for (existing_dependent& ed: - query_existing_dependents (trace, - p.db, - p.name, - replaced_vers, - rpt_depts)) - { - config_package cp (ed.db, ed.selected->name); + size_t n (dependents.size ()); - // If this dependent is present in postponed_deps, then it means - // someone depends on it with configuration and it's no longer - // considered an existing dependent (it will be reconfigured). - // However, this fact may not be reflected yet. And it can - // actually turn out bogus. - // - auto pi (postponed_deps.find (cp)); - if (pi != postponed_deps.end ()) + for (; i != deps.size (); ++i) + { + const config_package& p (deps[i]); + + for (existing_dependent& ed: + query_existing_dependents (trace, + p.db, + p.name, + replaced_vers, + rpt_depts)) { - l5 ([&]{trace << "skip dep-postponed existing dependent " << cp - << " of dependency " << p;}); + config_package cp (ed.db, ed.selected->name); - // Note that here we would re-evaluate the existing dependent - // without specifying any configuration for it. + auto di (dependents.find (cp)); + + // Skip re-evaluated. // - pi->second.wout_config = true; + if (di != dependents.end () && di->second.reevaluated) + continue; - continue; - } + // If this dependent is present in postponed_deps, then it + // means someone depends on it with configuration and it's no + // longer considered an existing dependent (it will be + // reconfigured). However, this fact may not be reflected + // yet. And it can actually turn out bogus. + // + auto pi (postponed_deps.find (cp)); + if (pi != postponed_deps.end ()) + { + l5 ([&]{trace << "skip dep-postponed existing dependent " + << cp << " of dependency " << p;}); - // If the existing dependent is not in the map yet, then add it. - // Otherwise, if the dependency position is greater than that - // one in the existing map entry then skip it (this position - // will be up-negotiated, if it's still present). Otherwise, if - // the position is less then overwrite the existing entry. - // Otherwise (the position is equal), just add the dependency to - // the existing entry. - // - // Note that we want to re-evaluate the dependent up to the - // earliest dependency position and continue with the regular - // prerequisites collection (as we do for new dependents) - // afterwards. - // - auto i (dependents.find (cp)); - if (i == dependents.end ()) - { - i = dependents.emplace ( - move (cp), existing_dependent_ex (move (ed))).first; - } - else - { - size_t di1 (i->second.dependency_position.first); - size_t di2 (ed.dependency_position.first); + // Note that here we would re-evaluate the existing dependent + // without specifying any configuration for it. + // + pi->second.wout_config = true; - if (di1 < di2) continue; - else if (di1 > di2) - i->second = existing_dependent_ex (move (ed)); - //else if (di1 == di2) - // ; - } - - i->second.dependencies.push_back (p); - } - } - - // Re-evaluate existing dependents. - // - if (!dependents.empty ()) - { - l5 ([&]{trace << "re-evaluate existing dependents for " << *pcfg;}); + } - for (auto& d: dependents) - { - config_package cp (d.first); - existing_dependent_ex& ed (d.second); - packages& ds (ed.dependencies); + // If the existing dependent is not in the map yet, then add + // it. Otherwise, if the dependency position is greater than + // that one in the existing map entry then skip it (this + // position will be up-negotiated, if it's still present). + // Otherwise, if the position is less then overwrite the + // existing entry. Otherwise (the position is equal), just + // add the dependency to the existing entry. + // + // Note that we want to re-evaluate the dependent up to the + // earliest dependency position and continue with the regular + // prerequisites collection (as we do for new dependents) + // afterwards. + // + if (di == dependents.end ()) + { + di = dependents.emplace ( + move (cp), existing_dependent_ex (move (ed))).first; + } + else + { + size_t di1 (di->second.dependency_position.first); + size_t di2 (ed.dependency_position.first); - pair<shared_ptr<available_package>, - lazy_shared_ptr<repository_fragment>> rp ( - find_available_fragment (o, cp.db, ed.selected)); + if (di1 < di2) + continue; + else if (di1 > di2) + di->second = existing_dependent_ex (move (ed)); + //else if (di1 == di2) + // ; + } - build_package p { - build_package::build, - cp.db, - move (ed.selected), - move (rp.first), - move (rp.second), - nullopt, // Dependencies. - nullopt, // Dependencies alternatives. - nullopt, // Package skeleton. - nullopt, // Postponed dependency alternatives. - false, // Recursive collection. - nullopt, // Hold package. - nullopt, // Hold version. - {}, // Constraints. - false, // System. - false, // Keep output directory. - false, // Disfigure (from-scratch reconf). - false, // Configure-only. - nullopt, // Checkout root. - false, // Checkout purge. - strings (), // Configuration variables. - set<config_package> ( - ds.begin (), ds.end ()), // Required by (dependency). - false, // Required by dependents. - build_package::adjust_reconfigure}; + di->second.dependencies.push_back (p); + } + } - // Note: not recursive. - // - collect_build (o, - move (p), - fdb, - rpt_depts, - apc, - true /* initial_collection */, - replaced_vers); + // Re-evaluate the newly added existing dependents, if any. + // + if (dependents.size () != n) + { + l5 ([&]{trace << "re-evaluate existing dependents for " << *pcfg;}); - build_package* b (entered_build (cp)); - assert (b != nullptr); + for (auto& d: dependents) + { + existing_dependent_ex& ed (d.second); - // Re-evaluate up to the earliest position. - // - assert (ed.dependency_position.first != 0); + // Skip re-evaluated. + // + if (ed.reevaluated) + continue; - build_package_refs dep_chain; - collect_build_prerequisites (o, - *b, - fdb, - rpt_depts, - apc, - false /* initial_collection */, - replaced_vers, - dep_chain, - &postponed_repo, - &postponed_alts, - numeric_limits<size_t>::max (), - postponed_deps, - postponed_cfgs, - false /* force_configured */, - ed.dependency_position); + config_package cp (d.first); + packages& ds (ed.dependencies); + + pair<shared_ptr<available_package>, + lazy_shared_ptr<repository_fragment>> rp ( + find_available_fragment (o, cp.db, ed.selected)); + + build_package p { + build_package::build, + cp.db, + move (ed.selected), + move (rp.first), + move (rp.second), + nullopt, // Dependencies. + nullopt, // Dependencies alternatives. + nullopt, // Package skeleton. + nullopt, // Postponed dependency alternatives. + false, // Recursive collection. + nullopt, // Hold package. + nullopt, // Hold version. + {}, // Constraints. + false, // System. + false, // Keep output directory. + false, // Disfigure (from-scratch reconf). + false, // Configure-only. + nullopt, // Checkout root. + false, // Checkout purge. + strings (), // Configuration variables. + set<config_package> ( // Required by (dependency). + ds.begin (), ds.end ()), + false, // Required by dependents. + build_package::adjust_reconfigure}; + + // Note: not recursive. + // + collect_build (o, + move (p), + fdb, + rpt_depts, + apc, + true /* initial_collection */, + replaced_vers); + + build_package* b (entered_build (cp)); + assert (b != nullptr); + + // Re-evaluate up to the earliest position. + // + assert (ed.dependency_position.first != 0); + + build_package_refs dep_chain; + collect_build_prerequisites (o, + *b, + fdb, + rpt_depts, + apc, + false /* initial_collection */, + replaced_vers, + dep_chain, + &postponed_repo, + &postponed_alts, + numeric_limits<size_t>::max (), + postponed_deps, + postponed_cfgs, + false /* force_configured */, + ed.dependency_position); + + ed.reevaluated = true; + } } } } @@ -5224,8 +5290,7 @@ namespace bpkg // them (they may also process existing packages, which we are // prepared to ignore). // - packages dependencies (pcfg->dependencies.begin (), - pcfg->dependencies.end ()); + packages dependencies (pcfg->dependencies); packages dependents; dependents.reserve (pcfg->dependents.size ()); diff --git a/tests/pkg-build.testscript b/tests/pkg-build.testscript index e5e6b23..5e70055 100644 --- a/tests/pkg-build.testscript +++ b/tests/pkg-build.testscript @@ -5290,174 +5290,242 @@ test.options += --no-progress : dependent-single-position : { - $clone_cfg; + +$clone_cfg - $* foo 2>>~%EOE%; - %.* - trace: pkg_build: refine package collection/plan execution from scratch - %.* - trace: collect_build: add foo/1.0.0 - trace: collect_build_prerequisites: begin foo/1.0.0 - %.* - trace: collect_build: add libfoo/1.0.0 - trace: collect_build_prerequisites: cfg-postpone dependency libfoo/1.0.0 of dependent foo/1.0.0 - trace: postponed_configurations::add: create {foo | libfoo->{foo/1,1}} - trace: collect_build_prerequisites: postpone foo/1.0.0 - trace: collect_build_postponed (0): begin - trace: collect_build_postponed (1): begin {foo | libfoo->{foo/1,1}} - %.* - trace: collect_build_postponed (1): cfg-negotiate begin {foo | libfoo->{foo/1,1}} - trace: collect_build_postponed (1): recursively collect cfg-negotiated dependencies - trace: collect_build_prerequisites: begin libfoo/1.0.0 - trace: collect_build_prerequisites: end libfoo/1.0.0 - trace: collect_build_postponed (1): recursively collect cfg-negotiated dependents - trace: collect_build_postponed (1): select cfg-negotiated dependency alternative for dependent foo/1.0.0 - trace: collect_build_prerequisites: resume foo/1.0.0 - trace: collect_build_prerequisites: end foo/1.0.0 - trace: collect_build_postponed (1): cfg-negotiate end {foo | libfoo->{foo/1,1}}! - trace: collect_build_postponed (1): end {foo | libfoo->{foo/1,1}} - trace: collect_build_postponed (0): end - trace: execute_plan: simulate: yes - %.* - EOE + : basic + : + { + $clone_cfg; - # Downgrade the dependency. - # - $* ?libfoo/0.1.0 2>>~%EOE%; - %.* - trace: pkg_build: refine package collection/plan execution from scratch - %.* - trace: execute_plan: simulate: yes - %.* - trace: evaluate_dependency: libfoo/1.0.0: update to libfoo/0.1.0 - %.* - trace: pkg_build: refine package collection/plan execution - %.* - trace: collect_build_prerequisites: cfg-postpone dependency libfoo/0.1.0 of existing dependent foo/1.0.0 - trace: postponed_configurations::add: create {foo^ | libfoo->{foo/1,1}} - trace: collect_build_postponed (0): begin - trace: collect_build_postponed (1): begin {foo^ | libfoo->{foo/1,1}} - %.* - trace: collect_build_postponed (1): re-evaluate existing dependents for {foo^ | libfoo->{foo/1,1}} - trace: collect_build: add foo/1.0.0 - %.* - trace: postponed_configurations::add: add {foo^ 1,1: libfoo} to {foo^ | libfoo->{foo/1,1}} - trace: collect_build_postponed (1): cfg-negotiate begin {foo^ | libfoo->{foo/1,1}} - trace: collect_build_postponed (1): recursively collect cfg-negotiated dependencies - trace: collect_build_prerequisites: begin libfoo/0.1.0 - trace: collect_build_prerequisites: end libfoo/0.1.0 - trace: collect_build_postponed (1): recursively collect cfg-negotiated dependents - trace: collect_build_postponed (1): select cfg-negotiated dependency alternative for dependent foo/1.0.0 - trace: collect_build_prerequisites: resume foo/1.0.0 - trace: collect_build_prerequisites: end foo/1.0.0 - trace: collect_build_postponed (1): cfg-negotiate end {foo^ | libfoo->{foo/1,1}}! - trace: collect_build_postponed (1): end {foo^ | libfoo->{foo/1,1}} - trace: collect_build_postponed (0): end - %.* - trace: execute_plan: simulate: yes - %.* - EOE + $* foo 2>>~%EOE%; + %.* + trace: pkg_build: refine package collection/plan execution from scratch + %.* + trace: collect_build: add foo/1.0.0 + trace: collect_build_prerequisites: begin foo/1.0.0 + %.* + trace: collect_build: add libfoo/1.0.0 + trace: collect_build_prerequisites: cfg-postpone dependency libfoo/1.0.0 of dependent foo/1.0.0 + trace: postponed_configurations::add: create {foo | libfoo->{foo/1,1}} + trace: collect_build_prerequisites: postpone foo/1.0.0 + trace: collect_build_postponed (0): begin + trace: collect_build_postponed (1): begin {foo | libfoo->{foo/1,1}} + %.* + trace: collect_build_postponed (1): cfg-negotiate begin {foo | libfoo->{foo/1,1}} + trace: collect_build_postponed (1): recursively collect cfg-negotiated dependencies + trace: collect_build_prerequisites: begin libfoo/1.0.0 + trace: collect_build_prerequisites: end libfoo/1.0.0 + trace: collect_build_postponed (1): recursively collect cfg-negotiated dependents + trace: collect_build_postponed (1): select cfg-negotiated dependency alternative for dependent foo/1.0.0 + trace: collect_build_prerequisites: resume foo/1.0.0 + trace: collect_build_prerequisites: end foo/1.0.0 + trace: collect_build_postponed (1): cfg-negotiate end {foo | libfoo->{foo/1,1}}! + trace: collect_build_postponed (1): end {foo | libfoo->{foo/1,1}} + trace: collect_build_postponed (0): end + trace: execute_plan: simulate: yes + %.* + EOE - # Reconfigure the dependency and hold. - # - $* libfoo/0.1.0 +{ config.libfoo.extras=true } 2>>~%EOE%; - %.* - trace: pkg_build: refine package collection/plan execution from scratch - %.* - trace: collect_build: add libfoo/0.1.0 - %.* - trace: collect_build_prerequisites: cfg-postpone dependency libfoo/0.1.0 of existing dependent foo/1.0.0 - trace: postponed_configurations::add: create {foo^ | libfoo->{foo/1,1}} - trace: collect_build_postponed (0): begin - trace: collect_build_postponed (1): begin {foo^ | libfoo->{foo/1,1}} - %.* - trace: collect_build_postponed (1): re-evaluate existing dependents for {foo^ | libfoo->{foo/1,1}} - %.* - trace: collect_build: add foo/1.0.0 - %.* - trace: postponed_configurations::add: add {foo^ 1,1: libfoo} to {foo^ | libfoo->{foo/1,1}} - trace: collect_build_postponed (1): cfg-negotiate begin {foo^ | libfoo->{foo/1,1}} - trace: collect_build_postponed (1): recursively collect cfg-negotiated dependencies - trace: collect_build_prerequisites: begin libfoo/0.1.0 - trace: collect_build_prerequisites: end libfoo/0.1.0 - trace: collect_build_postponed (1): recursively collect cfg-negotiated dependents - trace: collect_build_postponed (1): select cfg-negotiated dependency alternative for dependent foo/1.0.0 - trace: collect_build_prerequisites: resume foo/1.0.0 - trace: collect_build_prerequisites: end foo/1.0.0 - trace: collect_build_postponed (1): cfg-negotiate end {foo^ | libfoo->{foo/1,1}}! - trace: collect_build_postponed (1): end {foo^ | libfoo->{foo/1,1}} - trace: collect_build_postponed (0): end - %.* - trace: execute_plan: simulate: yes - %.* - EOE + # Downgrade the dependency. + # + $* ?libfoo/0.1.0 2>>~%EOE%; + %.* + trace: pkg_build: refine package collection/plan execution from scratch + %.* + trace: execute_plan: simulate: yes + %.* + trace: evaluate_dependency: libfoo/1.0.0: update to libfoo/0.1.0 + %.* + trace: pkg_build: refine package collection/plan execution + %.* + trace: collect_build_prerequisites: cfg-postpone dependency libfoo/0.1.0 of existing dependent foo/1.0.0 + trace: postponed_configurations::add: create {foo^ | libfoo->{foo/1,1}} + trace: collect_build_postponed (0): begin + trace: collect_build_postponed (1): begin {foo^ | libfoo->{foo/1,1}} + %.* + trace: collect_build_postponed (1): re-evaluate existing dependents for {foo^ | libfoo->{foo/1,1}} + trace: collect_build: add foo/1.0.0 + trace: collect_build_prerequisites: reeval foo/1.0.0 + %.* + trace: collect_build: pick libfoo/0.1.0 over libfoo/1.0.0 + trace: postponed_configurations::add: add {foo^ 1,1: libfoo} to {foo^ | libfoo->{foo/1,1}} + trace: collect_build_prerequisites: re-evaluating dependent foo/1.0.0 results in {foo^ | libfoo->{foo/1,1}} + trace: collect_build_prerequisites: re-evaluated foo/1.0.0 + trace: collect_build_postponed (1): cfg-negotiate begin {foo^ | libfoo->{foo/1,1}} + trace: collect_build_postponed (1): recursively collect cfg-negotiated dependencies + trace: collect_build_prerequisites: begin libfoo/0.1.0 + trace: collect_build_prerequisites: end libfoo/0.1.0 + trace: collect_build_postponed (1): recursively collect cfg-negotiated dependents + trace: collect_build_postponed (1): select cfg-negotiated dependency alternative for dependent foo/1.0.0 + trace: collect_build_prerequisites: resume foo/1.0.0 + trace: collect_build_prerequisites: end foo/1.0.0 + trace: collect_build_postponed (1): cfg-negotiate end {foo^ | libfoo->{foo/1,1}}! + trace: collect_build_postponed (1): end {foo^ | libfoo->{foo/1,1}} + trace: collect_build_postponed (0): end + %.* + trace: execute_plan: simulate: yes + %.* + EOE - $pkg_status -r >>EOO; - !libfoo configured !0.1.0 available 1.0.0 - !foo configured 1.0.0 + # Reconfigure the dependency and hold. + # + $* libfoo/0.1.0 +{ config.libfoo.extras=true } 2>>~%EOE%; + %.* + trace: pkg_build: refine package collection/plan execution from scratch + %.* + trace: collect_build: add libfoo/0.1.0 + %.* + trace: collect_build_prerequisites: cfg-postpone dependency libfoo/0.1.0 of existing dependent foo/1.0.0 + trace: postponed_configurations::add: create {foo^ | libfoo->{foo/1,1}} + trace: collect_build_postponed (0): begin + trace: collect_build_postponed (1): begin {foo^ | libfoo->{foo/1,1}} + %.* + trace: collect_build_postponed (1): re-evaluate existing dependents for {foo^ | libfoo->{foo/1,1}} + %.* + trace: collect_build: add foo/1.0.0 + trace: collect_build_prerequisites: reeval foo/1.0.0 + %.* + trace: postponed_configurations::add: add {foo^ 1,1: libfoo} to {foo^ | libfoo->{foo/1,1}} + trace: collect_build_prerequisites: re-evaluating dependent foo/1.0.0 results in {foo^ | libfoo->{foo/1,1}} + trace: collect_build_prerequisites: re-evaluated foo/1.0.0 + trace: collect_build_postponed (1): cfg-negotiate begin {foo^ | libfoo->{foo/1,1}} + trace: collect_build_postponed (1): recursively collect cfg-negotiated dependencies + trace: collect_build_prerequisites: begin libfoo/0.1.0 + trace: collect_build_prerequisites: end libfoo/0.1.0 + trace: collect_build_postponed (1): recursively collect cfg-negotiated dependents + trace: collect_build_postponed (1): select cfg-negotiated dependency alternative for dependent foo/1.0.0 + trace: collect_build_prerequisites: resume foo/1.0.0 + trace: collect_build_prerequisites: end foo/1.0.0 + trace: collect_build_postponed (1): cfg-negotiate end {foo^ | libfoo->{foo/1,1}}! + trace: collect_build_postponed (1): end {foo^ | libfoo->{foo/1,1}} + trace: collect_build_postponed (0): end + %.* + trace: execute_plan: simulate: yes + %.* + EOE + + $pkg_status -r >>EOO; !libfoo configured !0.1.0 available 1.0.0 - EOO + !foo configured 1.0.0 + !libfoo configured !0.1.0 available 1.0.0 + EOO - # Upgrade the dependency and unhold existing dependent. - # - $* libfoo ?foo 2>>~%EOE%; - %.* - trace: pkg_build: refine package collection/plan execution from scratch - %.* - trace: collect_build: add libfoo/1.0.0 - %.* - trace: collect_build_prerequisites: cfg-postpone dependency libfoo/1.0.0 of existing dependent foo/1.0.0 - trace: postponed_configurations::add: create {foo^ | libfoo->{foo/1,1}} - trace: collect_build_postponed (0): begin - trace: collect_build_postponed (1): begin {foo^ | libfoo->{foo/1,1}} - %.* - trace: collect_build_postponed (1): re-evaluate existing dependents for {foo^ | libfoo->{foo/1,1}} - %.* - trace: postponed_configurations::add: add {foo^ 1,1: libfoo} to {foo^ | libfoo->{foo/1,1}} - trace: collect_build_postponed (1): cfg-negotiate begin {foo^ | libfoo->{foo/1,1}} - trace: collect_build_postponed (1): recursively collect cfg-negotiated dependencies - trace: collect_build_prerequisites: begin libfoo/1.0.0 - trace: collect_build_prerequisites: end libfoo/1.0.0 - trace: collect_build_postponed (1): recursively collect cfg-negotiated dependents - trace: collect_build_postponed (1): select cfg-negotiated dependency alternative for dependent foo/1.0.0 - trace: collect_build_prerequisites: resume foo/1.0.0 - trace: collect_build_prerequisites: end foo/1.0.0 - trace: collect_build_postponed (1): cfg-negotiate end {foo^ | libfoo->{foo/1,1}}! - trace: collect_build_postponed (1): end {foo^ | libfoo->{foo/1,1}} - trace: collect_build_postponed (0): end - %.* - trace: execute_plan: simulate: yes - %.* - trace: evaluate_dependency: foo/1.0.0: unused - %.* - trace: pkg_build: refine package collection/plan execution - %.* - trace: collect_drop: foo/1.0.0 package version needs to be replaced with drop - trace: pkg_build: collection failed due to package version replacement, retry from scratch - %.* - trace: pkg_build: refine package collection/plan execution from scratch - %.* - trace: collect_build: add libfoo/1.0.0 - %.* - trace: collect_build_prerequisites: skip expected to be dropped existing dependent foo of dependency libfoo - trace: collect_build_prerequisites: begin libfoo/1.0.0 - trace: collect_build_prerequisites: end libfoo/1.0.0 - trace: collect_drop: overwrite foo - %.* - trace: execute_plan: simulate: yes - %.* - EOE + # Upgrade the dependency and unhold existing dependent. + # + $* libfoo ?foo 2>>~%EOE%; + %.* + trace: pkg_build: refine package collection/plan execution from scratch + %.* + trace: collect_build: add libfoo/1.0.0 + %.* + trace: collect_build_prerequisites: cfg-postpone dependency libfoo/1.0.0 of existing dependent foo/1.0.0 + trace: postponed_configurations::add: create {foo^ | libfoo->{foo/1,1}} + trace: collect_build_postponed (0): begin + trace: collect_build_postponed (1): begin {foo^ | libfoo->{foo/1,1}} + %.* + trace: collect_build_postponed (1): re-evaluate existing dependents for {foo^ | libfoo->{foo/1,1}} + trace: collect_build_prerequisites: reeval foo/1.0.0 + %.* + trace: collect_build: pick libfoo/1.0.0 over libfoo/0.1.0 + trace: postponed_configurations::add: add {foo^ 1,1: libfoo} to {foo^ | libfoo->{foo/1,1}} + trace: collect_build_prerequisites: re-evaluating dependent foo/1.0.0 results in {foo^ | libfoo->{foo/1,1}} + trace: collect_build_prerequisites: re-evaluated foo/1.0.0 + trace: collect_build_postponed (1): cfg-negotiate begin {foo^ | libfoo->{foo/1,1}} + trace: collect_build_postponed (1): recursively collect cfg-negotiated dependencies + trace: collect_build_prerequisites: begin libfoo/1.0.0 + trace: collect_build_prerequisites: end libfoo/1.0.0 + trace: collect_build_postponed (1): recursively collect cfg-negotiated dependents + trace: collect_build_postponed (1): select cfg-negotiated dependency alternative for dependent foo/1.0.0 + trace: collect_build_prerequisites: resume foo/1.0.0 + trace: collect_build_prerequisites: end foo/1.0.0 + trace: collect_build_postponed (1): cfg-negotiate end {foo^ | libfoo->{foo/1,1}}! + trace: collect_build_postponed (1): end {foo^ | libfoo->{foo/1,1}} + trace: collect_build_postponed (0): end + %.* + trace: execute_plan: simulate: yes + %.* + trace: evaluate_dependency: foo/1.0.0: unused + %.* + trace: pkg_build: refine package collection/plan execution + %.* + trace: collect_drop: foo/1.0.0 package version needs to be replaced with drop + trace: pkg_build: collection failed due to package version replacement, retry from scratch + %.* + trace: pkg_build: refine package collection/plan execution from scratch + %.* + trace: collect_build: add libfoo/1.0.0 + %.* + trace: collect_build_prerequisites: skip expected to be dropped existing dependent foo of dependency libfoo + trace: collect_build_prerequisites: begin libfoo/1.0.0 + trace: collect_build_prerequisites: end libfoo/1.0.0 + trace: collect_drop: overwrite foo + %.* + trace: execute_plan: simulate: yes + %.* + EOE - $pkg_status -r >>EOO; - !libfoo configured 1.0.0 - EOO + $pkg_status -r >>EOO; + !libfoo configured 1.0.0 + EOO + + $pkg_drop libfoo + } + + : postpone-existing + : + if false + { + $clone_cfg; - $pkg_drop libfoo + # Dependencies: + # + # fix/1.0.0: depends: foo(c) + # foo/1.0.0: depends: libfoo(c) + # + # fix/0.1.0: depends: foo == 0.1.0 + # foo/0.1.0: depends: libfoo(c) + # + $* fix 2>!; + + # @@ So here we should have been in a situation that after libfoo is + # postponed with {foo^ | libfoo->{foo/1,1}} creation and we got + # to negotiating it, by that time foo has stopped to be an + # "existing" dependent since it was downgraded via fix/0.1.0. The + # natural fix would be adding a record somewhere and start from + # scratch (maybe add into postponed_poss with position {0,0}). We + # however crash on assertion failure earlier (see below). Sounds + # like we need to scratch earlier or maybe get rid of assertion + # and deal with the existing flag there. + # + $* libfoo/0.1.0 fix/0.1.0 2>>~%EOE% + %.* + trace: pkg_build: refine package collection/plan execution from scratch + %.* + trace: collect_build: add libfoo/0.1.0 + trace: collect_build: add fix/0.1.0 + %.* + trace: collect_build_prerequisites: cfg-postpone dependency libfoo/0.1.0 of existing dependent foo/1.0.0 + trace: postponed_configurations::add: create {foo^ | libfoo->{foo/1,1}} + %.* + trace: collect_build_prerequisites: begin fix/0.1.0 + %.* + trace: collect_build: add foo/0.1.0 + info: package fix dependency on (foo == 0.1.0) is forcing downgrade of foo/1.0.0 to 0.1.0 + trace: collect_build_prerequisites: no cfg-clause for dependency foo/0.1.0 of dependent fix/0.1.0 + %.* + trace: collect_build_prerequisites: skip being built existing dependent fix of dependency foo + trace: collect_build_prerequisites: begin foo/0.1.0 + %.* + trace: collect_build: pick libfoo/0.1.0 over libfoo/1.0.0 + trace: collect_build_prerequisites: cfg-postpone dependency libfoo/0.1.0 of dependent foo/0.1.0 + trace: postponed_configurations::add: add {foo 1,1: libfoo} to {foo^ | libfoo->{foo/1,1}} + bpkg: /home/karen/work/build2/bpkg/bpkg/pkg-build.cxx:1361: void bpkg::postponed_configuration::add(bpkg::config_package&&, bool, std::pair<long unsigned int, long unsigned int>, bpkg::postponed_configuration::packages&&): Assertion 'ddi.existing == existing' failed. + EOE + } } : dependent-multiple-positions : - if false { +$clone_cfg @@ -5472,6 +5540,7 @@ test.options += --no-progress : non-negotiated : + if false { $clone_cfg; @@ -5483,6 +5552,7 @@ test.options += --no-progress : negotiated : + if false { $clone_cfg; @@ -5494,12 +5564,63 @@ test.options += --no-progress : re-evaluating-dependent : + if false { $clone_cfg; $* tex 2>!; + # @@ Seems we should get rid of this assertion (as suggested above) + # since the situation is pretty valid here: we just should + # up-negotiate 'tex: depends: libfoo(c)' after existing dependent + # tex was re-evaluated and become a regular dependent in a sence + # (we still need to keep the existing flag for it; see + # collect_build_prerequisites()). + # $* baz/0.1.0 2>>~%EOE% + %.* + trace: pkg_build: refine package collection/plan execution from scratch + %.* + trace: collect_build: add baz/0.1.0 + trace: collect_build_prerequisites: begin baz/0.1.0 + %.* + trace: collect_build: add libbar/0.1.0 + info: package baz dependency on (libbar == 0.1.0) is forcing downgrade of libbar/1.0.0 to 0.1.0 + trace: collect_build_prerequisites: cfg-postpone dependency libbar/0.1.0 of dependent baz/0.1.0 + trace: collect_build: add libfoo/0.1.0 + info: package baz dependency on (libfoo == 0.1.0) is forcing downgrade of libfoo/1.0.0 to 0.1.0 + trace: collect_build_prerequisites: cfg-postpone dependency libfoo/0.1.0 of dependent baz/0.1.0 + trace: postponed_configurations::add: create {baz | libbar->{baz/1,1} libfoo->{baz/1,1}} + trace: collect_build_prerequisites: postpone baz/0.1.0 + trace: collect_build_postponed (0): begin + trace: collect_build_postponed (1): begin {baz | libbar->{baz/1,1} libfoo->{baz/1,1}} + %.* + trace: collect_build_postponed (1): re-evaluate existing dependents for {baz | libbar->{baz/1,1} libfoo->{baz/1,1}} + %.* + trace: collect_build: add tex/1.0.0 + trace: collect_build_prerequisites: reeval tex/1.0.0 + %.* + trace: collect_build: pick libbar/0.1.0 over libbar/1.0.0 + trace: postponed_configurations::add: add {tex^ 1,1: libbar} to {baz | libbar->{baz/1,1} libfoo->{baz/1,1}} + trace: collect_build_prerequisites: re-evaluating dependent tex/1.0.0 results in {baz tex^ | libbar->{baz/1,1 tex/1,1} libfoo->{baz/1,1}} + trace: collect_build_prerequisites: re-evaluated tex/1.0.0 + trace: collect_build_postponed (1): cfg-negotiate begin {baz tex^ | libbar->{baz/1,1 tex/1,1} libfoo->{baz/1,1}} + trace: collect_build_postponed (1): recursively collect cfg-negotiated dependencies + trace: collect_build_prerequisites: begin libbar/0.1.0 + trace: collect_build_prerequisites: end libbar/0.1.0 + trace: collect_build_prerequisites: begin libfoo/0.1.0 + trace: collect_build_prerequisites: end libfoo/0.1.0 + trace: collect_build_postponed (1): recursively collect cfg-negotiated dependents + trace: collect_build_postponed (1): select cfg-negotiated dependency alternative for dependent baz/0.1.0 + trace: collect_build_prerequisites: resume baz/0.1.0 + trace: collect_build_prerequisites: end baz/0.1.0 + trace: collect_build_postponed (1): select cfg-negotiated dependency alternative for dependent tex/1.0.0 + trace: collect_build_prerequisites: resume tex/1.0.0 + %.* + trace: collect_build: pick libfoo/0.1.0 over libfoo/1.0.0 + trace: collect_build_prerequisites: cfg-postpone dependency libfoo/0.1.0 of dependent tex/1.0.0 + trace: postponed_configurations::add: add {tex 2,1: libfoo} to {baz tex^ | libbar->{baz/1,1 tex/1,1} libfoo->{baz/1,1}}? + bpkg: /home/karen/work/build2/bpkg/bpkg/pkg-build.cxx:1361: void bpkg::postponed_configuration::add(bpkg::config_package&&, bool, std::pair<long unsigned int, long unsigned int>, bpkg::postponed_configuration::packages&&): Assertion 'ddi.existing == existing' failed. EOE } } @@ -5575,8 +5696,8 @@ test.options += --no-progress trace: collect_build_prerequisites: cfg-postpone dependency libbar/1.0.0 of dependent box/1.0.0 trace: collect_build_prerequisites: cfg-postpone dependency libfoo/1.0.0 of dependent box/1.0.0 trace: postponed_configurations::add: add {box 1,1: libbar libfoo} to {foo | libfoo->{foo/1,1}}! - trace: postponed_configurations::add: merge {bar | libbar->{bar/1,1}}! into {box foo | libbar->{box/1,1} libfoo->{box/1,1 foo/1,1}}! - trace: collect_build_prerequisites: cfg-postponing dependent box/1.0.0 involves negotiated configurations and results in {bar box foo | libbar->{bar/1,1 box/1,1} libfoo->{box/1,1 foo/1,1}}!, throwing retry_configuration + trace: postponed_configurations::add: merge {bar | libbar->{bar/1,1}}! into {box foo | libfoo->{box/1,1 foo/1,1} libbar->{box/1,1}}! + trace: collect_build_prerequisites: cfg-postponing dependent box/1.0.0 involves negotiated configurations and results in {bar box foo | libfoo->{box/1,1 foo/1,1} libbar->{bar/1,1 box/1,1}}!, throwing retry_configuration trace: collect_build_postponed (0): cfg-negotiation of {foo | libfoo->{foo/1,1}} failed due to dependent box, adding shadow dependent and re-negotiating trace: collect_build_postponed (1): begin {foo | libfoo->{foo/1,1}} %.* @@ -5606,8 +5727,8 @@ test.options += --no-progress trace: collect_build_prerequisites: cfg-postpone dependency libbar/1.0.0 of dependent box/1.0.0 trace: collect_build_prerequisites: cfg-postpone dependency libfoo/1.0.0 of dependent box/1.0.0 trace: postponed_configurations::add: add {box 1,1: libbar libfoo} to {foo | libfoo->{foo/1,1}}! - trace: postponed_configurations::add: merge {bar | libbar->{bar/1,1}}! into {box foo | libbar->{box/1,1} libfoo->{box/1,1 foo/1,1}}! - trace: collect_build_prerequisites: dependent box/1.0.0 is a shadow dependent for {bar box foo | libbar->{bar/1,1 box/1,1} libfoo->{box/1,1 foo/1,1}}! + trace: postponed_configurations::add: merge {bar | libbar->{bar/1,1}}! into {box foo | libfoo->{box/1,1 foo/1,1} libbar->{box/1,1}}! + trace: collect_build_prerequisites: dependent box/1.0.0 is a shadow dependent for {bar box foo | libfoo->{box/1,1 foo/1,1} libbar->{bar/1,1 box/1,1}}! trace: collect_build_prerequisites: configuration for cfg-postponed dependencies of dependent box/1.0.0 is negotiated trace: collect_build_prerequisites: dependency libbar/1.0.0 of dependent box/1.0.0 is already (being) recursively collected, skipping trace: collect_build_prerequisites: dependency libfoo/1.0.0 of dependent box/1.0.0 is already (being) recursively collected, skipping @@ -5951,45 +6072,48 @@ test.options += --no-progress trace: collect_build_prerequisites: cfg-postpone dependency libbar/1.0.0 of dependent bix/1.0.0 trace: collect_build: add bar/1.0.0 trace: collect_build_prerequisites: cfg-postpone dependency bar/1.0.0 of dependent bix/1.0.0 - trace: postponed_configurations::add: create {bix | bar->{bix/1,1} libbar->{bix/1,1}} + trace: postponed_configurations::add: create {bix | libbar->{bix/1,1} bar->{bix/1,1}} trace: collect_build_prerequisites: postpone bix/1.0.0 trace: collect_build_postponed (0): begin - trace: collect_build_postponed (1): begin {bix | bar->{bix/1,1} libbar->{bix/1,1}} + trace: collect_build_postponed (1): begin {bix | libbar->{bix/1,1} bar->{bix/1,1}} %.* - trace: collect_build_postponed (1): cfg-negotiate begin {bix | bar->{bix/1,1} libbar->{bix/1,1}} + trace: collect_build_postponed (1): cfg-negotiate begin {bix | libbar->{bix/1,1} bar->{bix/1,1}} trace: collect_build_postponed (1): recursively collect cfg-negotiated dependencies + trace: collect_build_prerequisites: begin libbar/1.0.0 + trace: collect_build_prerequisites: end libbar/1.0.0 trace: collect_build_prerequisites: begin bar/1.0.0 %.* trace: collect_build_prerequisites: cfg-postpone dependency libbar/1.0.0 of dependent bar/1.0.0 - trace: postponed_configurations::add: add {bar 1,1: libbar} to {bix | bar->{bix/1,1} libbar->{bix/1,1}}? - trace: collect_build_prerequisites: cfg-postponing dependent bar/1.0.0 involves negotiated configurations and results in {bar bix | bar->{bix/1,1} libbar->{bar/1,1 bix/1,1}}?, throwing retry_configuration - trace: collect_build_postponed (0): cfg-negotiation of {bix | bar->{bix/1,1} libbar->{bix/1,1}} failed due to dependent bar, adding shadow dependent and re-negotiating - trace: collect_build_postponed (1): begin {bix | bar->{bix/1,1} libbar->{bix/1,1}} + trace: postponed_configurations::add: add {bar 1,1: libbar} to {bix | libbar->{bix/1,1} bar->{bix/1,1}}? + trace: collect_build_prerequisites: cfg-postponing dependent bar/1.0.0 involves negotiated configurations and results in {bar bix | libbar->{bar/1,1 bix/1,1} bar->{bix/1,1}}?, throwing retry_configuration + trace: collect_build_postponed (0): cfg-negotiation of {bix | libbar->{bix/1,1} bar->{bix/1,1}} failed due to dependent bar, adding shadow dependent and re-negotiating + trace: collect_build_postponed (1): begin {bix | libbar->{bix/1,1} bar->{bix/1,1}} %.* - trace: collect_build_postponed (1): cfg-negotiate begin {bix | bar->{bix/1,1} libbar->{bix/1,1}} + trace: collect_build_postponed (1): cfg-negotiate begin {bix | libbar->{bix/1,1} bar->{bix/1,1}} trace: collect_build_postponed (1): recursively collect cfg-negotiated dependencies + trace: collect_build_prerequisites: begin libbar/1.0.0 + trace: collect_build_prerequisites: end libbar/1.0.0 trace: collect_build_prerequisites: begin bar/1.0.0 %.* trace: collect_build_prerequisites: cfg-postpone dependency libbar/1.0.0 of dependent bar/1.0.0 - trace: postponed_configurations::add: add {bar 1,1: libbar} to {bix | bar->{bix/1,1} libbar->{bix/1,1}}? - trace: collect_build_prerequisites: dependent bar/1.0.0 is a shadow dependent for {bar bix | bar->{bix/1,1} libbar->{bar/1,1 bix/1,1}}? - trace: collect_build_prerequisites: cfg-postponing dependent bar/1.0.0 involves non-negotiated configurations and results in {bar bix | bar->{bix/1,1} libbar->{bar/1,1 bix/1,1}}?, throwing merge_configuration - trace: collect_build_postponed (0): cfg-negotiation of {bix | bar->{bix/1,1} libbar->{bix/1,1}} failed due to non-negotiated clusters, force-merging based on shadow cluster {bar bix | bar->{bix/1,1} libbar->{bar/1,1 bix/1,1}}? - trace: collect_build_postponed (1): begin {bix | bar->{bix/1,1} libbar->{bix/1,1}} + trace: postponed_configurations::add: add {bar 1,1: libbar} to {bix | libbar->{bix/1,1} bar->{bix/1,1}}? + trace: collect_build_prerequisites: dependent bar/1.0.0 is a shadow dependent for {bar bix | libbar->{bar/1,1 bix/1,1} bar->{bix/1,1}}? + trace: collect_build_prerequisites: cfg-postponing dependent bar/1.0.0 involves non-negotiated configurations and results in {bar bix | libbar->{bar/1,1 bix/1,1} bar->{bix/1,1}}?, throwing merge_configuration + trace: collect_build_postponed (0): cfg-negotiation of {bix | libbar->{bix/1,1} bar->{bix/1,1}} failed due to non-negotiated clusters, force-merging based on shadow cluster {bar bix | libbar->{bar/1,1 bix/1,1} bar->{bix/1,1}}? + trace: collect_build_postponed (1): begin {bix | libbar->{bix/1,1} bar->{bix/1,1}} %.* - trace: collect_build_postponed (1): cfg-negotiate begin {bix | bar->{bix/1,1} libbar->{bix/1,1}} + trace: collect_build_postponed (1): cfg-negotiate begin {bix | libbar->{bix/1,1} bar->{bix/1,1}} trace: collect_build_postponed (1): recursively collect cfg-negotiated dependencies + trace: collect_build_prerequisites: begin libbar/1.0.0 + trace: collect_build_prerequisites: end libbar/1.0.0 trace: collect_build_prerequisites: begin bar/1.0.0 %.* trace: collect_build_prerequisites: cfg-postpone dependency libbar/1.0.0 of dependent bar/1.0.0 - trace: postponed_configurations::add: add {bar 1,1: libbar} to {bix | bar->{bix/1,1} libbar->{bix/1,1}}? (shadow cluster-based) - trace: collect_build_prerequisites: dependent bar/1.0.0 is a shadow dependent for {bar bix | bar->{bix/1,1} libbar->{bar/1,1 bix/1,1}}? + trace: postponed_configurations::add: add {bar 1,1: libbar} to {bix | libbar->{bix/1,1} bar->{bix/1,1}}? (shadow cluster-based) + trace: collect_build_prerequisites: dependent bar/1.0.0 is a shadow dependent for {bar bix | libbar->{bar/1,1 bix/1,1} bar->{bix/1,1}}? trace: collect_build_prerequisites: configuration for cfg-postponed dependencies of dependent bar/1.0.0 is negotiated - trace: collect_build_prerequisites: collecting cfg-postponed dependency libbar/1.0.0 of dependent bar/1.0.0 - trace: collect_build_prerequisites: begin libbar/1.0.0 - trace: collect_build_prerequisites: end libbar/1.0.0 + trace: collect_build_prerequisites: dependency libbar/1.0.0 of dependent bar/1.0.0 is already (being) recursively collected, skipping trace: collect_build_prerequisites: end bar/1.0.0 - trace: collect_build_postponed (1): dependency libbar/1.0.0 is already (being) recursively collected, skipping trace: collect_build_postponed (1): recursively collect cfg-negotiated dependents trace: collect_build_postponed (1): select cfg-negotiated dependency alternative for dependent bix/1.0.0 trace: collect_build_prerequisites: resume bix/1.0.0 @@ -5999,24 +6123,23 @@ test.options += --no-progress trace: collect_build_prerequisites: begin bux/1.0.0 %.* trace: collect_build_prerequisites: cfg-postpone dependency libbar/1.0.0 of dependent bux/1.0.0 - trace: postponed_configurations::add: add {bux 1,1: libbar} to {bar bix | bar->{bix/1,1} libbar->{bar/1,1 bix/1,1}}? - trace: collect_build_prerequisites: cfg-postponing dependent bux/1.0.0 involves negotiated configurations and results in {bar bix bux | bar->{bix/1,1} libbar->{bar/1,1 bix/1,1 bux/1,1}}?, throwing retry_configuration - trace: collect_build_postponed (0): cfg-negotiation of {bix | bar->{bix/1,1} libbar->{bix/1,1}} failed due to dependent bux, adding shadow dependent and re-negotiating - trace: collect_build_postponed (1): begin {bix | bar->{bix/1,1} libbar->{bix/1,1}} + trace: postponed_configurations::add: add {bux 1,1: libbar} to {bar bix | libbar->{bar/1,1 bix/1,1} bar->{bix/1,1}}? + trace: collect_build_prerequisites: cfg-postponing dependent bux/1.0.0 involves negotiated configurations and results in {bar bix bux | libbar->{bar/1,1 bix/1,1 bux/1,1} bar->{bix/1,1}}?, throwing retry_configuration + trace: collect_build_postponed (0): cfg-negotiation of {bix | libbar->{bix/1,1} bar->{bix/1,1}} failed due to dependent bux, adding shadow dependent and re-negotiating + trace: collect_build_postponed (1): begin {bix | libbar->{bix/1,1} bar->{bix/1,1}} %.* - trace: collect_build_postponed (1): cfg-negotiate begin {bix | bar->{bix/1,1} libbar->{bix/1,1}} + trace: collect_build_postponed (1): cfg-negotiate begin {bix | libbar->{bix/1,1} bar->{bix/1,1}} trace: collect_build_postponed (1): recursively collect cfg-negotiated dependencies + trace: collect_build_prerequisites: begin libbar/1.0.0 + trace: collect_build_prerequisites: end libbar/1.0.0 trace: collect_build_prerequisites: begin bar/1.0.0 %.* trace: collect_build_prerequisites: cfg-postpone dependency libbar/1.0.0 of dependent bar/1.0.0 - trace: postponed_configurations::add: add {bar 1,1: libbar} to {bix | bar->{bix/1,1} libbar->{bix/1,1}}? (shadow cluster-based) - trace: collect_build_prerequisites: dependent bar/1.0.0 is a shadow dependent for {bar bix | bar->{bix/1,1} libbar->{bar/1,1 bix/1,1}}? + trace: postponed_configurations::add: add {bar 1,1: libbar} to {bix | libbar->{bix/1,1} bar->{bix/1,1}}? (shadow cluster-based) + trace: collect_build_prerequisites: dependent bar/1.0.0 is a shadow dependent for {bar bix | libbar->{bar/1,1 bix/1,1} bar->{bix/1,1}}? trace: collect_build_prerequisites: configuration for cfg-postponed dependencies of dependent bar/1.0.0 is negotiated - trace: collect_build_prerequisites: collecting cfg-postponed dependency libbar/1.0.0 of dependent bar/1.0.0 - trace: collect_build_prerequisites: begin libbar/1.0.0 - trace: collect_build_prerequisites: end libbar/1.0.0 + trace: collect_build_prerequisites: dependency libbar/1.0.0 of dependent bar/1.0.0 is already (being) recursively collected, skipping trace: collect_build_prerequisites: end bar/1.0.0 - trace: collect_build_postponed (1): dependency libbar/1.0.0 is already (being) recursively collected, skipping trace: collect_build_postponed (1): recursively collect cfg-negotiated dependents trace: collect_build_postponed (1): select cfg-negotiated dependency alternative for dependent bix/1.0.0 trace: collect_build_prerequisites: resume bix/1.0.0 @@ -6026,25 +6149,24 @@ test.options += --no-progress trace: collect_build_prerequisites: begin bux/1.0.0 %.* trace: collect_build_prerequisites: cfg-postpone dependency libbar/1.0.0 of dependent bux/1.0.0 - trace: postponed_configurations::add: add {bux 1,1: libbar} to {bar bix | bar->{bix/1,1} libbar->{bar/1,1 bix/1,1}}? - trace: collect_build_prerequisites: dependent bux/1.0.0 is a shadow dependent for {bar bix bux | bar->{bix/1,1} libbar->{bar/1,1 bix/1,1 bux/1,1}}? - trace: collect_build_prerequisites: cfg-postponing dependent bux/1.0.0 involves non-negotiated configurations and results in {bar bix bux | bar->{bix/1,1} libbar->{bar/1,1 bix/1,1 bux/1,1}}?, throwing merge_configuration - trace: collect_build_postponed (0): cfg-negotiation of {bix | bar->{bix/1,1} libbar->{bix/1,1}} failed due to non-negotiated clusters, force-merging based on shadow cluster {bar bix bux | bar->{bix/1,1} libbar->{bar/1,1 bix/1,1 bux/1,1}}? - trace: collect_build_postponed (1): begin {bix | bar->{bix/1,1} libbar->{bix/1,1}} + trace: postponed_configurations::add: add {bux 1,1: libbar} to {bar bix | libbar->{bar/1,1 bix/1,1} bar->{bix/1,1}}? + trace: collect_build_prerequisites: dependent bux/1.0.0 is a shadow dependent for {bar bix bux | libbar->{bar/1,1 bix/1,1 bux/1,1} bar->{bix/1,1}}? + trace: collect_build_prerequisites: cfg-postponing dependent bux/1.0.0 involves non-negotiated configurations and results in {bar bix bux | libbar->{bar/1,1 bix/1,1 bux/1,1} bar->{bix/1,1}}?, throwing merge_configuration + trace: collect_build_postponed (0): cfg-negotiation of {bix | libbar->{bix/1,1} bar->{bix/1,1}} failed due to non-negotiated clusters, force-merging based on shadow cluster {bar bix bux | libbar->{bar/1,1 bix/1,1 bux/1,1} bar->{bix/1,1}}? + trace: collect_build_postponed (1): begin {bix | libbar->{bix/1,1} bar->{bix/1,1}} %.* - trace: collect_build_postponed (1): cfg-negotiate begin {bix | bar->{bix/1,1} libbar->{bix/1,1}} + trace: collect_build_postponed (1): cfg-negotiate begin {bix | libbar->{bix/1,1} bar->{bix/1,1}} trace: collect_build_postponed (1): recursively collect cfg-negotiated dependencies + trace: collect_build_prerequisites: begin libbar/1.0.0 + trace: collect_build_prerequisites: end libbar/1.0.0 trace: collect_build_prerequisites: begin bar/1.0.0 %.* trace: collect_build_prerequisites: cfg-postpone dependency libbar/1.0.0 of dependent bar/1.0.0 - trace: postponed_configurations::add: add {bar 1,1: libbar} to {bix | bar->{bix/1,1} libbar->{bix/1,1}}? (shadow cluster-based) - trace: collect_build_prerequisites: dependent bar/1.0.0 is a shadow dependent for {bar bix | bar->{bix/1,1} libbar->{bar/1,1 bix/1,1}}? + trace: postponed_configurations::add: add {bar 1,1: libbar} to {bix | libbar->{bix/1,1} bar->{bix/1,1}}? (shadow cluster-based) + trace: collect_build_prerequisites: dependent bar/1.0.0 is a shadow dependent for {bar bix | libbar->{bar/1,1 bix/1,1} bar->{bix/1,1}}? trace: collect_build_prerequisites: configuration for cfg-postponed dependencies of dependent bar/1.0.0 is negotiated - trace: collect_build_prerequisites: collecting cfg-postponed dependency libbar/1.0.0 of dependent bar/1.0.0 - trace: collect_build_prerequisites: begin libbar/1.0.0 - trace: collect_build_prerequisites: end libbar/1.0.0 + trace: collect_build_prerequisites: dependency libbar/1.0.0 of dependent bar/1.0.0 is already (being) recursively collected, skipping trace: collect_build_prerequisites: end bar/1.0.0 - trace: collect_build_postponed (1): dependency libbar/1.0.0 is already (being) recursively collected, skipping trace: collect_build_postponed (1): recursively collect cfg-negotiated dependents trace: collect_build_postponed (1): select cfg-negotiated dependency alternative for dependent bix/1.0.0 trace: collect_build_prerequisites: resume bix/1.0.0 @@ -6054,14 +6176,14 @@ test.options += --no-progress trace: collect_build_prerequisites: begin bux/1.0.0 %.* trace: collect_build_prerequisites: cfg-postpone dependency libbar/1.0.0 of dependent bux/1.0.0 - trace: postponed_configurations::add: add {bux 1,1: libbar} to {bar bix | bar->{bix/1,1} libbar->{bar/1,1 bix/1,1}}? (shadow cluster-based) - trace: collect_build_prerequisites: dependent bux/1.0.0 is a shadow dependent for {bar bix bux | bar->{bix/1,1} libbar->{bar/1,1 bix/1,1 bux/1,1}}? + trace: postponed_configurations::add: add {bux 1,1: libbar} to {bar bix | libbar->{bar/1,1 bix/1,1} bar->{bix/1,1}}? (shadow cluster-based) + trace: collect_build_prerequisites: dependent bux/1.0.0 is a shadow dependent for {bar bix bux | libbar->{bar/1,1 bix/1,1 bux/1,1} bar->{bix/1,1}}? trace: collect_build_prerequisites: configuration for cfg-postponed dependencies of dependent bux/1.0.0 is negotiated trace: collect_build_prerequisites: dependency libbar/1.0.0 of dependent bux/1.0.0 is already (being) recursively collected, skipping trace: collect_build_prerequisites: end bux/1.0.0 trace: collect_build_prerequisites: end bix/1.0.0 - trace: collect_build_postponed (1): cfg-negotiate end {bar bix bux | bar->{bix/1,1} libbar->{bar/1,1 bix/1,1 bux/1,1}}! - trace: collect_build_postponed (1): end {bix | bar->{bix/1,1} libbar->{bix/1,1}} + trace: collect_build_postponed (1): cfg-negotiate end {bar bix bux | libbar->{bar/1,1 bix/1,1 bux/1,1} bar->{bix/1,1}}! + trace: collect_build_postponed (1): end {bix | libbar->{bix/1,1} bar->{bix/1,1}} trace: collect_build_postponed (0): end trace: execute_plan: simulate: yes %.* @@ -7825,8 +7947,11 @@ test.options += --no-progress trace: collect_build_postponed (1): re-evaluate existing dependents for {tix | libbar->{tix/1,1}} %.* trace: collect_build: add tex/1.0.0 + trace: collect_build_prerequisites: reeval tex/1.0.0 %.* trace: postponed_configurations::add: add {tex^ 1,1: libbar} to {tix | libbar->{tix/1,1}} + trace: collect_build_prerequisites: re-evaluating dependent tex/1.0.0 results in {tex^ tix | libbar->{tex/1,1 tix/1,1}} + trace: collect_build_prerequisites: re-evaluated tex/1.0.0 trace: collect_build_postponed (1): cfg-negotiate begin {tex^ tix | libbar->{tex/1,1 tix/1,1}} trace: collect_build_postponed (1): recursively collect cfg-negotiated dependencies trace: collect_build_prerequisites: begin libbar/1.0.0 |