From d1e5b4d89efdae78e14aa5ed7f2b8c23594d623e Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Wed, 25 May 2022 13:57:37 +0300 Subject: Review-inspired changes --- bpkg/pkg-build.cxx | 519 ++++++++++++++++----- .../dependency-alternatives/t11a/bax-1.0.0.tar.gz | Bin 0 -> 435 bytes .../dependency-alternatives/t11a/box-0.1.0.tar.gz | Bin 0 -> 402 bytes .../t11a/libbaz-0.1.0.tar.gz | Bin 0 -> 412 bytes .../t11a/libbox-0.1.0.tar.gz | Bin 0 -> 411 bytes tests/pkg-build.testscript | 457 +++++++++++++++++- 6 files changed, 835 insertions(+), 141 deletions(-) create mode 100644 tests/common/dependency-alternatives/t11a/bax-1.0.0.tar.gz create mode 100644 tests/common/dependency-alternatives/t11a/box-0.1.0.tar.gz create mode 100644 tests/common/dependency-alternatives/t11a/libbaz-0.1.0.tar.gz create mode 100644 tests/common/dependency-alternatives/t11a/libbox-0.1.0.tar.gz diff --git a/bpkg/pkg-build.cxx b/bpkg/pkg-build.cxx index d463432..3b2df30 100644 --- a/bpkg/pkg-build.cxx +++ b/bpkg/pkg-build.cxx @@ -1466,7 +1466,7 @@ namespace bpkg // As in add() above. // - assert (ddi.existing == sdi.existing); + assert (ddi.existing || !sdi.existing); } else dependents.emplace (d.first, move (d.second)); @@ -2142,7 +2142,15 @@ namespace bpkg // @@ TODO Describe. // - using postponed_positions = map>; + struct postponed_position: pair + { + bool replace; + + postponed_position (pair p, bool r) + : pair (p), replace (r) {} + }; + + using postponed_positions = map; struct postpone_position: scratch_collection { @@ -2777,25 +2785,91 @@ namespace bpkg pkg.reconfigure () && postponed_cfgs.find_dependency (cp) == nullptr) { - // Note that there can be multiple existing dependents for a - // dependency. We, however, only add the first one in the assumption - // that the remaining dependents will also be considered when the time - // for negotiation comes. + // If the dependent is being built, then check if it was re-evaluated + // to the position greater than the dependency position. Return true + // if that's the case, so this package is added to the resulting list + // and we can handle this situation. // - // @@ Maybe let's add all of them? + const function verify ( + [&postponed_cfgs] + (const config_package& cp, pair pos) + { + for (const postponed_configuration& cfg: postponed_cfgs) + { + if (cfg.negotiated) + { + if (const pair* p = + cfg.existing_dependent_position (cp)) + { + if (p->first > pos.first) + return true; + } + } + } + + return false; + }); + + // Note that there can be multiple existing dependents for a + // dependency. Theoretically, we could only add the first one in the + // assumption that the remaining dependents will also be considered + // when the time for negotiation comes. Let's, however, process all of + // them to detect the potential "re-evaluation on the greater + // dependency index" situation earlier. // vector eds ( query_existing_dependents (trace, - pdb, - nm, + cp.db, + cp.name, replaced_vers, postponed_cfgs, - rpt_depts)); + rpt_depts, + verify)); if (!eds.empty ()) { for (existing_dependent& ed: eds) { + config_package dcp (ed.db, ed.selected->name); + size_t& di (ed.dependency_position.first); + + const build_package* bp (&pkg); + + // Check if this dependent needs to be re-evaluated to an earlier + // dependency position and, if that's the case, create the + // configuration cluster with this dependency instead. + // + // Note that if the replace flag is false, we proceed normally in + // the assumption that the dependency referred by the entry will + // be collected later and its configuration cluster will be + // created normally and will be negotiated earlier than the + // cluster being created for the current dependency (see + // collect_build_postponed() for details). + // + auto pi (postponed_poss.find (dcp)); + + if (pi != postponed_poss.end () && + pi->second.first < di && + pi->second.replace) + { + // Overwrite the existing dependent dependency information and + // fall through to proceed as for the normal case. + // + bp = overwrite_existing_dependent_dependency ( + trace, + options, + ed, + pi->second, + fdb, + rpt_depts, + apc, + initial_collection, + replaced_vers, + postponed_cfgs); + + cp = config_package (bp->db, bp->name ()); + } + // Make sure that this existing dependent doesn't belong to any // (being) negotiated configuration cluster with a greater // dependency index. That would mean that this dependent has @@ -2803,8 +2877,6 @@ namespace bpkg // participate in the configuration negotiation of this earlier // dependency. // - size_t di (ed.dependency_position.first); - for (const postponed_configuration& cfg: postponed_cfgs) { if (const pair* p = @@ -2812,19 +2884,22 @@ namespace bpkg { size_t ei (p->first); - if (di < ei) + if (di < ei && cfg.negotiated) { // Feels like there cannot be an earlier position. // - auto p (postponed_poss.emplace (cp, ed.dependency_position)); + postponed_position pp (ed.dependency_position, + false /* replace */); + + auto p (postponed_poss.emplace (move (cp), pp)); if (!p.second) { - assert (p.first->second > ed.dependency_position); - p.first->second = ed.dependency_position; + assert (p.first->second > pp); + p.first->second = pp; } l5 ([&]{trace << "cannot cfg-postpone dependency " - << pkg.available_name_version_db () + << bp->available_name_version_db () << " of existing dependent " << *ed.selected << ed.db << " (index " << di << ") due to earlier dependency index " << ei @@ -2851,24 +2926,15 @@ namespace bpkg } l5 ([&]{trace << "cfg-postpone dependency " - << pkg.available_name_version_db () + << bp->available_name_version_db () << " of existing dependent " << *ed.selected << ed.db;}); - postponed_cfgs.add (config_package (ed.db, ed.selected->name), - ed.dependency_position, - move (cp)); - - return; + postponed_cfgs.add (move (dcp), ed.dependency_position, move (cp)); } - } - // @@ TODO: we also need to do the same position check of "previously - // existing" dependents: those that are sitting in the - // postponed_cfgs clusters with existing flag (not clear if we - // should only look in negotiated or all clusters -- feels like if - // the cluster is still not negotiated then the dependent is still - // existing). + return; + } } pkg.recursive_collection = true; @@ -5157,7 +5223,19 @@ namespace bpkg postponed_configurations postponed_cfgs_; }; - struct skip_configuration {}; + // @@ TODO Describe. + // + struct skip_configuration + { + optional dependent; + pair dependency_position; + + skip_configuration () = default; + + skip_configuration (existing_dependent&& d, + pair p) + : dependent (move (d)), dependency_position (p) {} + }; size_t depth (pcfg != nullptr ? pcfg->depth : 0); @@ -5252,23 +5330,42 @@ namespace bpkg // const config_package& p (deps[i]); + // If the dependent is being built, then check if it was + // re-evaluated to the position greater than the dependency + // position. Return true if that's the case, so this package is + // added to the resulting list and we can handle this situation. + // + const function verify ( + [&postponed_cfgs, pcfg] + (const config_package& cp, pair pos) + { + for (const postponed_configuration& cfg: postponed_cfgs) + { + if (&cfg == pcfg || cfg.negotiated) + { + if (const pair* p = + cfg.existing_dependent_position (cp)) + { + if (p->first > pos.first) + return true; + } + } + } + + return false; + }); + for (existing_dependent& ed: query_existing_dependents (trace, p.db, p.name, replaced_vers, postponed_cfgs, - rpt_depts)) + rpt_depts, + verify)) { config_package cp (ed.db, ed.selected->name); - auto di (dependents.find (cp)); - - // Skip re-evaluated. - // - if (di != dependents.end () && di->second.reevaluated) - 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 @@ -5289,6 +5386,46 @@ namespace bpkg continue; } + auto i (dependents.find (cp)); + size_t di (ed.dependency_position.first); + + // Skip re-evaluated dependent it the dependency index is + // greater than the one we have re-evaluated to. If it is + // earlier, then add the entry to shadow_poss and throw + // retry_configuration_positions to recollect from scratch. + // + if (i != dependents.end () && i->second.reevaluated) + { + size_t ci (i->second.dependency_position.first); + + if (di > ci) + continue; + + // The newly-introduced dependency must belong to the + // depends value other then the one we have re-evaluated to. + // + assert (di < ci); + + postponed_position pp (ed.dependency_position, + true /* replace */); + + auto p (postponed_poss.emplace (cp, pp)); + + if (!p.second) + { + assert (p.first->second > pp); + p.first->second = pp; + } + + l5 ([&]{trace << "cannot re-evaluate dependent " + << cp << " to dependency index " << di + << " since it is already re-evaluated to " + << "greater index " << ci << " in " << *pcfg + << ", throwing postpone_position";}); + + throw postpone_position (); + } + // 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 @@ -5302,25 +5439,24 @@ namespace bpkg // prerequisites collection (as we do for new dependents) // afterwards. // - if (di == dependents.end ()) + if (i == dependents.end ()) { - di = dependents.emplace ( + i = 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); + size_t ci (i->second.dependency_position.first); - if (di1 < di2) + if (ci < di) continue; - else if (di1 > di2) - di->second = existing_dependent_ex (move (ed)); - //else if (di1 == di2) + else if (ci > di) + i->second = existing_dependent_ex (move (ed)); + //else if (ci == di) // ; } - di->second.dependencies.push_back (p); + i->second.dependencies.push_back (p); } } @@ -5339,23 +5475,27 @@ namespace bpkg if (ed.reevaluated) continue; + size_t di (ed.dependency_position.first); + const config_package& cp (d.first); + // Check if there is an earlier dependency position for this // dependent that will be participating in a configuration // negotiation and skip this cluster if that's the case. There // are two places to check: postponed_poss and other clusters. // - size_t di (ed.dependency_position.first); - const config_package& cp (d.first); - auto pi (postponed_poss.find (cp)); - if (pi != postponed_poss.end () && pi->second.first < di) + if (pi != postponed_poss.end () && + pi->second.first < di) { - l5 ([&]{trace << "pos-postponed existing dependent " - << cp << " re-evaluation for target " - << "dependency index " << di << ", skipping " - << *pcfg;}); + l5 ([&]{trace << "pos-postpone existing dependent " + << cp << " re-evaluation to dependency " + << "index " << di << " due to recorded index " + << pi->second.first << ", skipping " << *pcfg;}); - throw skip_configuration (); + if (!pi->second.replace) + throw skip_configuration (); + else + throw skip_configuration (move (ed), pi->second); } // The other clusters check is a bit more complicated: if the @@ -5381,10 +5521,10 @@ namespace bpkg if (ei < di) { l5 ([&]{trace << "cannot re-evaluate dependent " - << cp << " for target dependency index " - << di << " due to earlier dependency " - << "index " << ei << " in " << cfg - << ", skipping " << *pcfg;}); + << cp << " to dependency index " << di + << " due to earlier dependency index " + << ei << " in " << cfg << ", skipping " + << *pcfg;}); skip = true; } @@ -5393,17 +5533,19 @@ namespace bpkg { // Feels like there cannot be an earlier position. // - auto p (postponed_poss.emplace ( - cp, ed.dependency_position)); + postponed_position pp (ed.dependency_position, + false /* replace */); + + auto p (postponed_poss.emplace (cp, pp)); if (!p.second) { - assert (p.first->second > ed.dependency_position); - p.first->second = ed.dependency_position; + assert (p.first->second > pp); + p.first->second = pp; } l5 ([&]{trace << "cannot re-evaluate dependent " - << cp << " for target dependency index " - << di << " due to greater dependency " + << cp << " to dependency index " << di + << " due to greater dependency " << "index " << ei << " in " << cfg << ", throwing postpone_position";}); @@ -5423,29 +5565,29 @@ namespace bpkg 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 ( // Required by (dependency). - ds.begin (), ds.end ()), - false, // Required by dependents. - build_package::adjust_reconfigure}; + 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 ( // Required by (dependency). + ds.begin (), ds.end ()), + false, // Required by dependents. + build_package::adjust_reconfigure}; // Note: not recursive. // @@ -5454,7 +5596,7 @@ namespace bpkg fdb, rpt_depts, apc, - true /* initial_collection */, + false /* initial_collection */, replaced_vers, postponed_cfgs); @@ -5801,7 +5943,7 @@ namespace bpkg return; } - catch (const skip_configuration&) + catch (skip_configuration& e) { // Restore the state from snapshot. // @@ -5817,6 +5959,32 @@ namespace bpkg pc->depth = 0; + if (e.dependent) + { + existing_dependent& ed (*e.dependent); + pair pos (e.dependency_position); + + const build_package* bp ( + overwrite_existing_dependent_dependency ( + trace, + o, + ed, + pos, + fdb, + rpt_depts, + apc, + false /* initial_collection */, + replaced_vers, + postponed_cfgs)); + + postponed_cfgs.add ( + config_package (ed.db, ed.selected->name), + pos, + config_package (bp->db, bp->selected->name)); + } + + l5 ([&]{trace << "postpone cfg-negotiation of " << *pc;}); + break; } catch (retry_configuration& e) @@ -6111,10 +6279,20 @@ namespace bpkg assert (false); // Can't be here. } - // @@ This can now happen due to skipping: dump cluster information - // and then assert. + // While the assumption is that we shouldn't leave any non-negotiated + // clusters, we can potentially miss some corner cases in the above + // "skip configuration" logic. Let's thus trace the non-negotiated + // clusters before the assertion. // +#ifndef NDEBUG + for (const postponed_configuration& cfg: postponed_cfgs) + { + if (!cfg.negotiated || !*cfg.negotiated) + trace << "unexpected non-negotiated cluster " << cfg; + } + assert (postponed_cfgs.negotiated ()); +#endif l5 ([&]{trace << "end" << trace_suffix;}); } @@ -6453,6 +6631,10 @@ namespace bpkg // require recursive recollection or dropped (present in the map) or // expected to be built or dropped (present in replaced_vers). // + // Optionally, specify the function which can verify the dependent build + // and decide whether to override the default behavior and still add the + // dependent package to the resulting list, returning true in this case. + // struct existing_dependent { reference_wrapper db; @@ -6460,16 +6642,18 @@ namespace bpkg pair dependency_position; }; - // Note: this function is fairly specific to configuration negotiation - // and probably cannot be reused in other contexts. - // + using verify_dependent_build_function = bool (const config_package&, + pair); + vector - query_existing_dependents (tracer& trace, - database& db, - const package_name& name, - const replaced_versions& replaced_vers, - const postponed_configurations& postponed_cfgs, - const repointed_dependents& rpt_depts) + query_existing_dependents ( + tracer& trace, + database& db, + const package_name& name, + const replaced_versions& replaced_vers, + const postponed_configurations& /*postponed_cfgs*/, + const repointed_dependents& rpt_depts, + const function& vdb = nullptr) { vector r; @@ -6502,32 +6686,7 @@ namespace bpkg (p->system || p->recollect_recursively (rpt_depts))) || *p->action == build_package::drop) { - // If the package is being built, then check if it was - // re-evaluated for the target position greater than the - // dependency position. If that's the case then don't ignore - // the dependent, leaving it to the caller to handle this - // situation (which should be throw postponed_position). - // @@ confirm this. - // - bool skip (true); - - if (build) - { - for (const postponed_configuration& cfg: postponed_cfgs) - { - if (cfg.negotiated) - { - if (const pair* p = - cfg.existing_dependent_position (cp)) - { - if (p->first > pos.first) - skip = false; - } - } - } - } - - if (skip) + if (!build || !vdb || !vdb (cp, pos)) { l5 ([&]{trace << "skip being " << (build ? "built" : "dropped") @@ -6561,6 +6720,108 @@ namespace bpkg return r; } + // Update the existing dependent object with the new dependency position + // and collect the dependency referred by this position. Return the + // pointer to the collected build package object. + // + const build_package* + overwrite_existing_dependent_dependency ( + tracer& trace, + const pkg_build_options& o, + existing_dependent& ed, + pair pos, + const function& fdb, + const repointed_dependents& rpt_depts, + const function& apc, + bool initial_collection, + replaced_versions& replaced_vers, + postponed_configurations& postponed_cfgs) + { + shared_ptr dsp; + database* pdb (nullptr); + const version_constraint* vc (nullptr); + + // Find the dependency for this earlier dependency position. + // + for (const auto& p: ed.selected->prerequisites) + { + if (p.second.config_position == pos) + { + pdb = &p.first.database (); + + dsp = p.first.load (); + + l5 ([&]{trace << "overwrite dependency at index " + << ed.dependency_position.first + << " of existing dependent " << *ed.selected + << ed.db << " with dependency " << *dsp + << *pdb << " at index " << pos.first;}); + + if (p.second.constraint) + vc = &*p.second.constraint; + } + } + + assert (dsp != nullptr); + + config_package cp (*pdb, dsp->name); + + // Adjust the existing dependent entry. + // + ed.dependency_position = pos; + + // Collect the package build for this dependency. + // + pair, + lazy_shared_ptr> rp ( + find_available_fragment (o, cp.db, dsp)); + + bool system (dsp->system ()); + + config_package dcp (ed.db, ed.selected->name); + + build_package p { + build_package::build, + cp.db, + move (dsp), + 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. + system, // System. + false, // Keep output directory. + false, // Disfigure (from-scratch reconf). + false, // Configure-only. + nullopt, // Checkout root. + false, // Checkout purge. + strings (), // Configuration variables. + {dcp}, // Required by (dependent). + true, // Required by dependents. + build_package::adjust_reconfigure}; + + if (vc != nullptr) + p.constraints.emplace_back (dcp.db, dcp.name.string (), *vc); + + // Note: not recursive. + // + collect_build (o, + move (p), + fdb, + rpt_depts, + apc, + initial_collection, + replaced_vers, + postponed_cfgs); + + return entered_build (cp); + } + private: struct config_package_name { diff --git a/tests/common/dependency-alternatives/t11a/bax-1.0.0.tar.gz b/tests/common/dependency-alternatives/t11a/bax-1.0.0.tar.gz new file mode 100644 index 0000000..d488f1a Binary files /dev/null and b/tests/common/dependency-alternatives/t11a/bax-1.0.0.tar.gz differ diff --git a/tests/common/dependency-alternatives/t11a/box-0.1.0.tar.gz b/tests/common/dependency-alternatives/t11a/box-0.1.0.tar.gz new file mode 100644 index 0000000..8e91f91 Binary files /dev/null and b/tests/common/dependency-alternatives/t11a/box-0.1.0.tar.gz differ diff --git a/tests/common/dependency-alternatives/t11a/libbaz-0.1.0.tar.gz b/tests/common/dependency-alternatives/t11a/libbaz-0.1.0.tar.gz new file mode 100644 index 0000000..b8bfaec Binary files /dev/null and b/tests/common/dependency-alternatives/t11a/libbaz-0.1.0.tar.gz differ diff --git a/tests/common/dependency-alternatives/t11a/libbox-0.1.0.tar.gz b/tests/common/dependency-alternatives/t11a/libbox-0.1.0.tar.gz new file mode 100644 index 0000000..3388a94 Binary files /dev/null and b/tests/common/dependency-alternatives/t11a/libbox-0.1.0.tar.gz differ diff --git a/tests/pkg-build.testscript b/tests/pkg-build.testscript index 65e98e5..3ed04a6 100644 --- a/tests/pkg-build.testscript +++ b/tests/pkg-build.testscript @@ -176,7 +176,9 @@ # | |-- libfoo-1.0.0.tar.gz # | |-- libbar-0.1.0.tar.gz # | |-- libbar-1.0.0.tar.gz +# | |-- libbaz-0.1.0.tar.gz # | |-- libbaz-1.0.0.tar.gz +# | |-- libbox-0.1.0.tar.gz # | |-- libbox-1.0.0.tar.gz # | |-- foo-1.0.0.tar.gz -> libfoo {require {config.libfoo.extras=true}} # | |-- fox-1.0.0.tar.gz -> libfoo {require {config.libfoo.extras=true}} @@ -187,8 +189,11 @@ # | |-- bar-1.0.0.tar.gz -> libbar {require {config.libbar.extras=true}} # | |-- baz-0.1.0.tar.gz -> {libbar libfoo} == 0.1.0 {require {config.libbar.extras=true config.libfoo.extras=true}} # | |-- baz-1.0.0.tar.gz -> {libbar libfoo} {require {config.libbar.extras=true config.libfoo.extras=true}} +# | |-- box-0.1.0.tar.gz -> libbox {require {config.libbox.extras=true}} # | |-- box-1.0.0.tar.gz -> {libbar libfoo} {require {config.libbar.extras=true config.libfoo.extras=true}} | # | | libbox +# | |-- bax-1.0.0.tar.gz -> libfoo {require {config.libfoo.extras=true}}, +# | | {libbox libbar} {require {config.libbox.extras=true config.libbar.extras=true}} # | |-- bux-1.0.0.tar.gz -> libbar {require {config.libbar.extras=true}} # | |-- bix-1.0.0.tar.gz -> {libbar bar} {require {config.libbar.extras=true config.bar.extras=true}}, # | | bux @@ -5617,20 +5622,16 @@ test.options += --no-progress { +$clone_cfg - # Dependencies: - # - # tex: depends: libbar(c) - # depends: libfoo(c) - # - # bar: depends: libbar == 0.1.0 (c) - # - # baz: depends: {libbar libfoo} == 0.1.0 (c) - : non-negotiated : { $clone_cfg; + # Dependencies: + # + # tex: depends: libbar(c) + # depends: libfoo(c) + # $* tex 2>!; $* libfoo/0.1.0 libbar/0.1.0 2>>~%EOE%; @@ -5649,7 +5650,8 @@ test.options += --no-progress trace: collect_build_postponed (1): begin {tex^ | libfoo->{tex/2,1}} %.* trace: collect_build_postponed (1): re-evaluate existing dependents for {tex^ | libfoo->{tex/2,1}} - trace: collect_build_postponed (1): cannot re-evaluate dependent tex for target dependency index 2 due to earlier dependency index 1 in {tex^ | libbar->{tex/1,1}}, skipping {tex^ | libfoo->{tex/2,1}} + trace: collect_build_postponed (1): cannot re-evaluate dependent tex to dependency index 2 due to earlier dependency index 1 in {tex^ | libbar->{tex/1,1}}, skipping {tex^ | libfoo->{tex/2,1}} + trace: collect_build_postponed (0): postpone cfg-negotiation of {tex^ | libfoo->{tex/2,1}} trace: collect_build_postponed (1): begin {tex^ | libbar->{tex/1,1}} %.* trace: collect_build_postponed (1): re-evaluate existing dependents for {tex^ | libbar->{tex/1,1}} @@ -5710,6 +5712,13 @@ test.options += --no-progress { $clone_cfg; + # Dependencies: + # + # tex: depends: libbar(c) + # depends: libfoo(c) + # + # bar: depends: libbar == 0.1.0 (c) + # $* tex 2>!; $* libfoo/0.1.0 bar/0.1.0 2>>~%EOE%; @@ -5754,7 +5763,7 @@ test.options += --no-progress trace: collect_build_postponed (2): begin {bar | libbar->{bar/1,1}} %.* trace: collect_build_postponed (2): re-evaluate existing dependents for {bar | libbar->{bar/1,1}} - trace: collect_build_postponed (2): cannot re-evaluate dependent tex for target dependency index 1 due to greater dependency index 2 in {tex^ | libfoo->{tex/2,1}}!, throwing postpone_position + trace: collect_build_postponed (2): cannot re-evaluate dependent tex to dependency index 1 due to greater dependency index 2 in {tex^ | libfoo->{tex/2,1}}!, throwing postpone_position trace: pkg_build: collection failed due to earlier dependency position, retry from scratch %.* trace: pkg_build: refine package collection/plan execution from scratch @@ -5775,7 +5784,8 @@ test.options += --no-progress trace: collect_build_postponed (1): begin {tex^ | libfoo->{tex/2,1}} %.* trace: collect_build_postponed (1): re-evaluate existing dependents for {tex^ | libfoo->{tex/2,1}} - trace: collect_build_postponed (1): pos-postponed existing dependent tex re-evaluation for target dependency index 2, skipping {tex^ | libfoo->{tex/2,1}} + trace: collect_build_postponed (1): pos-postpone existing dependent tex re-evaluation to dependency index 2 due to recorded index 1, skipping {tex^ | libfoo->{tex/2,1}} + trace: collect_build_postponed (0): postpone cfg-negotiation of {tex^ | libfoo->{tex/2,1}} trace: collect_build_postponed (1): begin {bar | libbar->{bar/1,1}} %.* trace: collect_build_postponed (1): re-evaluate existing dependents for {bar | libbar->{bar/1,1}} @@ -5839,6 +5849,13 @@ test.options += --no-progress { $clone_cfg; + # Dependencies: + # + # tex: depends: libbar(c) + # depends: libfoo(c) + # + # baz: depends: {libbar libfoo} == 0.1.0 (c) + # $* tex 2>!; $* baz/0.1.0 2>>~%EOE%; @@ -5964,6 +5981,422 @@ test.options += --no-progress $pkg_drop tex baz } + + : replace-re-evaluate + : + { + $clone_cfg; + + # Dependencies: + # + # bax: depends: libfoo(c) + # depends: {libbox libbar} (c) + # + # baz: depends: {libbar libfoo} (c) + # + $* bax baz 2>!; + + $* libbox/0.1.0 2>>~%EOE%; + %.* + trace: pkg_build: refine package collection/plan execution from scratch + %.* + trace: collect_build: add libbox/0.1.0 + %.* + trace: collect_build_prerequisites: cfg-postpone dependency libbox/0.1.0 of existing dependent bax/1.0.0 + trace: postponed_configurations::add: create {bax^ | libbox->{bax/2,1}} + trace: collect_build_postponed (0): begin + trace: collect_build_postponed (1): begin {bax^ | libbox->{bax/2,1}} + %.* + trace: collect_build_postponed (1): re-evaluate existing dependents for {bax^ | libbox->{bax/2,1}} + %.* + trace: collect_build: add bax/1.0.0 + trace: collect_build_prerequisites: reeval bax/1.0.0 + %.* + trace: collect_build: add libfoo/1.0.0 + %.* + trace: collect_build: pick libbox/0.1.0 over libbox/1.0.0 + trace: collect_build: add libbar/1.0.0 + trace: postponed_configurations::add: add {bax^ 2,1: libbox libbar} to {bax^ | libbox->{bax/2,1}} + trace: collect_build_prerequisites: re-evaluating dependent bax/1.0.0 results in {bax^ | libbox->{bax/2,1} libbar->{bax/2,1}} + trace: collect_build_prerequisites: re-evaluated bax/1.0.0 + %.* + trace: collect_build_postponed (1): skip being built existing dependent bax of dependency libbar + trace: collect_build_postponed (1): re-evaluate existing dependents for {bax^ | libbox->{bax/2,1} libbar->{bax/2,1}} + %.* + trace: collect_build: add baz/1.0.0 + trace: collect_build_prerequisites: reeval baz/1.0.0 + %.* + trace: postponed_configurations::add: add {baz^ 1,1: libbar libfoo} to {bax^ | libbox->{bax/2,1} libbar->{bax/2,1}} + trace: collect_build_prerequisites: re-evaluating dependent baz/1.0.0 results in {bax^ baz^ | libbox->{bax/2,1} libbar->{bax/2,1 baz/1,1} libfoo->{baz/1,1}} + trace: collect_build_prerequisites: re-evaluated baz/1.0.0 + %.* + trace: collect_build_postponed (1): skip being built existing dependent baz of dependency libfoo + trace: collect_build_postponed (1): cannot re-evaluate dependent bax to dependency index 1 since it is already re-evaluated to greater index 2 in {bax^ baz^ | libbox->{bax/2,1} libbar->{bax/2,1 baz/1,1} libfoo->{baz/1,1}}, throwing postpone_position + trace: pkg_build: collection failed due to earlier dependency position, retry from scratch + %.* + trace: pkg_build: refine package collection/plan execution from scratch + %.* + trace: collect_build: add libbox/0.1.0 + %.* + trace: collect_build_prerequisites: overwrite dependency at index 2 of existing dependent bax/1.0.0 with dependency libfoo/1.0.0 at index 1 + trace: collect_build: add libfoo/1.0.0 + trace: collect_build_prerequisites: cfg-postpone dependency libfoo/1.0.0 of existing dependent bax/1.0.0 + trace: postponed_configurations::add: create {bax^ | libfoo->{bax/1,1}} + trace: collect_build_postponed (0): begin + trace: collect_build_postponed (1): begin {bax^ | libfoo->{bax/1,1}} + %.* + trace: collect_build_postponed (1): re-evaluate existing dependents for {bax^ | libfoo->{bax/1,1}} + trace: collect_build: add bax/1.0.0 + trace: collect_build_prerequisites: reeval bax/1.0.0 + %.* + trace: postponed_configurations::add: add {bax^ 1,1: libfoo} to {bax^ | libfoo->{bax/1,1}} + trace: collect_build_prerequisites: re-evaluating dependent bax/1.0.0 results in {bax^ | libfoo->{bax/1,1}} + trace: collect_build_prerequisites: re-evaluated bax/1.0.0 + trace: collect_build: add baz/1.0.0 + trace: collect_build_prerequisites: reeval baz/1.0.0 + %.* + trace: collect_build: add libbar/1.0.0 + trace: postponed_configurations::add: add {baz^ 1,1: libbar libfoo} to {bax^ | libfoo->{bax/1,1}} + trace: collect_build_prerequisites: re-evaluating dependent baz/1.0.0 results in {bax^ baz^ | libfoo->{bax/1,1 baz/1,1} libbar->{baz/1,1}} + trace: collect_build_prerequisites: re-evaluated baz/1.0.0 + %.* + trace: collect_build_postponed (1): skip being built existing dependent bax of dependency libbar + trace: collect_build_postponed (1): skip being built existing dependent baz of dependency libbar + trace: collect_build_postponed (1): cfg-negotiate begin {bax^ baz^ | libfoo->{bax/1,1 baz/1,1} libbar->{baz/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_prerequisites: begin libbar/1.0.0 + trace: collect_build_prerequisites: end libbar/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 bax/1.0.0 + trace: collect_build_prerequisites: resume bax/1.0.0 + %.* + trace: collect_build: pick libbox/0.1.0 over libbox/1.0.0 + trace: collect_build_prerequisites: cfg-postpone dependency libbox/0.1.0 of dependent bax/1.0.0 + trace: collect_build_prerequisites: cfg-postpone dependency libbar/1.0.0 of dependent bax/1.0.0 + trace: postponed_configurations::add: add {bax 2,1: libbox libbar} to {bax^ baz^ | libfoo->{bax/1,1 baz/1,1} libbar->{baz/1,1}}? + trace: collect_build_prerequisites: cfg-postponing dependent bax/1.0.0 involves negotiated configurations and results in {bax^ baz^ | libfoo->{bax/1,1 baz/1,1} libbar->{bax/2,1 baz/1,1} libbox->{bax/2,1}}?, throwing retry_configuration + trace: collect_build_postponed (0): cfg-negotiation of {bax^ | libfoo->{bax/1,1}} failed due to dependent bax, adding shadow dependent and re-negotiating + trace: collect_build_postponed (1): begin {bax^ | libfoo->{bax/1,1}} + %.* + trace: collect_build_postponed (1): re-evaluate existing dependents for {bax^ | libfoo->{bax/1,1}} + trace: collect_build: add bax/1.0.0 + trace: collect_build_prerequisites: reeval bax/1.0.0 + %.* + trace: postponed_configurations::add: add {bax^ 1,1: libfoo} to {bax^ | libfoo->{bax/1,1}} + trace: collect_build_prerequisites: re-evaluating dependent bax/1.0.0 results in {bax^ | libfoo->{bax/1,1}} + trace: collect_build_prerequisites: re-evaluated bax/1.0.0 + trace: collect_build: add baz/1.0.0 + trace: collect_build_prerequisites: reeval baz/1.0.0 + %.* + trace: collect_build: add libbar/1.0.0 + trace: postponed_configurations::add: add {baz^ 1,1: libbar libfoo} to {bax^ | libfoo->{bax/1,1}} + trace: collect_build_prerequisites: re-evaluating dependent baz/1.0.0 results in {bax^ baz^ | libfoo->{bax/1,1 baz/1,1} libbar->{baz/1,1}} + trace: collect_build_prerequisites: re-evaluated baz/1.0.0 + %.* + trace: collect_build_postponed (1): skip being built existing dependent bax of dependency libbar + trace: collect_build_postponed (1): skip being built existing dependent baz of dependency libbar + trace: collect_build_postponed (1): cfg-negotiate begin {bax^ baz^ | libfoo->{bax/1,1 baz/1,1} libbar->{baz/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_prerequisites: begin libbar/1.0.0 + trace: collect_build_prerequisites: end libbar/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 bax/1.0.0 + trace: collect_build_prerequisites: resume bax/1.0.0 + %.* + trace: collect_build: pick libbox/0.1.0 over libbox/1.0.0 + trace: collect_build_prerequisites: cfg-postpone dependency libbox/0.1.0 of dependent bax/1.0.0 + trace: collect_build_prerequisites: cfg-postpone dependency libbar/1.0.0 of dependent bax/1.0.0 + trace: postponed_configurations::add: add {bax 2,1: libbox libbar} to {bax^ baz^ | libfoo->{bax/1,1 baz/1,1} libbar->{baz/1,1}}? + trace: collect_build_prerequisites: dependent bax/1.0.0 is a shadow dependent for {bax^ baz^ | libfoo->{bax/1,1 baz/1,1} libbar->{bax/2,1 baz/1,1} libbox->{bax/2,1}}? + trace: collect_build_prerequisites: cfg-postponing dependent bax/1.0.0 involves non-negotiated configurations and results in {bax^ baz^ | libfoo->{bax/1,1 baz/1,1} libbar->{bax/2,1 baz/1,1} libbox->{bax/2,1}}?, throwing merge_configuration + trace: collect_build_postponed (0): cfg-negotiation of {bax^ | libfoo->{bax/1,1}} failed due to non-negotiated clusters, force-merging based on shadow cluster {bax^ baz^ | libfoo->{bax/1,1 baz/1,1} libbar->{bax/2,1 baz/1,1} libbox->{bax/2,1}}? + trace: collect_build_postponed (1): begin {bax^ | libfoo->{bax/1,1}} + %.* + trace: collect_build_postponed (1): re-evaluate existing dependents for {bax^ | libfoo->{bax/1,1}} + trace: collect_build: add bax/1.0.0 + trace: collect_build_prerequisites: reeval bax/1.0.0 + %.* + trace: postponed_configurations::add: add {bax^ 1,1: libfoo} to {bax^ | libfoo->{bax/1,1}} (shadow cluster-based) + trace: collect_build_prerequisites: re-evaluating dependent bax/1.0.0 results in {bax^ | libfoo->{bax/1,1}} + trace: collect_build_prerequisites: re-evaluated bax/1.0.0 + trace: collect_build: add baz/1.0.0 + trace: collect_build_prerequisites: reeval baz/1.0.0 + %.* + trace: collect_build: add libbar/1.0.0 + trace: postponed_configurations::add: add {baz^ 1,1: libbar libfoo} to {bax^ | libfoo->{bax/1,1}} (shadow cluster-based) + trace: collect_build_prerequisites: re-evaluating dependent baz/1.0.0 results in {bax^ baz^ | libfoo->{bax/1,1 baz/1,1} libbar->{baz/1,1}} + trace: collect_build_prerequisites: re-evaluated baz/1.0.0 + %.* + trace: collect_build_postponed (1): skip being built existing dependent bax of dependency libbar + trace: collect_build_postponed (1): skip being built existing dependent baz of dependency libbar + trace: collect_build_postponed (1): cfg-negotiate begin {bax^ baz^ | libfoo->{bax/1,1 baz/1,1} libbar->{baz/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_prerequisites: begin libbar/1.0.0 + trace: collect_build_prerequisites: end libbar/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 bax/1.0.0 + trace: collect_build_prerequisites: resume bax/1.0.0 + %.* + trace: collect_build: pick libbox/0.1.0 over libbox/1.0.0 + trace: collect_build_prerequisites: cfg-postpone dependency libbox/0.1.0 of dependent bax/1.0.0 + trace: collect_build_prerequisites: cfg-postpone dependency libbar/1.0.0 of dependent bax/1.0.0 + trace: postponed_configurations::add: add {bax 2,1: libbox libbar} to {bax^ baz^ | libfoo->{bax/1,1 baz/1,1} libbar->{baz/1,1}}? (shadow cluster-based) + trace: collect_build_prerequisites: dependent bax/1.0.0 is a shadow dependent for {bax^ baz^ | libfoo->{bax/1,1 baz/1,1} libbar->{bax/2,1 baz/1,1} libbox->{bax/2,1}}? + trace: collect_build_prerequisites: configuration for cfg-postponed dependencies of dependent bax/1.0.0 is negotiated + trace: collect_build_prerequisites: collecting cfg-postponed dependency libbox/0.1.0 of dependent bax/1.0.0 + trace: collect_build_prerequisites: begin libbox/0.1.0 + trace: collect_build_prerequisites: end libbox/0.1.0 + trace: collect_build_prerequisites: dependency libbar/1.0.0 of dependent bax/1.0.0 is already (being) recursively collected, skipping + trace: collect_build_prerequisites: end bax/1.0.0 + trace: collect_build_postponed (1): select cfg-negotiated dependency alternative for dependent baz/1.0.0 + trace: collect_build_prerequisites: resume baz/1.0.0 + trace: collect_build_prerequisites: end baz/1.0.0 + trace: collect_build_postponed (1): cfg-negotiate end {bax^ baz^ | libfoo->{bax/1,1 baz/1,1} libbar->{bax/2,1 baz/1,1} libbox->{bax/2,1}}! + trace: collect_build_postponed (1): end {bax^ | libfoo->{bax/1,1}} + trace: collect_build_postponed (0): end + %.* + trace: execute_plan: simulate: yes + %.* + EOE + + $pkg_status -r >>EOO; + !libbox configured !0.1.0 available 1.0.0 + !bax configured 1.0.0 + libbar configured 1.0.0 + !libbox configured !0.1.0 available 1.0.0 + libfoo configured 1.0.0 + !baz configured 1.0.0 + libbar configured 1.0.0 + libfoo configured 1.0.0 + EOO + + $pkg_drop bax baz libbox + } + + : replace-re-evaluate2 + : + { + $clone_cfg; + + # Dependencies: + # + # bax: depends: libfoo(c) + # depends: {libbox libbar} (c) + # + # baz: depends: {libbar libfoo} (c) + # + # box: depends: libbox == 0.1.0 (c) + # + $* bax baz 2>!; + + $* box/0.1.0 2>>~%EOE%; + %.* + trace: pkg_build: refine package collection/plan execution from scratch + %.* + trace: collect_build: add box/0.1.0 + trace: collect_build_prerequisites: begin box/0.1.0 + %.* + trace: collect_build: add libbox/0.1.0 + info: package box dependency on (libbox == 0.1.0) is forcing downgrade of libbox/1.0.0 to 0.1.0 + trace: collect_build_prerequisites: cfg-postpone dependency libbox/0.1.0 of dependent box/0.1.0 + trace: postponed_configurations::add: create {box | libbox->{box/1,1}} + trace: collect_build_prerequisites: postpone box/0.1.0 + trace: collect_build_postponed (0): begin + trace: collect_build_postponed (1): begin {box | libbox->{box/1,1}} + %.* + trace: collect_build_postponed (1): re-evaluate existing dependents for {box | libbox->{box/1,1}} + %.* + trace: collect_build: add bax/1.0.0 + trace: collect_build_prerequisites: reeval bax/1.0.0 + %.* + trace: collect_build: add libfoo/1.0.0 + %.* + trace: collect_build: pick libbox/0.1.0 over libbox/1.0.0 + trace: collect_build: add libbar/1.0.0 + trace: postponed_configurations::add: add {bax^ 2,1: libbox libbar} to {box | libbox->{box/1,1}} + trace: collect_build_prerequisites: re-evaluating dependent bax/1.0.0 results in {bax^ box | libbox->{bax/2,1 box/1,1} libbar->{bax/2,1}} + trace: collect_build_prerequisites: re-evaluated bax/1.0.0 + %.* + trace: collect_build_postponed (1): skip being built existing dependent bax of dependency libbar + trace: collect_build_postponed (1): re-evaluate existing dependents for {bax^ box | libbox->{bax/2,1 box/1,1} libbar->{bax/2,1}} + %.* + trace: collect_build: add baz/1.0.0 + trace: collect_build_prerequisites: reeval baz/1.0.0 + %.* + trace: postponed_configurations::add: add {baz^ 1,1: libbar libfoo} to {bax^ box | libbox->{bax/2,1 box/1,1} libbar->{bax/2,1}} + trace: collect_build_prerequisites: re-evaluating dependent baz/1.0.0 results in {bax^ baz^ box | libbox->{bax/2,1 box/1,1} libbar->{bax/2,1 baz/1,1} libfoo->{baz/1,1}} + trace: collect_build_prerequisites: re-evaluated baz/1.0.0 + %.* + trace: collect_build_postponed (1): skip being built existing dependent baz of dependency libfoo + trace: collect_build_postponed (1): cannot re-evaluate dependent bax to dependency index 1 since it is already re-evaluated to greater index 2 in {bax^ baz^ box | libbox->{bax/2,1 box/1,1} libbar->{bax/2,1 baz/1,1} libfoo->{baz/1,1}}, throwing postpone_position + trace: pkg_build: collection failed due to earlier dependency position, retry from scratch + %.* + trace: pkg_build: refine package collection/plan execution from scratch + %.* + trace: collect_build: add box/0.1.0 + trace: collect_build_prerequisites: begin box/0.1.0 + %.* + trace: collect_build: add libbox/0.1.0 + info: package box dependency on (libbox == 0.1.0) is forcing downgrade of libbox/1.0.0 to 0.1.0 + trace: collect_build_prerequisites: cfg-postpone dependency libbox/0.1.0 of dependent box/0.1.0 + trace: postponed_configurations::add: create {box | libbox->{box/1,1}} + trace: collect_build_prerequisites: postpone box/0.1.0 + trace: collect_build_postponed (0): begin + trace: collect_build_postponed (1): begin {box | libbox->{box/1,1}} + %.* + trace: collect_build_postponed (1): re-evaluate existing dependents for {box | libbox->{box/1,1}} + trace: collect_build_postponed (1): pos-postpone existing dependent bax re-evaluation to dependency index 2 due to recorded index 1, skipping {box | libbox->{box/1,1}} + trace: collect_build_postponed (0): overwrite dependency at index 2 of existing dependent bax/1.0.0 with dependency libfoo/1.0.0 at index 1 + trace: collect_build: add libfoo/1.0.0 + trace: postponed_configurations::add: create {bax^ | libfoo->{bax/1,1}} + trace: collect_build_postponed (0): postpone cfg-negotiation of {box | libbox->{box/1,1}} + trace: collect_build_postponed (1): begin {bax^ | libfoo->{bax/1,1}} + %.* + trace: collect_build_postponed (1): re-evaluate existing dependents for {bax^ | libfoo->{bax/1,1}} + trace: collect_build: add bax/1.0.0 + trace: collect_build_prerequisites: reeval bax/1.0.0 + %.* + trace: postponed_configurations::add: add {bax^ 1,1: libfoo} to {bax^ | libfoo->{bax/1,1}} + trace: collect_build_prerequisites: re-evaluating dependent bax/1.0.0 results in {bax^ | libfoo->{bax/1,1}} + trace: collect_build_prerequisites: re-evaluated bax/1.0.0 + trace: collect_build: add baz/1.0.0 + trace: collect_build_prerequisites: reeval baz/1.0.0 + %.* + trace: collect_build: add libbar/1.0.0 + trace: postponed_configurations::add: add {baz^ 1,1: libbar libfoo} to {bax^ | libfoo->{bax/1,1}} + trace: collect_build_prerequisites: re-evaluating dependent baz/1.0.0 results in {bax^ baz^ | libfoo->{bax/1,1 baz/1,1} libbar->{baz/1,1}} + trace: collect_build_prerequisites: re-evaluated baz/1.0.0 + %.* + trace: collect_build_postponed (1): skip being built existing dependent bax of dependency libbar + trace: collect_build_postponed (1): skip being built existing dependent baz of dependency libbar + trace: collect_build_postponed (1): cfg-negotiate begin {bax^ baz^ | libfoo->{bax/1,1 baz/1,1} libbar->{baz/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_prerequisites: begin libbar/1.0.0 + trace: collect_build_prerequisites: end libbar/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 bax/1.0.0 + trace: collect_build_prerequisites: resume bax/1.0.0 + %.* + trace: collect_build: pick libbox/0.1.0 over libbox/1.0.0 + trace: collect_build_prerequisites: cfg-postpone dependency libbox/0.1.0 of dependent bax/1.0.0 + trace: collect_build_prerequisites: cfg-postpone dependency libbar/1.0.0 of dependent bax/1.0.0 + trace: postponed_configurations::add: add {bax 2,1: libbox libbar} to {box | libbox->{box/1,1}} + trace: postponed_configurations::add: merge {bax box | libbox->{bax/2,1 box/1,1} libbar->{bax/2,1}} into {bax^ baz^ | libfoo->{bax/1,1 baz/1,1} libbar->{baz/1,1}}? + trace: collect_build_prerequisites: cfg-postponing dependent bax/1.0.0 involves negotiated configurations and results in {bax^ baz^ box | libfoo->{bax/1,1 baz/1,1} libbar->{bax/2,1 baz/1,1} libbox->{bax/2,1 box/1,1}}?, throwing retry_configuration + trace: collect_build_postponed (0): cfg-negotiation of {bax^ | libfoo->{bax/1,1}} failed due to dependent bax, adding shadow dependent and re-negotiating + trace: collect_build_postponed (1): begin {bax^ | libfoo->{bax/1,1}} + %.* + trace: collect_build_postponed (1): re-evaluate existing dependents for {bax^ | libfoo->{bax/1,1}} + trace: collect_build: add bax/1.0.0 + trace: collect_build_prerequisites: reeval bax/1.0.0 + %.* + trace: postponed_configurations::add: add {bax^ 1,1: libfoo} to {bax^ | libfoo->{bax/1,1}} + trace: collect_build_prerequisites: re-evaluating dependent bax/1.0.0 results in {bax^ | libfoo->{bax/1,1}} + trace: collect_build_prerequisites: re-evaluated bax/1.0.0 + trace: collect_build: add baz/1.0.0 + trace: collect_build_prerequisites: reeval baz/1.0.0 + %.* + trace: collect_build: add libbar/1.0.0 + trace: postponed_configurations::add: add {baz^ 1,1: libbar libfoo} to {bax^ | libfoo->{bax/1,1}} + trace: collect_build_prerequisites: re-evaluating dependent baz/1.0.0 results in {bax^ baz^ | libfoo->{bax/1,1 baz/1,1} libbar->{baz/1,1}} + trace: collect_build_prerequisites: re-evaluated baz/1.0.0 + %.* + trace: collect_build_postponed (1): skip being built existing dependent bax of dependency libbar + trace: collect_build_postponed (1): skip being built existing dependent baz of dependency libbar + trace: collect_build_postponed (1): cfg-negotiate begin {bax^ baz^ | libfoo->{bax/1,1 baz/1,1} libbar->{baz/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_prerequisites: begin libbar/1.0.0 + trace: collect_build_prerequisites: end libbar/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 bax/1.0.0 + trace: collect_build_prerequisites: resume bax/1.0.0 + %.* + trace: collect_build: pick libbox/0.1.0 over libbox/1.0.0 + trace: collect_build_prerequisites: cfg-postpone dependency libbox/0.1.0 of dependent bax/1.0.0 + trace: collect_build_prerequisites: cfg-postpone dependency libbar/1.0.0 of dependent bax/1.0.0 + trace: postponed_configurations::add: add {bax 2,1: libbox libbar} to {box | libbox->{box/1,1}} + trace: postponed_configurations::add: merge {bax box | libbox->{bax/2,1 box/1,1} libbar->{bax/2,1}} into {bax^ baz^ | libfoo->{bax/1,1 baz/1,1} libbar->{baz/1,1}}? + trace: collect_build_prerequisites: dependent bax/1.0.0 is a shadow dependent for {bax^ baz^ box | libfoo->{bax/1,1 baz/1,1} libbar->{bax/2,1 baz/1,1} libbox->{bax/2,1 box/1,1}}? + trace: collect_build_prerequisites: cfg-postponing dependent bax/1.0.0 involves non-negotiated configurations and results in {bax^ baz^ box | libfoo->{bax/1,1 baz/1,1} libbar->{bax/2,1 baz/1,1} libbox->{bax/2,1 box/1,1}}?, throwing merge_configuration + trace: collect_build_postponed (0): cfg-negotiation of {bax^ | libfoo->{bax/1,1}} failed due to non-negotiated clusters, force-merging based on shadow cluster {bax^ baz^ box | libfoo->{bax/1,1 baz/1,1} libbar->{bax/2,1 baz/1,1} libbox->{bax/2,1 box/1,1}}? + trace: collect_build_postponed (1): begin {bax^ box | libfoo->{bax/1,1} libbox->{box/1,1}} + %.* + trace: collect_build_postponed (1): re-evaluate existing dependents for {bax^ box | libfoo->{bax/1,1} libbox->{box/1,1}} + trace: collect_build: add bax/1.0.0 + trace: collect_build_prerequisites: reeval bax/1.0.0 + %.* + trace: postponed_configurations::add: add {bax^ 1,1: libfoo} to {bax^ box | libfoo->{bax/1,1} libbox->{box/1,1}} (shadow cluster-based) + trace: collect_build_prerequisites: re-evaluating dependent bax/1.0.0 results in {bax^ box | libfoo->{bax/1,1} libbox->{box/1,1}} + trace: collect_build_prerequisites: re-evaluated bax/1.0.0 + trace: collect_build: add baz/1.0.0 + trace: collect_build_prerequisites: reeval baz/1.0.0 + %.* + trace: collect_build: add libbar/1.0.0 + trace: postponed_configurations::add: add {baz^ 1,1: libbar libfoo} to {bax^ box | libfoo->{bax/1,1} libbox->{box/1,1}} (shadow cluster-based) + trace: collect_build_prerequisites: re-evaluating dependent baz/1.0.0 results in {bax^ baz^ box | libfoo->{bax/1,1 baz/1,1} libbox->{box/1,1} libbar->{baz/1,1}} + trace: collect_build_prerequisites: re-evaluated baz/1.0.0 + %.* + trace: collect_build_postponed (1): skip being built existing dependent bax of dependency libbar + trace: collect_build_postponed (1): skip being built existing dependent baz of dependency libbar + trace: collect_build_postponed (1): cfg-negotiate begin {bax^ baz^ box | libfoo->{bax/1,1 baz/1,1} libbox->{box/1,1} libbar->{baz/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_prerequisites: begin libbox/0.1.0 + trace: collect_build_prerequisites: end libbox/0.1.0 + trace: collect_build_prerequisites: begin libbar/1.0.0 + trace: collect_build_prerequisites: end libbar/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 bax/1.0.0 + trace: collect_build_prerequisites: resume bax/1.0.0 + %.* + trace: collect_build: pick libbox/0.1.0 over libbox/1.0.0 + trace: collect_build_prerequisites: cfg-postpone dependency libbox/0.1.0 of dependent bax/1.0.0 + trace: collect_build_prerequisites: cfg-postpone dependency libbar/1.0.0 of dependent bax/1.0.0 + trace: postponed_configurations::add: add {bax 2,1: libbox libbar} to {bax^ baz^ box | libfoo->{bax/1,1 baz/1,1} libbox->{box/1,1} libbar->{baz/1,1}}? (shadow cluster-based) + trace: collect_build_prerequisites: dependent bax/1.0.0 is a shadow dependent for {bax^ baz^ box | libfoo->{bax/1,1 baz/1,1} libbox->{bax/2,1 box/1,1} libbar->{bax/2,1 baz/1,1}}? + trace: collect_build_prerequisites: configuration for cfg-postponed dependencies of dependent bax/1.0.0 is negotiated + trace: collect_build_prerequisites: dependency libbox/0.1.0 of dependent bax/1.0.0 is already (being) recursively collected, skipping + trace: collect_build_prerequisites: dependency libbar/1.0.0 of dependent bax/1.0.0 is already (being) recursively collected, skipping + trace: collect_build_prerequisites: end bax/1.0.0 + trace: collect_build_postponed (1): select cfg-negotiated dependency alternative for dependent baz/1.0.0 + trace: collect_build_prerequisites: resume baz/1.0.0 + trace: collect_build_prerequisites: end baz/1.0.0 + trace: collect_build_postponed (1): select cfg-negotiated dependency alternative for dependent box/0.1.0 + trace: collect_build_prerequisites: resume box/0.1.0 + trace: collect_build_prerequisites: end box/0.1.0 + trace: collect_build_postponed (1): cfg-negotiate end {bax^ baz^ box | libfoo->{bax/1,1 baz/1,1} libbox->{bax/2,1 box/1,1} libbar->{bax/2,1 baz/1,1}}! + trace: collect_build_postponed (1): end {bax^ box | libfoo->{bax/1,1} libbox->{box/1,1}} + trace: collect_build_postponed (0): end + %.* + trace: execute_plan: simulate: yes + %.* + EOE + + $pkg_status -r >>EOO; + !bax configured 1.0.0 + libbar configured 1.0.0 + libbox configured 0.1.0 available 1.0.0 + libfoo configured 1.0.0 + !baz configured 1.0.0 + libbar configured 1.0.0 + libfoo configured 1.0.0 + !box configured !0.1.0 available 1.0.0 + libbox configured 0.1.0 available 1.0.0 + EOO + + $pkg_drop bax baz box + } } } -- cgit v1.1