summaryrefslogtreecommitdiff
path: root/poky/bitbake/lib/bb
diff options
context:
space:
mode:
Diffstat (limited to 'poky/bitbake/lib/bb')
-rw-r--r--poky/bitbake/lib/bb/cooker.py53
-rw-r--r--poky/bitbake/lib/bb/runqueue.py31
-rw-r--r--poky/bitbake/lib/bb/siggen.py2
3 files changed, 54 insertions, 32 deletions
diff --git a/poky/bitbake/lib/bb/cooker.py b/poky/bitbake/lib/bb/cooker.py
index db52964c3a..adc41014e6 100644
--- a/poky/bitbake/lib/bb/cooker.py
+++ b/poky/bitbake/lib/bb/cooker.py
@@ -641,35 +641,30 @@ class BBCooker:
# No need to do check providers if there are no mcdeps or not an mc build
- 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
+ if len(self.multiconfigs) > 1:
+ seen = set()
+ new = True
+ # Make sure we can provide the multiconfig dependency
+ while new:
+ mcdeps = set()
+ # Add unresolved first, so we can get multiconfig indirect dependencies on time
+ for mc in self.multiconfigs:
+ taskdata[mc].add_unresolved(localdata[mc], self.recipecaches[mc])
+ mcdeps |= set(taskdata[mc].get_mcdepends())
+ 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])
diff --git a/poky/bitbake/lib/bb/runqueue.py b/poky/bitbake/lib/bb/runqueue.py
index 4d5d876797..383c183235 100644
--- a/poky/bitbake/lib/bb/runqueue.py
+++ b/poky/bitbake/lib/bb/runqueue.py
@@ -49,6 +49,11 @@ def fn_from_tid(tid):
def taskname_from_tid(tid):
return tid.rsplit(":", 1)[1]
+def mc_from_tid(tid):
+ if tid.startswith('multiconfig:'):
+ return tid.split(':')[1]
+ return ""
+
def split_tid(tid):
(mc, fn, taskname, _) = split_tid_mcfn(tid)
return (mc, fn, taskname)
@@ -405,6 +410,9 @@ class RunQueueData:
explored_deps = {}
msgs = []
+ class TooManyLoops(Exception):
+ pass
+
def chain_reorder(chain):
"""
Reorder a dependency chain so the lowest task id is first
@@ -457,7 +465,7 @@ class RunQueueData:
msgs.append("\n")
if len(valid_chains) > 10:
msgs.append("Aborted dependency loops search after 10 matches.\n")
- return msgs
+ raise TooManyLoops
continue
scan = False
if revdep not in explored_deps:
@@ -476,8 +484,11 @@ class RunQueueData:
explored_deps[tid] = total_deps
- for task in tasks:
- find_chains(task, [])
+ try:
+ for task in tasks:
+ find_chains(task, [])
+ except TooManyLoops:
+ pass
return msgs
@@ -2073,10 +2084,23 @@ class RunQueueExecuteTasks(RunQueueExecute):
return True
+ def filtermcdeps(self, task, deps):
+ ret = set()
+ mainmc = mc_from_tid(task)
+ for dep in deps:
+ mc = mc_from_tid(dep)
+ if mc != mainmc:
+ continue
+ ret.add(dep)
+ return ret
+
+ # We filter out multiconfig dependencies from taskdepdata we pass to the tasks
+ # as most code can't handle them
def build_taskdepdata(self, task):
taskdepdata = {}
next = self.rqdata.runtaskentries[task].depends
next.add(task)
+ next = self.filtermcdeps(task, next)
while next:
additional = []
for revdep in next:
@@ -2086,6 +2110,7 @@ class RunQueueExecuteTasks(RunQueueExecute):
provides = self.rqdata.dataCaches[mc].fn_provides[taskfn]
taskhash = self.rqdata.runtaskentries[revdep].hash
taskdepdata[revdep] = [pn, taskname, fn, deps, provides, taskhash]
+ deps = self.filtermcdeps(task, deps)
for revdep2 in deps:
if revdep2 not in taskdepdata:
additional.append(revdep2)
diff --git a/poky/bitbake/lib/bb/siggen.py b/poky/bitbake/lib/bb/siggen.py
index fdbb2a3998..352dcab853 100644
--- a/poky/bitbake/lib/bb/siggen.py
+++ b/poky/bitbake/lib/bb/siggen.py
@@ -181,6 +181,8 @@ class SignatureGeneratorBasic(SignatureGenerator):
depmc = pkgname.split(':')[1]
if mc != depmc:
continue
+ if dep.startswith("multiconfig:") and not mc:
+ continue
depname = dataCache.pkg_fn[pkgname]
if not self.rundep_check(fn, recipename, task, dep, depname, dataCache):
continue