diff options
authorRoss Burton <>2022-01-24 16:25:31 +0000
committerRoss Burton <>2022-01-27 17:26:52 +0000
commit77119d31267471e33ade43309ac9059d70db2103 (patch)
parent244bafbf6f7aa1eaf23cd371230dbc3276d43e2f (diff)
yocto-check-layer: check for duplicate layers when finding layersross/layer
detect_layers() is very greedy and if it recurses into poky or bitbake it will find the test suite layers, such as bitbake/lib/layerindexlib/tests/testdata/layer4. This is a dummy layer which claims to be openembedded-layer, so if the real openembedded-layer is a dependency then layer4 may be used instead, which will cause errors: initially because it's only compatible with Sumo, but later because it doesn't contain any recipes. Add a check that the set of layers we've found doesn't contain any duplicate collection names with different patterns, and abort if that is the case as the test will be non-deterministic. Signed-off-by: Ross Burton <>
2 files changed, 26 insertions, 1 deletions
diff --git a/scripts/lib/checklayer/ b/scripts/lib/checklayer/
index e69a10f452..f91888ccbb 100644
--- a/scripts/lib/checklayer/
+++ b/scripts/lib/checklayer/
@@ -156,6 +156,27 @@ def _find_layer(depend, layers):
return layer
return None
+def sanity_check_layers(layers, logger):
+ """
+ Check that we didn't find duplicate collection names, as the layer that will
+ be used is non-deterministic. The precise check is duplicate collections
+ with different patterns, as the same pattern being repeated won't cause
+ problems.
+ """
+ import collections
+ passed = True
+ seen = collections.defaultdict(set)
+ for layer in layers:
+ for name, data in layer.get("collections", {}).items():
+ seen[name].add(data["pattern"])
+ for name, patterns in seen.items():
+ if len(patterns) > 1:
+ passed = False
+ logger.error("Collection %s found multiple times: %s" % (name, ", ".join(patterns)))
+ return passed
def get_layer_dependencies(layer, layers, logger):
def recurse_dependencies(depends, layer, layers, logger, ret = []):
logger.debug('Processing dependencies %s for layer %s.' % \
diff --git a/scripts/yocto-check-layer b/scripts/yocto-check-layer
index f3cf139d8a..0e5b75b1f7 100755
--- a/scripts/yocto-check-layer
+++ b/scripts/yocto-check-layer
@@ -24,7 +24,7 @@ import scriptpath
-from checklayer import LayerType, detect_layers, add_layers, add_layer_dependencies, get_layer_dependencies, get_signatures, check_bblayers
+from checklayer import LayerType, detect_layers, add_layers, add_layer_dependencies, get_layer_dependencies, get_signatures, check_bblayers, sanity_check_layers
from oeqa.utils.commands import get_bb_vars
PROGNAME = 'yocto-check-layer'
@@ -119,6 +119,10 @@ def main():
for l in dep_layers:
+ if not sanity_check_layers(additional_layers + dep_layers, logger):
+ logger.error("Failed layer validation")
+ return 1
+"Detected layers:")
for layer in layers:
if layer['type'] == LayerType.ERROR_BSP_DISTRO: