1
0
mirror of https://git.yoctoproject.org/poky synced 2026-05-30 00:20:08 +00:00

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>
This commit is contained in:
Mark Hatle
2019-08-01 16:36:54 -04:00
committed by Richard Purdie
parent 0ec4c67e52
commit 18b8e2e104
+19 -2
View File
@@ -376,7 +376,7 @@ layerBranches set. If not, they are effectively blank.'''
invalid.append(name)
def _resolve_dependencies(layerbranches, ignores, dependencies, invalid):
def _resolve_dependencies(layerbranches, ignores, dependencies, invalid, processed=None):
for layerbranch in layerbranches:
if ignores and layerbranch.layer.name in ignores:
continue
@@ -388,6 +388,13 @@ layerBranches set. If not, they are effectively blank.'''
if ignores and deplayerbranch.layer.name in ignores:
continue
# Since this is depth first, we need to know what we're currently processing
# in order to avoid infinite recursion on a loop.
if processed and deplayerbranch.layer.name in processed:
# We have found a recursion...
logger.warning('Circular layer dependency found: %s -> %s' % (processed, deplayerbranch.layer.name))
continue
# This little block is why we can't re-use the LayerIndexObj version,
# we must be able to satisfy each dependencies across layer indexes and
# use the layer index order for priority. (r stands for replacement below)
@@ -411,7 +418,17 @@ layerBranches set. If not, they are effectively blank.'''
# New dependency, we need to resolve it now... depth-first
if deplayerbranch.layer.name not in dependencies:
(dependencies, invalid) = _resolve_dependencies([deplayerbranch], ignores, dependencies, invalid)
# Avoid recursion on this branch.
# We copy so we don't end up polluting the depth-first branch with other
# branches. Duplication between individual branches IS expected and
# handled by 'dependencies' processing.
if not processed:
local_processed = []
else:
local_processed = processed.copy()
local_processed.append(deplayerbranch.layer.name)
(dependencies, invalid) = _resolve_dependencies([deplayerbranch], ignores, dependencies, invalid, local_processed)
if deplayerbranch.layer.name not in dependencies:
dependencies[deplayerbranch.layer.name] = [deplayerbranch, layerdependency]