aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKaren Arutyunov <karen@codesynthesis.com>2023-10-30 14:43:35 +0300
committerKaren Arutyunov <karen@codesynthesis.com>2023-11-02 14:04:09 +0300
commitee7ec3887d5c15ae3ef719dd38237282fe8c11e8 (patch)
treed932883dd588d40e8403e4efddb7755d2d3baf1d
parent87a284335715301fa2cea695386bfcd21a2fe781 (diff)
Fix configuration negotiation machinery to postpone collecting cluster's existing dependent which is already a dependency in some cluster
-rw-r--r--bpkg/pkg-build-collect.cxx108
-rw-r--r--tests/pkg-build.testscript306
2 files changed, 341 insertions, 73 deletions
diff --git a/bpkg/pkg-build-collect.cxx b/bpkg/pkg-build-collect.cxx
index f664bf7..c83645b 100644
--- a/bpkg/pkg-build-collect.cxx
+++ b/bpkg/pkg-build-collect.cxx
@@ -5158,28 +5158,28 @@ namespace bpkg
build_package p {
build_package::build,
- db,
- sp,
- 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.
- sp->system (),
- false, // Keep output directory.
- false, // Disfigure (from-scratch reconf).
- false, // Configure-only.
- nullopt, // Checkout root.
- false, // Checkout purge.
- strings (), // Configuration variables.
- move (required_by), // Required by (dependencies).
- false, // Required by dependents.
- build_package::adjust_reconfigure | build_package::build_repoint};
+ db,
+ sp,
+ 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.
+ sp->system (),
+ false, // Keep output directory.
+ false, // Disfigure (from-scratch reconf).
+ false, // Configure-only.
+ nullopt, // Checkout root.
+ false, // Checkout purge.
+ strings (), // Configuration variables.
+ move (required_by), // Required by (dependencies).
+ false, // Required by dependents.
+ build_package::adjust_reconfigure | build_package::build_repoint};
build_package_refs dep_chain;
@@ -5639,11 +5639,12 @@ namespace bpkg
{
package_key pk (ed.db, ed.selected->name);
- // 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.
+ // If this dependent is present in postponed_deps or in some
+ // cluster as a dependency, then it means that 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 (pk));
if (pi != postponed_deps.end ())
@@ -5660,6 +5661,20 @@ namespace bpkg
continue;
}
+ const postponed_configuration* pcfg (
+ postponed_cfgs.find_dependency (pk));
+
+ if (pcfg != nullptr)
+ {
+ l5 ([&]{trace << "skip existing dependent " << pk
+ << " of dependency " << p << " since "
+ << "dependent already in cluster " << *pcfg
+ << " (as a dependency)";});
+
+ postponed_existing_dependents.insert (pk);
+ continue;
+ }
+
auto i (dependents.find (pk));
// If the existing dependent is not in the map yet, then add
@@ -5786,14 +5801,29 @@ namespace bpkg
}
}
- l5 ([&]{trace << "cfg-negotiate begin " << *pcfg;});
-
// Negotiate the configuration.
//
// The overall plan is as follows: continue refining the configuration
// until there are no more changes by giving each dependent a chance to
// make further adjustments.
//
+ l5 ([&]{trace << "cfg-negotiate begin " << *pcfg;});
+
+ // For the cluster's dependencies, the skeleton should not be present
+ // since we haven't yet started recursively collecting them. And we
+ // couldn't have started collecting them before we negotiated their
+ // configurations (that's in contrast to the up-negotiation). Let's
+ // assert for that here to make sure that's also true for dependencies
+ // of the postponed existing dependents of this cluster.
+ //
+#ifndef NDEBUG
+ for (const package_key& p: pcfg->dependencies)
+ {
+ build_package* b (entered_build (p));
+ assert (b != nullptr && !b->skeleton && !b->recursive_collection);
+ }
+#endif
+
for (auto b (pcfg->dependents.begin ()),
i (b),
e (pcfg->dependents.end ()); i != e; )
@@ -5831,7 +5861,6 @@ namespace bpkg
//
pair<size_t, size_t> pos;
small_vector<reference_wrapper<package_skeleton>, 1> depcs;
- forward_list<package_skeleton> depcs_storage; // Ref stability.
bool has_alt;
{
// A non-negotiated cluster must only have one depends position for
@@ -5856,21 +5885,14 @@ namespace bpkg
for (const package_key& pk: ds)
{
build_package* b (entered_build (pk));
- assert (b != nullptr);
- package_skeleton* depc;
- if (b->recursive_collection)
- {
- assert (b->skeleton);
+ // Shouldn't be here otherwise.
+ //
+ assert (b != nullptr && !b->recursive_collection);
- depcs_storage.push_front (*b->skeleton);
- depc = &depcs_storage.front ();
- depc->reset ();
- }
- else
- depc = &(b->skeleton
- ? *b->skeleton
- : b->init_skeleton (o /* options */));
+ package_skeleton* depc (&(b->skeleton
+ ? *b->skeleton
+ : b->init_skeleton (o /* options */)));
depcs.push_back (*depc);
}
diff --git a/tests/pkg-build.testscript b/tests/pkg-build.testscript
index a37ea9f..cc69b1a 100644
--- a/tests/pkg-build.testscript
+++ b/tests/pkg-build.testscript
@@ -13862,6 +13862,280 @@ test.arguments += --sys-no-query
$pkg_drop tiz
}
+ : skip-existing-dependent-cluster
+ :
+ : Similar to skip-existing-dependent but skip the existing dependent
+ : because it is already in a cluster as a dependency.
+ :
+ {
+ $clone_cfg;
+
+ # Dependencies:
+ #
+ # bac: depends: libbar(c)
+ # depends: libbaz(c)
+ # depends: libfoo(c)
+ #
+ # bas: depends: libbar(c)
+ # depends: bus(c)
+ #
+ # bus: depends: libbaz(c)
+ # depends: foo(c)
+ #
+ # foo: depends: libfoo(c)
+ #
+ # box: depends: {libbar libfoo} (c) | libbox
+ #
+ $* bac bas 2>!;
+
+ $pkg_status -r >>EOO;
+ !bac configured 1.0.0
+ libbar configured 1.0.0
+ libbaz configured 1.0.0
+ libfoo configured 1.0.0
+ !bas configured 1.0.0
+ bus configured 1.0.0
+ foo configured 1.0.0
+ libfoo configured 1.0.0
+ libbaz configured 1.0.0
+ libbar configured 1.0.0
+ EOO
+
+ $* box 2>&1 | $filter 2>>~%EOE%;
+ %.*
+ trace: pkg_build: refine package collection/plan execution from scratch
+ trace: collect_build: add box/1.0.0
+ trace: collect_build_prerequisites: begin box/1.0.0
+ trace: collect_build_prerequisites: alt-postpone dependent box/1.0.0 since max index is reached: 0
+ info: dependency alternative: {libbar libfoo}
+ {
+ require
+ {
+ config.libbar.extras = true
+ config.libfoo.extras = true
+ }
+ }
+ trace: collect_build_prerequisites: postpone box/1.0.0
+ trace: collect_build_postponed (0): begin
+ trace: collect_build_postponed (0): index 1 collect alt-postponed box/1.0.0
+ trace: collect_build_prerequisites: resume box/1.0.0
+ trace: collect_build: add libbar/1.0.0
+ trace: collect_build_prerequisites: cfg-postpone dependency libbar/1.0.0 of dependent box/1.0.0
+ trace: collect_build: add libfoo/1.0.0
+ trace: collect_build_prerequisites: cfg-postpone dependency libfoo/1.0.0 of dependent box/1.0.0
+ trace: postponed_configurations::add: create {box | libbar->{box/1,1} libfoo->{box/1,1}}
+ trace: collect_build_prerequisites: postpone box/1.0.0
+ trace: collect_build_postponed (1): begin {box | libbar->{box/1,1} libfoo->{box/1,1}}
+ trace: collect_build_prerequisites: pre-reeval bac/1.0.0
+ trace: collect_build_prerequisites: pre-reevaluated bac/1.0.0: 1,1
+ trace: collect_build_prerequisites: pre-reeval bas/1.0.0
+ trace: collect_build_prerequisites: pre-reevaluated bas/1.0.0: 1,1
+ trace: collect_build_prerequisites: pre-reeval foo/1.0.0
+ trace: collect_build_prerequisites: pre-reevaluated foo/1.0.0: 1,1
+ trace: collect_build_prerequisites: pre-reeval bac/1.0.0
+ trace: collect_build_prerequisites: pre-reevaluated bac/1.0.0: 1,1
+ trace: collect_build_postponed (1): re-evaluate existing dependents for {box | libbar->{box/1,1} libfoo->{box/1,1}}
+ trace: collect_build: add bac/1.0.0
+ trace: collect_build_prerequisites: reeval bac/1.0.0
+ trace: postponed_configurations::add: add {bac^ 1,1: libbar} to {box | libbar->{box/1,1} libfoo->{box/1,1}}
+ trace: collect_build_prerequisites: re-evaluating dependent bac/1.0.0 results in {bac^ box | libbar->{bac/1,1 box/1,1} libfoo->{box/1,1}}
+ trace: collect_build_prerequisites: re-evaluated bac/1.0.0
+ trace: collect_build: add bas/1.0.0
+ trace: collect_build_prerequisites: reeval bas/1.0.0
+ trace: postponed_configurations::add: add {bas^ 1,1: libbar} to {bac^ box | libbar->{bac/1,1 box/1,1} libfoo->{box/1,1}}
+ trace: collect_build_prerequisites: re-evaluating dependent bas/1.0.0 results in {bac^ bas^ box | libbar->{bac/1,1 bas/1,1 box/1,1} libfoo->{box/1,1}}
+ trace: collect_build_prerequisites: re-evaluated bas/1.0.0
+ 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 {bac^ bas^ box | libbar->{bac/1,1 bas/1,1 box/1,1} libfoo->{box/1,1}}
+ trace: collect_build_prerequisites: re-evaluating dependent foo/1.0.0 results in {bac^ bas^ box foo^ | libbar->{bac/1,1 bas/1,1 box/1,1} libfoo->{box/1,1 foo/1,1}}
+ trace: collect_build_prerequisites: re-evaluated foo/1.0.0
+ trace: collect_build_postponed (1): cfg-negotiate begin {bac^ bas^ box foo^ | libbar->{bac/1,1 bas/1,1 box/1,1} libfoo->{box/1,1 foo/1,1}}
+ %.*
+ trace: collect_build_postponed (1): recursively collect cfg-negotiated dependencies
+ trace: collect_build_prerequisites: skip configured libbar/1.0.0
+ trace: collect_build_prerequisites: skip configured 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 bac/1.0.0
+ trace: collect_build_prerequisites: resume bac/1.0.0
+ trace: collect_build: add libbaz/1.0.0
+ trace: collect_build_prerequisites: cfg-postpone dependency libbaz/1.0.0 of dependent bac/1.0.0
+ trace: postponed_configurations::add: create {bac | libbaz->{bac/2,1}}
+ trace: collect_build_prerequisites: postpone bac/1.0.0
+ trace: collect_build_postponed (1): select cfg-negotiated dependency alternative for dependent bas/1.0.0
+ trace: collect_build_prerequisites: resume bas/1.0.0
+ trace: collect_build: add bus/1.0.0
+ trace: collect_build_prerequisites: cfg-postpone dependency bus/1.0.0 of dependent bas/1.0.0
+ trace: postponed_configurations::add: create {bas | bus->{bas/2,1}}
+ trace: collect_build_prerequisites: postpone bas/1.0.0
+ trace: collect_build_postponed (1): select cfg-negotiated dependency alternative for dependent box/1.0.0
+ trace: collect_build_prerequisites: resume box/1.0.0
+ trace: collect_build_prerequisites: end box/1.0.0
+ 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 {bac^ bas^ box foo^ | libbar->{bac/1,1 bas/1,1 box/1,1} libfoo->{box/1,1 foo/1,1}}!
+ trace: collect_build_postponed (2): begin {bac | libbaz->{bac/2,1}}
+ trace: collect_build_prerequisites: pre-reeval bus/1.0.0
+ trace: collect_build_prerequisites: pre-reevaluated bus/1.0.0: 1,1
+ trace: collect_build_postponed (2): skip being built existing dependent bac of dependency libbaz
+ trace: collect_build_postponed (2): skip existing dependent bus of dependency libbaz since dependent already in cluster {bas | bus->{bas/2,1}} (as a dependency)
+ trace: collect_build_postponed (2): cfg-negotiate begin {bac | libbaz->{bac/2,1}}
+ %.*
+ trace: collect_build_postponed (2): recursively collect cfg-negotiated dependencies
+ trace: collect_build_prerequisites: skip configured libbaz/1.0.0
+ trace: collect_build_postponed (2): recursively collect cfg-negotiated dependents
+ trace: collect_build_postponed (2): select cfg-negotiated dependency alternative for dependent bac/1.0.0
+ trace: collect_build_prerequisites: resume bac/1.0.0
+ trace: collect_build_prerequisites: cfg-postpone dependency libfoo/1.0.0 of dependent bac/1.0.0
+ trace: postponed_configurations::add: add {bac 3,1: libfoo} to {bac^ bas^ box foo^ | libbar->{bac/1,1 bas/1,1 box/1,1} libfoo->{box/1,1 foo/1,1}}!
+ trace: collect_build_prerequisites: configuration for cfg-postponed dependencies of dependent bac/1.0.0 is negotiated
+ trace: collect_build_prerequisites: dependency libfoo/1.0.0 of dependent bac/1.0.0 is already (being) recursively collected, skipping
+ trace: collect_build_prerequisites: end bac/1.0.0
+ trace: collect_build_postponed (2): cfg-negotiate end {bac | libbaz->{bac/2,1}}!
+ trace: collect_build_postponed (3): begin {bas | bus->{bas/2,1}}
+ trace: collect_build_postponed (3): skip being built existing dependent bas of dependency bus
+ trace: collect_build_postponed (3): cfg-negotiate begin {bas | bus->{bas/2,1}}
+ %.*
+ trace: collect_build_postponed (3): recursively collect cfg-negotiated dependencies
+ trace: collect_build_prerequisites: begin bus/1.0.0
+ trace: collect_build_prerequisites: cfg-postpone dependency libbaz/1.0.0 of dependent bus/1.0.0
+ trace: postponed_configurations::add: add {bus 1,1: libbaz} to {bac | libbaz->{bac/2,1}}!
+ trace: collect_build_prerequisites: configuration for cfg-postponed dependencies of dependent bus/1.0.0 is negotiated
+ trace: collect_build_prerequisites: dependency libbaz/1.0.0 of dependent bus/1.0.0 is already (being) recursively collected, skipping
+ trace: collect_build_prerequisites: cannot cfg-postpone dependency foo/1.0.0 of dependent bus/1.0.0 (collected prematurely), throwing postpone_dependency
+ trace: pkg_build: collection failed due to prematurely collected dependency (foo), retry from scratch
+ trace: pkg_build: refine package collection/plan execution from scratch
+ trace: collect_build: add box/1.0.0
+ trace: collect_build_prerequisites: begin box/1.0.0
+ trace: collect_build_prerequisites: alt-postpone dependent box/1.0.0 since max index is reached: 0
+ info: dependency alternative: {libbar libfoo}
+ {
+ require
+ {
+ config.libbar.extras = true
+ config.libfoo.extras = true
+ }
+ }
+ trace: collect_build_prerequisites: postpone box/1.0.0
+ trace: collect_build_postponed (0): begin
+ trace: collect_build_postponed (0): index 1 collect alt-postponed box/1.0.0
+ trace: collect_build_prerequisites: resume box/1.0.0
+ trace: collect_build: add libbar/1.0.0
+ trace: collect_build_prerequisites: cfg-postpone dependency libbar/1.0.0 of dependent box/1.0.0
+ trace: collect_build: add libfoo/1.0.0
+ trace: collect_build_prerequisites: cfg-postpone dependency libfoo/1.0.0 of dependent box/1.0.0
+ trace: postponed_configurations::add: create {box | libbar->{box/1,1} libfoo->{box/1,1}}
+ trace: collect_build_prerequisites: postpone box/1.0.0
+ trace: collect_build_postponed (1): begin {box | libbar->{box/1,1} libfoo->{box/1,1}}
+ trace: collect_build_prerequisites: pre-reeval bac/1.0.0
+ trace: collect_build_prerequisites: pre-reevaluated bac/1.0.0: 1,1
+ trace: collect_build_prerequisites: pre-reeval bas/1.0.0
+ trace: collect_build_prerequisites: pre-reevaluated bas/1.0.0: 1,1
+ trace: collect_build_prerequisites: pre-reeval foo/1.0.0
+ trace: collect_build_prerequisites: pre-reevaluated foo/1.0.0: 1,1
+ trace: collect_build_prerequisites: pre-reeval bac/1.0.0
+ trace: collect_build_prerequisites: pre-reevaluated bac/1.0.0: 1,1
+ trace: collect_build_postponed (1): skip dep-postponed existing dependent foo of dependency libfoo
+ trace: collect_build_postponed (1): re-evaluate existing dependents for {box | libbar->{box/1,1} libfoo->{box/1,1}}
+ trace: collect_build: add bac/1.0.0
+ trace: collect_build_prerequisites: reeval bac/1.0.0
+ trace: postponed_configurations::add: add {bac^ 1,1: libbar} to {box | libbar->{box/1,1} libfoo->{box/1,1}}
+ trace: collect_build_prerequisites: re-evaluating dependent bac/1.0.0 results in {bac^ box | libbar->{bac/1,1 box/1,1} libfoo->{box/1,1}}
+ trace: collect_build_prerequisites: re-evaluated bac/1.0.0
+ trace: collect_build: add bas/1.0.0
+ trace: collect_build_prerequisites: reeval bas/1.0.0
+ trace: postponed_configurations::add: add {bas^ 1,1: libbar} to {bac^ box | libbar->{bac/1,1 box/1,1} libfoo->{box/1,1}}
+ trace: collect_build_prerequisites: re-evaluating dependent bas/1.0.0 results in {bac^ bas^ box | libbar->{bac/1,1 bas/1,1 box/1,1} libfoo->{box/1,1}}
+ trace: collect_build_prerequisites: re-evaluated bas/1.0.0
+ trace: collect_build_postponed (1): cfg-negotiate begin {bac^ bas^ box | libbar->{bac/1,1 bas/1,1 box/1,1} libfoo->{box/1,1}}
+ trace: collect_build_postponed (1): recursively collect cfg-negotiated dependencies
+ trace: collect_build_prerequisites: skip configured libbar/1.0.0
+ trace: collect_build_prerequisites: skip configured 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 bac/1.0.0
+ trace: collect_build_prerequisites: resume bac/1.0.0
+ trace: collect_build: add libbaz/1.0.0
+ trace: collect_build_prerequisites: cfg-postpone dependency libbaz/1.0.0 of dependent bac/1.0.0
+ trace: postponed_configurations::add: create {bac | libbaz->{bac/2,1}}
+ trace: collect_build_prerequisites: postpone bac/1.0.0
+ trace: collect_build_postponed (1): select cfg-negotiated dependency alternative for dependent bas/1.0.0
+ trace: collect_build_prerequisites: resume bas/1.0.0
+ trace: collect_build: add bus/1.0.0
+ trace: collect_build_prerequisites: cfg-postpone dependency bus/1.0.0 of dependent bas/1.0.0
+ trace: postponed_configurations::add: create {bas | bus->{bas/2,1}}
+ trace: collect_build_prerequisites: postpone bas/1.0.0
+ trace: collect_build_postponed (1): select cfg-negotiated dependency alternative for dependent box/1.0.0
+ trace: collect_build_prerequisites: resume box/1.0.0
+ trace: collect_build_prerequisites: end box/1.0.0
+ trace: collect_build_postponed (1): cfg-negotiate end {bac^ bas^ box | libbar->{bac/1,1 bas/1,1 box/1,1} libfoo->{box/1,1}}!
+ trace: collect_build_postponed (2): begin {bac | libbaz->{bac/2,1}}
+ trace: collect_build_prerequisites: pre-reeval bus/1.0.0
+ trace: collect_build_prerequisites: pre-reevaluated bus/1.0.0: 1,1
+ trace: collect_build_postponed (2): skip being built existing dependent bac of dependency libbaz
+ trace: collect_build_postponed (2): skip existing dependent bus of dependency libbaz since dependent already in cluster {bas | bus->{bas/2,1}} (as a dependency)
+ trace: collect_build_postponed (2): cfg-negotiate begin {bac | libbaz->{bac/2,1}}
+ trace: collect_build_postponed (2): recursively collect cfg-negotiated dependencies
+ trace: collect_build_prerequisites: skip configured libbaz/1.0.0
+ trace: collect_build_postponed (2): recursively collect cfg-negotiated dependents
+ trace: collect_build_postponed (2): select cfg-negotiated dependency alternative for dependent bac/1.0.0
+ trace: collect_build_prerequisites: resume bac/1.0.0
+ trace: collect_build_prerequisites: cfg-postpone dependency libfoo/1.0.0 of dependent bac/1.0.0
+ trace: postponed_configurations::add: add {bac 3,1: libfoo} to {bac^ bas^ box | libbar->{bac/1,1 bas/1,1 box/1,1} libfoo->{box/1,1}}!
+ trace: collect_build_prerequisites: configuration for cfg-postponed dependencies of dependent bac/1.0.0 is negotiated
+ trace: collect_build_prerequisites: dependency libfoo/1.0.0 of dependent bac/1.0.0 is already (being) recursively collected, skipping
+ trace: collect_build_prerequisites: end bac/1.0.0
+ trace: collect_build_postponed (2): cfg-negotiate end {bac | libbaz->{bac/2,1}}!
+ trace: collect_build_postponed (3): begin {bas | bus->{bas/2,1}}
+ trace: collect_build_postponed (3): skip being built existing dependent bas of dependency bus
+ trace: collect_build_postponed (3): cfg-negotiate begin {bas | bus->{bas/2,1}}
+ trace: collect_build_postponed (3): recursively collect cfg-negotiated dependencies
+ trace: collect_build_prerequisites: begin bus/1.0.0
+ trace: collect_build_prerequisites: cfg-postpone dependency libbaz/1.0.0 of dependent bus/1.0.0
+ trace: postponed_configurations::add: add {bus 1,1: libbaz} to {bac | libbaz->{bac/2,1}}!
+ trace: collect_build_prerequisites: configuration for cfg-postponed dependencies of dependent bus/1.0.0 is negotiated
+ trace: collect_build_prerequisites: dependency libbaz/1.0.0 of dependent bus/1.0.0 is already (being) recursively collected, skipping
+ trace: collect_build: add foo/1.0.0
+ trace: collect_build_prerequisites: cfg-postpone dependency foo/1.0.0 of dependent bus/1.0.0
+ trace: postponed_configurations::add: create {bus | foo->{bus/2,1}}
+ trace: collect_build_prerequisites: postpone bus/1.0.0
+ trace: collect_build_postponed (3): recursively collect cfg-negotiated dependents
+ trace: collect_build_postponed (3): select cfg-negotiated dependency alternative for dependent bas/1.0.0
+ trace: collect_build_prerequisites: resume bas/1.0.0
+ trace: collect_build_prerequisites: end bas/1.0.0
+ trace: collect_build_postponed (3): cfg-negotiate end {bas | bus->{bas/2,1}}!
+ trace: collect_build_postponed (4): begin {bus | foo->{bus/2,1}}
+ trace: collect_build_postponed (4): skip being built existing dependent bus of dependency foo
+ trace: collect_build_postponed (4): cfg-negotiate begin {bus | foo->{bus/2,1}}
+ %.*
+ trace: collect_build_postponed (4): recursively collect cfg-negotiated dependencies
+ trace: collect_build_prerequisites: begin foo/1.0.0
+ trace: collect_build_prerequisites: cfg-postpone dependency libfoo/1.0.0 of dependent foo/1.0.0
+ trace: postponed_configurations::add: add {foo 1,1: libfoo} to {bac^ bas^ box | libbar->{bac/1,1 bas/1,1 box/1,1} libfoo->{bac/3,1 box/1,1}}!
+ trace: collect_build_prerequisites: configuration for cfg-postponed dependencies of dependent foo/1.0.0 is negotiated
+ trace: collect_build_prerequisites: dependency libfoo/1.0.0 of dependent foo/1.0.0 is already (being) recursively collected, skipping
+ trace: collect_build_prerequisites: end foo/1.0.0
+ trace: collect_build_postponed (4): recursively collect cfg-negotiated dependents
+ trace: collect_build_postponed (4): select cfg-negotiated dependency alternative for dependent bus/1.0.0
+ trace: collect_build_prerequisites: resume bus/1.0.0
+ trace: collect_build_prerequisites: end bus/1.0.0
+ trace: collect_build_postponed (4): cfg-negotiate end {bus | foo->{bus/2,1}}!
+ trace: collect_build_postponed (4): end {bus | foo->{bus/2,1}}
+ trace: collect_build_postponed (3): end {bas | bus->{bas/2,1}}
+ trace: collect_build_postponed (2): end {bac | libbaz->{bac/2,1}}
+ trace: collect_build_postponed (1): end {box | libbar->{box/1,1} libfoo->{box/1,1}}
+ trace: collect_build_postponed (0): end
+ trace: execute_plan: simulate: yes
+ %.*
+ build plan:
+ new box/1.0.0
+ trace: execute_plan: simulate: no
+ %.*
+ EOE
+
+ $pkg_drop bac bas box
+ }
+
: replace-configured-dependency
:
{
@@ -14840,35 +15114,7 @@ test.arguments += --sys-no-query
trace: collect_build_prerequisites: pre-reevaluated tex/1.0.0: 1,1
trace: collect_build_prerequisites: pre-reeval tiz/1.0.0
trace: collect_build_prerequisites: pre-reevaluated tiz/1.0.0: 1,1
- trace: collect_build_postponed (1): re-evaluate existing dependents for {tex^ | libbar->{tex/1,1}}
- trace: collect_build_prerequisites: reeval tex/1.0.0
- trace: collect_build: pick libbar/1.0.0 over libbar/0.1.0
- trace: postponed_configurations::add: add {tex^ 1,1: libbar} to {tex^ | libbar->{tex/1,1}}
- trace: collect_build_prerequisites: re-evaluating dependent tex/1.0.0 results in {tex^ | libbar->{tex/1,1}}
- trace: collect_build_prerequisites: re-evaluated tex/1.0.0
- trace: collect_build_prerequisites: reeval tiz/1.0.0
- trace: collect_build_prerequisites: cannot re-evaluate existing dependent tiz/1.0.0 due to dependency tex/1.0.0 (collected prematurely), throwing postpone_dependency
- trace: pkg_build: collection failed due to prematurely collected dependency (tex), retry from scratch
- trace: pkg_build: refine package collection/plan execution from scratch
- trace: collect_build: add libbar/1.0.0
- trace: collect_build: add tiz/1.0.0
- trace: collect_build_prerequisites: pre-reeval tex/1.0.0
- trace: collect_build_prerequisites: pre-reevaluated tex/1.0.0: 1,1
- trace: collect_build_prerequisites: pre-reeval tiz/1.0.0
- trace: collect_build_prerequisites: pre-reevaluated tiz/1.0.0: 1,1
- trace: collect_build_prerequisites: cfg-postpone dependency libbar/1.0.0 of existing dependent tex/1.0.0 due to dependency libbar/1.0.0
- trace: collect_build: add tex/1.0.0
- trace: postponed_configurations::add: create {tex^ | libbar->{tex/1,1}}
- trace: collect_build_prerequisites: cfg-postpone dependency tex/1.0.0 of existing dependent tiz/1.0.0 due to dependency libbar/1.0.0
- trace: postponed_configurations::add: create {tiz^ | tex->{tiz/1,1}}
- trace: collect_build_prerequisites: skip configured tiz/1.0.0
- trace: collect_build_postponed (0): begin
- trace: collect_build_postponed (1): begin {tex^ | libbar->{tex/1,1}}
- trace: collect_build_prerequisites: pre-reeval tex/1.0.0
- trace: collect_build_prerequisites: pre-reevaluated tex/1.0.0: 1,1
- trace: collect_build_prerequisites: pre-reeval tiz/1.0.0
- trace: collect_build_prerequisites: pre-reevaluated tiz/1.0.0: 1,1
- trace: collect_build_postponed (1): skip dep-postponed existing dependent tex of dependency libbar
+ trace: collect_build_postponed (1): skip existing dependent tex of dependency libbar since dependent already in cluster {tiz^ | tex->{tiz/1,1}} (as a dependency)
trace: collect_build_postponed (1): re-evaluate existing dependents for {tex^ | libbar->{tex/1,1}}
trace: collect_build_prerequisites: reeval tiz/1.0.0
trace: postponed_configurations::add: add {tiz^ 1,1: tex} to {tiz^ | tex->{tiz/1,1}}
@@ -14897,7 +15143,7 @@ test.arguments += --sys-no-query
trace: collect_build_prerequisites: pre-reevaluated tex/1.0.0: 1,1
trace: collect_build_prerequisites: pre-reeval tiz/1.0.0
trace: collect_build_prerequisites: pre-reevaluated tiz/1.0.0: 1,1
- trace: collect_build_postponed (1): skip dep-postponed existing dependent tex of dependency libbar
+ trace: collect_build_postponed (1): skip existing dependent tex of dependency libbar since dependent already in cluster {tiz^ | tex->{tiz/1,1}} (as a dependency)
trace: collect_build_postponed (1): re-evaluate existing dependents for {tex^ | libbar->{tex/1,1}}
trace: collect_build_prerequisites: reeval tiz/1.0.0
trace: postponed_configurations::add: add {tiz^ 1,1: tex} to {tiz^ | tex->{tiz/1,1}}