diff options
-rw-r--r-- | bpkg/pkg-build.cxx | 107 | ||||
-rw-r--r-- | tests/pkg-build.testscript | 240 |
2 files changed, 259 insertions, 88 deletions
diff --git a/bpkg/pkg-build.cxx b/bpkg/pkg-build.cxx index 94d83cf..b98a068 100644 --- a/bpkg/pkg-build.cxx +++ b/bpkg/pkg-build.cxx @@ -6,6 +6,7 @@ #include <map> #include <set> #include <list> +#include <limits> #include <cstring> // strlen() #include <iostream> // cout #include <functional> // ref() @@ -1242,6 +1243,13 @@ namespace bpkg #endif } + bool + existing_dependent (const config_package& cp) const + { + auto i (dependents.find (cp)); + return i != dependents.end () && i->second.existing; + } + // Return the postponed configuration string representation in the form: // // {<dependent>[ <dependent>]* | <dependency>[ <dependency>]*} @@ -1448,6 +1456,18 @@ namespace bpkg return true; } + + bool + existing_dependent (const config_package& cp) const + { + for (const postponed_configuration& cfg: *this) + { + if (cfg.existing_dependent (cp)) + return true; + } + + return false; + } }; static ostream& @@ -1591,6 +1611,10 @@ namespace bpkg postpone (const config_package& cp, const postponed_configurations& postponed_cfgs) { + // @@ DPT + // + return false; + auto i (find (cp)); if (i == end ()) @@ -2258,8 +2282,10 @@ namespace bpkg rpt_prereq_flags == nullptr && (pkg.config_vars.empty () || !has_buildfile_clause (ap->dependencies)) && - ((i = postponed_dpts.find (cp)) == postponed_dpts.end () || - !i->second.config)) +// @@ DPT +// ((i = postponed_dpts.find (cp)) == postponed_dpts.end () || +// !i->second.config)) + !postponed_cfgs.existing_dependent (cp)) { l5 ([&]{trace << "skip configured " << pkg.available_name_version_db ();}); @@ -3386,6 +3412,11 @@ namespace bpkg } else if (bp->recursive_collection) { + // @@ DPT + // + bool existing (cfg != nullptr && + cfg->existing_dependent (cp)); + // The possible reason we ended up here is the configuration // cycle. // @@ -3423,12 +3454,20 @@ namespace bpkg // original package, and their common direct dependent. // { - l5 ([&]{trace << "cannot cfg-postpone dependency " - << bp->available_name_version_db () - << " of dependent " - << pkg.available_name_version_db () - << " (collected prematurely), checking for " - << "configuration cycle";}); + if (!existing) + l5 ([&]{trace << "cannot cfg-postpone dependency " + << bp->available_name_version_db () + << " of dependent " + << pkg.available_name_version_db () + << " (collected prematurely), checking for " + << "configuration cycle";}); + else + l5 ([&]{trace << "dependency " + << bp->available_name_version_db () + << " of existing dependent " + << pkg.available_name_version_db () + << " is already collected, checking for " + << "configuration cycle";}); // Create a temporary clusters list. // @@ -3446,11 +3485,12 @@ namespace bpkg } } - cfgs.add (cp, - false /* existing */, - di + 1, - postponed_configuration::packages ({dcp}), - true /* allow_negotiated */); + if (!existing) // @@ DPT + cfgs.add (cp, + false /* existing */, + di + 1, + postponed_configuration::packages ({dcp}), + true /* allow_negotiated */); // Iterate over the clusters. // @@ -3617,13 +3657,19 @@ namespace bpkg } } - l5 ([&]{trace << "no configuration cycle, throwing";}); + if (!existing) // @@ DPT + { + l5 ([&]{trace << "no configuration cycle, throwing";}); - // Don't print the "while satisfying..." chain. - // - dep_chain.clear (); + // Don't print the "while satisfying..." chain. + // + dep_chain.clear (); - throw postpone_dependency (move (dcp)); + throw postpone_dependency (move (dcp)); + } + else + l5 ([&]{trace << "no configuration cycle, skipping " + << "collected dependency";}); } else { @@ -4418,7 +4464,7 @@ namespace bpkg if (!dependents.empty ()) { - l5 ([&]{trace << "re-evaluate existing dependents";}); + l5 ([&]{trace << "re-evaluate existing dependents for " << *pcfg;}); for (auto& d: dependents) { @@ -4449,8 +4495,17 @@ namespace bpkg set<config_package> ( ds.begin (), ds.end ()), // Required by (dependency). false, // Required by dependents. - 0}; // State flags. - + build_package::adjust_reconfigure}; // State flags. // @@ DPT + + // @@ DPT What to do if the version replacement occurred in this + // function call? We could theoretically incorporate the + // version replacement check into + // query_configuring_dependents() and skip such dependents, + // but what if such replacement entry will turn out to be + // bogus and we will end up not considering this dependent + // for negotiation. Do we need to throw on bogus negotiations + // or some such? + // collect_build (o, move (p), fdb, @@ -4518,15 +4573,17 @@ namespace bpkg for (const auto& p: pcfg->dependents) { + // @@ DPT (commented out the below code) + // // @@ TMP Re-evaluated existing dependents should not be // distingushed from others here (they will also have // postponed_dependency_alternatives present, etc). // - if (p.second.existing) - continue; + //if (p.second.existing) + // continue; build_package* b (this->entered_build (p.first)); - assert (b != nullptr && b->postponed_dependency_alternatives); + assert (b != nullptr); build_package_refs dep_chain; @@ -4543,7 +4600,7 @@ namespace bpkg dep_chain, &postponed_repo, &postponed_alts, - b->postponed_dependency_alternatives->size (), + numeric_limits<size_t>::max (), postponed_deps); } diff --git a/tests/pkg-build.testscript b/tests/pkg-build.testscript index fc41224..af57ab8 100644 --- a/tests/pkg-build.testscript +++ b/tests/pkg-build.testscript @@ -5273,7 +5273,7 @@ test.options += --no-progress trace: collect_build_postponed (0): begin trace: collect_build_postponed (1): begin %.* - trace: collect_build_postponed (1): re-evaluate existing dependents + trace: collect_build_postponed (1): re-evaluate existing dependents for { | libfoo->{}} trace: collect_build: add foo/1.0.0 trace: postponed_configurations::add: add {foo | libfoo->{foo/1}} to { | libfoo->{}} trace: collect_build_postponed (1): cfg-negotiate begin {foo | libfoo->{foo/1}} @@ -5281,6 +5281,12 @@ test.options += --no-progress 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_prerequisites: begin foo/1.0.0 + %.* + trace: collect_build: pick libfoo/0.1.0 over libfoo/1.0.0 + trace: collect_build_prerequisites: skip cfg-negotiated dependency libfoo/0.1.0 of dependent 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}} trace: collect_build_postponed (1): end trace: collect_build_postponed (0): end @@ -5302,13 +5308,18 @@ test.options += --no-progress trace: collect_build_postponed (0): begin trace: collect_build_postponed (1): begin %.* - trace: collect_build_postponed (1): re-evaluate existing dependents + trace: collect_build_postponed (1): re-evaluate existing dependents for { | libfoo->{}} trace: collect_build: add foo/1.0.0 trace: postponed_configurations::add: add {foo | libfoo->{foo/1}} to { | libfoo->{}} trace: collect_build_postponed (1): cfg-negotiate begin {foo | libfoo->{foo/1}} trace: collect_build_postponed (1): recursively collect cfg-negotiated dependencies trace: collect_build_prerequisites: skip configured libfoo/0.1.0 trace: collect_build_postponed (1): recursively collect cfg-negotiated dependents + %.* + trace: collect_build_prerequisites: begin foo/1.0.0 + %.* + trace: collect_build_prerequisites: skip cfg-negotiated dependency libfoo/0.1.0 of dependent 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}} trace: collect_build_postponed (1): end trace: collect_build_postponed (0): end @@ -7361,12 +7372,11 @@ test.options += --no-progress # Configuration clusters: # - # {tix | libbar->{tix/1}} - # {tix | tex->{tix/2}} + # {tex tix | libbar->{tex/1 tix/1}} # # Fail at: # - # tex -> libbar + # tix -> tex # $* tix 2>>~%EOE% != 0; %.* @@ -7382,29 +7392,92 @@ test.options += --no-progress trace: collect_build_postponed (0): begin trace: collect_build_postponed (1): begin %.* - trace: collect_build_postponed (1): re-evaluate existing dependents + trace: collect_build_postponed (1): re-evaluate existing dependents for {tix | libbar->{tix/1}} trace: collect_build: add tex/1.0.0 trace: postponed_configurations::add: add {tex | libbar->{tex/1}} to {tix | libbar->{tix/1}} trace: collect_build_postponed (1): cfg-negotiate begin {tex tix | libbar->{tex/1 tix/1}} trace: collect_build_postponed (1): recursively collect cfg-negotiated dependencies trace: collect_build_prerequisites: skip configured libbar/1.0.0 trace: collect_build_postponed (1): recursively collect cfg-negotiated dependents + %.* + trace: collect_build_prerequisites: begin tex/1.0.0 + %.* + trace: collect_build_prerequisites: skip cfg-negotiated dependency libbar/1.0.0 of dependent tex/1.0.0 + %.* + trace: collect_build: add libfoo/1.0.0 + trace: collect_build_prerequisites: cfg-postpone dependency libfoo/1.0.0 of dependent tex/1.0.0 + trace: postponed_configurations::add: create {tex | libfoo->{tex/2}} + trace: collect_build_prerequisites: postpone tex/1.0.0 + trace: collect_build_prerequisites: resume tix/1.0.0 + %.* + trace: collect_build_prerequisites: skip cfg-negotiated dependency libbar/1.0.0 of dependent tix/1.0.0 + %.* + trace: collect_build_prerequisites: cannot cfg-postpone dependency tex/1.0.0 of dependent tix/1.0.0 (collected prematurely), checking for configuration cycle + trace: collect_build_prerequisites: being negotiated: {tex tix | libbar->{tex/1 tix/1}} + trace: postponed_configurations::add: create {tix | tex->{tix/2}} + trace: collect_build_prerequisites: verifying {tex tix | libbar->{tex/1 tix/1}} + error: package tix/1.0.0 negotiates configuration of libbar/1.0.0 before its (potentially indirect) dependency tex/1.0.0 negotiates configuration of libbar/1.0.0 + info: consider reordering dependencies of tix/1.0.0 + %.* + EOE + + # @@ These tests fail complaining on tix/1.0.0->tex/1.0.0 cycle. + # However, we downgrade tex to 0.1.0 or 0.2.0 for which there + # is no cycle (0.2.0 depends on libbar without config clause and + # 0.1.0 doesn't depend at all). + # + #$* tix ?tex/0.1.0 2>|; + #$* tix ?tex/0.2.0 2>|; + + $* tix tex/0.1.0 2>>~%EOE%; + %.* + trace: pkg_build: refine package collection/plan execution from scratch + %.* + trace: collect_build: add tix/1.0.0 + trace: collect_build: add tex/0.1.0 + trace: collect_build_prerequisites: begin tix/1.0.0 + %.* + trace: collect_build: add libbar/1.0.0 + trace: collect_build_prerequisites: cfg-postpone dependency libbar/1.0.0 of dependent tix/1.0.0 + trace: postponed_configurations::add: create {tix | libbar->{tix/1}} + trace: collect_build_prerequisites: postpone tix/1.0.0 + %.* + trace: collect_build_prerequisites: begin tex/0.1.0 + %.* + trace: collect_build: add libfoo/1.0.0 + trace: collect_build_prerequisites: cfg-postpone dependency libfoo/1.0.0 of dependent tex/0.1.0 + trace: postponed_configurations::add: create {tex | libfoo->{tex/1}} + trace: collect_build_prerequisites: postpone tex/0.1.0 + trace: collect_build_postponed (0): begin + trace: collect_build_postponed (1): begin + %.* + trace: collect_build_postponed (1): cfg-negotiate begin {tix | libbar->{tix/1}} + trace: collect_build_postponed (1): recursively collect cfg-negotiated dependencies + trace: collect_build_prerequisites: skip configured libbar/1.0.0 + trace: collect_build_postponed (1): recursively collect cfg-negotiated dependents trace: collect_build_prerequisites: resume tix/1.0.0 %.* trace: collect_build_prerequisites: skip cfg-negotiated dependency libbar/1.0.0 of dependent tix/1.0.0 %.* - trace: collect_build: cannot collect prematurely cfg-negotiated existing dependent tex, throwing - trace: pkg_build: collection failed due to prematurely cfg-negotiated existing dependent, retry from scratch + trace: collect_build: pick tex/0.1.0 over tex/1.0.0 + trace: collect_build_prerequisites: cannot cfg-postpone dependency tex/0.1.0 of dependent tix/1.0.0 (collected prematurely), checking for configuration cycle + trace: collect_build_prerequisites: being negotiated: {tix | libbar->{tix/1}} + trace: postponed_configurations::add: create {tix | tex->{tix/2}} + trace: collect_build_prerequisites: verifying {tix | libbar->{tix/1}} + trace: collect_build_prerequisites: no configuration cycle, throwing + 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 tix/1.0.0 + trace: collect_build: add tex/0.1.0 trace: collect_build_prerequisites: begin tix/1.0.0 %.* trace: collect_build: add libbar/1.0.0 trace: collect_build_prerequisites: cfg-postpone dependency libbar/1.0.0 of dependent tix/1.0.0 trace: postponed_configurations::add: create {tix | libbar->{tix/1}} trace: collect_build_prerequisites: postpone tix/1.0.0 + trace: pkg_build: dep-postpone user-specified tex trace: collect_build_postponed (0): begin trace: collect_build_postponed (1): begin %.* @@ -7416,8 +7489,8 @@ test.options += --no-progress %.* trace: collect_build_prerequisites: skip cfg-negotiated dependency libbar/1.0.0 of dependent tix/1.0.0 %.* - trace: collect_build: add tex/1.0.0 - trace: collect_build_prerequisites: cfg-postpone dependency tex/1.0.0 of dependent tix/1.0.0 + trace: collect_build: pick tex/0.1.0 over tex/1.0.0 + trace: collect_build_prerequisites: cfg-postpone dependency tex/0.1.0 of dependent tix/1.0.0 trace: postponed_configurations::add: create {tix | tex->{tix/2}} trace: collect_build_prerequisites: postpone tix/1.0.0 trace: collect_build_postponed (1): cfg-negotiate end {tix | libbar->{tix/1}} @@ -7425,27 +7498,40 @@ test.options += --no-progress %.* trace: collect_build_postponed (2): cfg-negotiate begin {tix | tex->{tix/2}} trace: collect_build_postponed (2): recursively collect cfg-negotiated dependencies - trace: collect_build_prerequisites: begin tex/1.0.0 + trace: collect_build_prerequisites: begin tex/0.1.0 %.* - trace: collect_build_prerequisites: cannot cfg-postpone dependency libbar/1.0.0 of dependent tex/1.0.0 (collected prematurely), checking for configuration cycle - trace: collect_build_prerequisites: negotiated: {tix | libbar->{tix/1}} - trace: collect_build_prerequisites: being negotiated: {tix | tex->{tix/2}} - trace: postponed_configurations::add: add {tex | libbar->{tex/1}} to {tix | libbar->{tix/1}} - trace: collect_build_prerequisites: verifying {tex tix | libbar->{tex/1 tix/1}} - error: package tix/1.0.0 negotiates configuration of libbar/1.0.0 before its (potentially indirect) dependency tex/1.0.0 negotiates configuration of libbar/1.0.0 - info: consider reordering dependencies of tix/1.0.0 + trace: collect_build: add libfoo/1.0.0 + trace: collect_build_prerequisites: cfg-postpone dependency libfoo/1.0.0 of dependent tex/0.1.0 + trace: postponed_configurations::add: create {tex | libfoo->{tex/1}} + trace: collect_build_prerequisites: postpone tex/0.1.0 + trace: collect_build_postponed (2): recursively collect cfg-negotiated dependents + trace: collect_build_prerequisites: resume tix/1.0.0 + %.* + trace: collect_build: pick tex/0.1.0 over tex/1.0.0 + trace: collect_build_prerequisites: skip cfg-negotiated dependency tex/0.1.0 of dependent tix/1.0.0 + trace: collect_build_prerequisites: end tix/1.0.0 + trace: collect_build_postponed (2): cfg-negotiate end {tix | tex->{tix/2}} + trace: collect_build_postponed (3): begin + %.* + trace: collect_build_postponed (3): cfg-negotiate begin {tex | libfoo->{tex/1}} + trace: collect_build_postponed (3): recursively collect cfg-negotiated dependencies + trace: collect_build_prerequisites: skip configured libfoo/1.0.0 + trace: collect_build_postponed (3): recursively collect cfg-negotiated dependents + trace: collect_build_prerequisites: resume tex/0.1.0 + %.* + trace: collect_build_prerequisites: skip cfg-negotiated dependency libfoo/1.0.0 of dependent tex/0.1.0 + trace: collect_build_prerequisites: end tex/0.1.0 + trace: collect_build_postponed (3): cfg-negotiate end {tex | libfoo->{tex/1}} + trace: collect_build_postponed (3): end + trace: collect_build_postponed (2): end + trace: collect_build_postponed (1): end + trace: collect_build_postponed (0): end + %.* + trace: execute_plan: simulate: yes %.* EOE - # @@ These tests fail complaining on tix/1.0.0->tex/1.0.0 cycle. - # However, we downgrade tex to 0.1.0 or 0.2.0 for which there - # is no cycle (0.2.0 depends on libbar without config clause and - # 0.1.0 doesn't depend at all). - # - #$* tix ?tex/0.1.0 2>|; - #$* tix ?tex/0.2.0 2>|; - - $pkg_drop tex + $pkg_drop tex tix } } } @@ -8451,13 +8537,18 @@ test.options += --no-progress # $* dex 2>!; - # @@ Here we would expect to fail due to the config cycle but we - # don't. + # Configuration clusters: + # + # {bar dix | libbar->{bar/1 dix/1}} + # {dex | bar->{dex/1}} + # {dix | libbox->{dix/2}} + # {dex | libfoo->{dex/2}} + # {dix | dox->{dix/3}} # # Fail at: # + # dox -> dex # - #\ $* dix 2>>~%EOE% != 0; %.* trace: pkg_build: refine package collection/plan execution from scratch @@ -8472,13 +8563,16 @@ test.options += --no-progress trace: collect_build_postponed (0): begin trace: collect_build_postponed (1): begin %.* - trace: collect_build_postponed (1): re-evaluate existing dependents + trace: collect_build_postponed (1): re-evaluate existing dependents for {dix | libbar->{dix/1}} trace: collect_build: add bar/1.0.0 trace: postponed_configurations::add: add {bar | libbar->{bar/1}} to {dix | libbar->{dix/1}} trace: collect_build_postponed (1): cfg-negotiate begin {bar dix | libbar->{bar/1 dix/1}} trace: collect_build_postponed (1): recursively collect cfg-negotiated dependencies trace: collect_build_prerequisites: skip configured libbar/1.0.0 trace: collect_build_postponed (1): recursively collect cfg-negotiated dependents + %.* + trace: collect_build_prerequisites: cfg-postpone dependency bar/1.0.0 of existing dependent dex/1.0.0 + trace: postponed_configurations::add: create { | bar->{}} trace: collect_build_prerequisites: resume dix/1.0.0 %.* trace: collect_build_prerequisites: skip cfg-negotiated dependency libbar/1.0.0 of dependent dix/1.0.0 @@ -8490,11 +8584,38 @@ test.options += --no-progress trace: collect_build_postponed (1): cfg-negotiate end {bar dix | libbar->{bar/1 dix/1}} trace: collect_build_postponed (2): begin %.* - trace: collect_build_postponed (2): cfg-negotiate begin {dix | libbox->{dix/2}} + trace: collect_build_postponed (2): re-evaluate existing dependents for { | bar->{}} + trace: collect_build: add dex/1.0.0 + trace: postponed_configurations::add: add {dex | bar->{dex/1}} to { | bar->{}} + trace: collect_build_postponed (2): cfg-negotiate begin {dex | bar->{dex/1}} trace: collect_build_postponed (2): recursively collect cfg-negotiated dependencies + trace: collect_build_prerequisites: begin bar/1.0.0 + %.* + trace: collect_build_prerequisites: dependency libbar/1.0.0 of existing dependent bar/1.0.0 is already collected, checking for configuration cycle + trace: collect_build_prerequisites: negotiated: {bar dix | libbar->{bar/1 dix/1}} + trace: collect_build_prerequisites: being negotiated: {dex | bar->{dex/1}} + trace: collect_build_prerequisites: verifying {bar dix | libbar->{bar/1 dix/1}} + trace: collect_build_prerequisites: verifying {dex | bar->{dex/1}} + trace: collect_build_prerequisites: no configuration cycle, skipping collected dependency + trace: collect_build_prerequisites: end bar/1.0.0 + trace: collect_build_postponed (2): recursively collect cfg-negotiated dependents + %.* + trace: collect_build_prerequisites: begin dex/1.0.0 + %.* + trace: collect_build_prerequisites: skip cfg-negotiated dependency bar/1.0.0 of dependent dex/1.0.0 + %.* + trace: collect_build: add libfoo/1.0.0 + trace: collect_build_prerequisites: cfg-postpone dependency libfoo/1.0.0 of dependent dex/1.0.0 + trace: postponed_configurations::add: create {dex | libfoo->{dex/2}} + trace: collect_build_prerequisites: postpone dex/1.0.0 + trace: collect_build_postponed (2): cfg-negotiate end {dex | bar->{dex/1}} + trace: collect_build_postponed (3): begin + %.* + trace: collect_build_postponed (3): cfg-negotiate begin {dix | libbox->{dix/2}} + trace: collect_build_postponed (3): recursively collect cfg-negotiated dependencies trace: collect_build_prerequisites: begin libbox/1.0.0 trace: collect_build_prerequisites: end libbox/1.0.0 - trace: collect_build_postponed (2): recursively collect cfg-negotiated dependents + trace: collect_build_postponed (3): recursively collect cfg-negotiated dependents trace: collect_build_prerequisites: resume dix/1.0.0 %.* trace: collect_build_prerequisites: skip cfg-negotiated dependency libbox/1.0.0 of dependent dix/1.0.0 @@ -8503,43 +8624,36 @@ test.options += --no-progress trace: collect_build_prerequisites: cfg-postpone dependency dox/1.0.0 of dependent dix/1.0.0 trace: postponed_configurations::add: create {dix | dox->{dix/3}} trace: collect_build_prerequisites: postpone dix/1.0.0 - trace: collect_build_postponed (2): cfg-negotiate end {dix | libbox->{dix/2}} - trace: collect_build_postponed (3): begin - %.* - trace: collect_build_postponed (3): cfg-negotiate begin {dix | dox->{dix/3}} - trace: collect_build_postponed (3): recursively collect cfg-negotiated dependencies - trace: collect_build_prerequisites: begin dox/1.0.0 - %.* - trace: collect_build: add dex/1.0.0 - trace: collect_build_prerequisites: cfg-postpone dependency dex/1.0.0 of dependent dox/1.0.0 - trace: postponed_configurations::add: create {dox | dex->{dox/1}} - trace: collect_build_prerequisites: postpone dox/1.0.0 - trace: collect_build_postponed (3): recursively collect cfg-negotiated dependents - trace: collect_build_prerequisites: resume dix/1.0.0 - %.* - trace: collect_build_prerequisites: skip cfg-negotiated dependency dox/1.0.0 of dependent dix/1.0.0 - trace: collect_build_prerequisites: end dix/1.0.0 - trace: collect_build_postponed (3): cfg-negotiate end {dix | dox->{dix/3}} + trace: collect_build_postponed (3): cfg-negotiate end {dix | libbox->{dix/2}} trace: collect_build_postponed (4): begin %.* - trace: collect_build_postponed (4): cfg-negotiate begin {dox | dex->{dox/1}} + trace: collect_build_postponed (4): cfg-negotiate begin {dex | libfoo->{dex/2}} trace: collect_build_postponed (4): recursively collect cfg-negotiated dependencies - trace: collect_build_prerequisites: skip configured dex/1.0.0 + trace: collect_build_prerequisites: skip configured libfoo/1.0.0 trace: collect_build_postponed (4): recursively collect cfg-negotiated dependents - trace: collect_build_prerequisites: resume dox/1.0.0 + trace: collect_build_prerequisites: resume dex/1.0.0 %.* - trace: collect_build_prerequisites: skip cfg-negotiated dependency dex/1.0.0 of dependent dox/1.0.0 - trace: collect_build_prerequisites: end dox/1.0.0 - trace: collect_build_postponed (4): cfg-negotiate end {dox | dex->{dox/1}} - trace: collect_build_postponed (4): end - trace: collect_build_postponed (3): end - trace: collect_build_postponed (2): end - trace: collect_build_postponed (1): end - trace: collect_build_postponed (0): end - trace: execute_plan: simulate: yes + trace: collect_build_prerequisites: skip cfg-negotiated dependency libfoo/1.0.0 of dependent dex/1.0.0 + trace: collect_build_prerequisites: end dex/1.0.0 + trace: collect_build_postponed (4): cfg-negotiate end {dex | libfoo->{dex/2}} + trace: collect_build_postponed (5): begin + %.* + trace: collect_build_postponed (5): cfg-negotiate begin {dix | dox->{dix/3}} + trace: collect_build_postponed (5): recursively collect cfg-negotiated dependencies + trace: collect_build_prerequisites: begin dox/1.0.0 + %.* + trace: collect_build_prerequisites: cannot cfg-postpone dependency dex/1.0.0 of dependent dox/1.0.0 (collected prematurely), checking for configuration cycle + trace: collect_build_prerequisites: negotiated: {bar dix | libbar->{bar/1 dix/1}} + trace: collect_build_prerequisites: negotiated: {dex | bar->{dex/1}} + trace: collect_build_prerequisites: negotiated: {dix | libbox->{dix/2}} + trace: collect_build_prerequisites: negotiated: {dex | libfoo->{dex/2}} + trace: collect_build_prerequisites: being negotiated: {dix | dox->{dix/3}} + trace: postponed_configurations::add: create {dox | dex->{dox/1}} + trace: collect_build_prerequisites: verifying {bar dix | libbar->{bar/1 dix/1}} + error: package dix/1.0.0 negotiates configuration of libbar/1.0.0 before its (potentially indirect) dependency bar/1.0.0 negotiates configuration of libbar/1.0.0 + info: consider reordering dependencies of dix/1.0.0 %.* EOE - #\ $pkg_drop dex } |