summaryrefslogtreecommitdiffstats
path: root/bitbake/lib
diff options
context:
space:
mode:
authorMark Hatle <mark.hatle@windriver.com>2019-08-01 16:36:54 -0400
committerRichard Purdie <richard.purdie@linuxfoundation.org>2019-08-13 09:38:26 +0100
commit18b8e2e10494d3b0e18743a1bf9e99038da4229c (patch)
treedc600ae57b8aaab79b38c308611de12c1b88e3dd /bitbake/lib
parent0ec4c67e52f2bba18c818370ac064c240d201a5b (diff)
downloadpoky-18b8e2e10494d3b0e18743a1bf9e99038da4229c.tar.gz
bitbake: layerindexlib: Fix parsing of recursive layer dependencies
[YOCTO #13447] When running bitbake-layers layerindex-fetch from 'master', there is a circular dependency between meta-oe and meta-python. This triggered a maximum recursion depth exception. To fix the exception, as we walk down a branch (depth first search), we track the layers we've already seen. If we are about to recurse into a layer we've already seen we report a warning and then stop recursion. (Bitbake rev: d6155d095513be3f500d089c4ed4c4b89949d560) Signed-off-by: Mark Hatle <mark.hatle@windriver.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib')
-rw-r--r--bitbake/lib/layerindexlib/__init__.py21
1 files changed, 19 insertions, 2 deletions
diff --git a/bitbake/lib/layerindexlib/__init__.py b/bitbake/lib/layerindexlib/__init__.py
index d231cf6a99..77196b408f 100644
--- a/bitbake/lib/layerindexlib/__init__.py
+++ b/bitbake/lib/layerindexlib/__init__.py
@@ -376,7 +376,7 @@ layerBranches set. If not, they are effectively blank.'''
376 invalid.append(name) 376 invalid.append(name)
377 377
378 378
379 def _resolve_dependencies(layerbranches, ignores, dependencies, invalid): 379 def _resolve_dependencies(layerbranches, ignores, dependencies, invalid, processed=None):
380 for layerbranch in layerbranches: 380 for layerbranch in layerbranches:
381 if ignores and layerbranch.layer.name in ignores: 381 if ignores and layerbranch.layer.name in ignores:
382 continue 382 continue
@@ -388,6 +388,13 @@ layerBranches set. If not, they are effectively blank.'''
388 if ignores and deplayerbranch.layer.name in ignores: 388 if ignores and deplayerbranch.layer.name in ignores:
389 continue 389 continue
390 390
391 # Since this is depth first, we need to know what we're currently processing
392 # in order to avoid infinite recursion on a loop.
393 if processed and deplayerbranch.layer.name in processed:
394 # We have found a recursion...
395 logger.warning('Circular layer dependency found: %s -> %s' % (processed, deplayerbranch.layer.name))
396 continue
397
391 # This little block is why we can't re-use the LayerIndexObj version, 398 # This little block is why we can't re-use the LayerIndexObj version,
392 # we must be able to satisfy each dependencies across layer indexes and 399 # we must be able to satisfy each dependencies across layer indexes and
393 # use the layer index order for priority. (r stands for replacement below) 400 # use the layer index order for priority. (r stands for replacement below)
@@ -411,7 +418,17 @@ layerBranches set. If not, they are effectively blank.'''
411 418
412 # New dependency, we need to resolve it now... depth-first 419 # New dependency, we need to resolve it now... depth-first
413 if deplayerbranch.layer.name not in dependencies: 420 if deplayerbranch.layer.name not in dependencies:
414 (dependencies, invalid) = _resolve_dependencies([deplayerbranch], ignores, dependencies, invalid) 421 # Avoid recursion on this branch.
422 # We copy so we don't end up polluting the depth-first branch with other
423 # branches. Duplication between individual branches IS expected and
424 # handled by 'dependencies' processing.
425 if not processed:
426 local_processed = []
427 else:
428 local_processed = processed.copy()
429 local_processed.append(deplayerbranch.layer.name)
430
431 (dependencies, invalid) = _resolve_dependencies([deplayerbranch], ignores, dependencies, invalid, local_processed)
415 432
416 if deplayerbranch.layer.name not in dependencies: 433 if deplayerbranch.layer.name not in dependencies:
417 dependencies[deplayerbranch.layer.name] = [deplayerbranch, layerdependency] 434 dependencies[deplayerbranch.layer.name] = [deplayerbranch, layerdependency]