diff options
author | Mark Hatle <mark.hatle@windriver.com> | 2019-08-01 16:36:54 -0400 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2019-08-13 09:38:26 +0100 |
commit | 18b8e2e10494d3b0e18743a1bf9e99038da4229c (patch) | |
tree | dc600ae57b8aaab79b38c308611de12c1b88e3dd /bitbake | |
parent | 0ec4c67e52f2bba18c818370ac064c240d201a5b (diff) | |
download | openembedded-core-contrib-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')
-rw-r--r-- | bitbake/lib/layerindexlib/__init__.py | 21 |
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.''' 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] |