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:
committed by
Richard Purdie
parent
0ec4c67e52
commit
18b8e2e104
@@ -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]
|
||||
|
||||
Reference in New Issue
Block a user