bitbake: cooker: fix indirect multiconfig dependencies

When an indirect multiconfig dependency exists, such as:

A depends on B, B has a multiconfig dependency to C,and our build
target is A, the multiconfig dependency to C is not processed on
time, hence no providers are added for it, causing an exception in
the runqueue because the dependency does exist in it.

Call add_unresolved() for all available multiconfigs before processing
providers for multiconfig dependencies, detecting mcdepends on time so
providers for them can be added correctly.

(Bitbake rev: 8a6bc7584ad61b4de98af92a86066602006262f9)

Signed-off-by: Alejandro Enedino Hernandez Samaniego <alejandr@xilinx.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Alejandro Enedino Hernandez Samaniego
2018-12-28 12:47:46 -08:00
committed by Richard Purdie
parent 001f23a868
commit 99f505422b

View File

@@ -639,27 +639,38 @@ class BBCooker:
runlist.append([mc, k, ktask, fn])
bb.event.fire(bb.event.TreeDataPreparationProgress(current, len(fulltargetlist)), self.data)
mcdeps = taskdata[mc].get_mcdepends()
# No need to do check providers if there are no mcdeps or not an mc build
if mcdeps and mc:
# Make sure we can provide the multiconfig dependency
seen = set()
new = True
while new:
new = False
for mc in self.multiconfigs:
for k in mcdeps:
if k in seen:
continue
l = k.split(':')
depmc = l[2]
if depmc not in self.multiconfigs:
bb.fatal("Multiconfig dependency %s depends on nonexistent mc configuration %s" % (k,depmc))
else:
logger.debug(1, "Adding providers for multiconfig dependency %s" % l[3])
taskdata[depmc].add_provider(localdata[depmc], self.recipecaches[depmc], l[3])
seen.add(k)
new = True
if mc:
# Add unresolved first, so we can get multiconfig indirect dependencies on time
for mcavailable in self.multiconfigs:
# The first element is empty
if mcavailable:
taskdata[mcavailable].add_unresolved(localdata[mcavailable], self.recipecaches[mcavailable])
mcdeps = taskdata[mc].get_mcdepends()
if mcdeps:
# Make sure we can provide the multiconfig dependency
seen = set()
new = True
while new:
new = False
for mc in self.multiconfigs:
for k in mcdeps:
if k in seen:
continue
l = k.split(':')
depmc = l[2]
if depmc not in self.multiconfigs:
bb.fatal("Multiconfig dependency %s depends on nonexistent mc configuration %s" % (k,depmc))
else:
logger.debug(1, "Adding providers for multiconfig dependency %s" % l[3])
taskdata[depmc].add_provider(localdata[depmc], self.recipecaches[depmc], l[3])
seen.add(k)
new = True
for mc in self.multiconfigs:
taskdata[mc].add_unresolved(localdata[mc], self.recipecaches[mc])