diff options
| -rw-r--r-- | scripts/lib/checklayer/__init__.py | 21 | ||||
| -rwxr-xr-x | scripts/yocto-check-layer | 6 |
2 files changed, 26 insertions, 1 deletions
diff --git a/scripts/lib/checklayer/__init__.py b/scripts/lib/checklayer/__init__.py index e69a10f452..f91888ccbb 100644 --- a/scripts/lib/checklayer/__init__.py +++ b/scripts/lib/checklayer/__init__.py | |||
| @@ -156,6 +156,27 @@ def _find_layer(depend, layers): | |||
| 156 | return layer | 156 | return layer |
| 157 | return None | 157 | return None |
| 158 | 158 | ||
| 159 | def sanity_check_layers(layers, logger): | ||
| 160 | """ | ||
| 161 | Check that we didn't find duplicate collection names, as the layer that will | ||
| 162 | be used is non-deterministic. The precise check is duplicate collections | ||
| 163 | with different patterns, as the same pattern being repeated won't cause | ||
| 164 | problems. | ||
| 165 | """ | ||
| 166 | import collections | ||
| 167 | |||
| 168 | passed = True | ||
| 169 | seen = collections.defaultdict(set) | ||
| 170 | for layer in layers: | ||
| 171 | for name, data in layer.get("collections", {}).items(): | ||
| 172 | seen[name].add(data["pattern"]) | ||
| 173 | |||
| 174 | for name, patterns in seen.items(): | ||
| 175 | if len(patterns) > 1: | ||
| 176 | passed = False | ||
| 177 | logger.error("Collection %s found multiple times: %s" % (name, ", ".join(patterns))) | ||
| 178 | return passed | ||
| 179 | |||
| 159 | def get_layer_dependencies(layer, layers, logger): | 180 | def get_layer_dependencies(layer, layers, logger): |
| 160 | def recurse_dependencies(depends, layer, layers, logger, ret = []): | 181 | def recurse_dependencies(depends, layer, layers, logger, ret = []): |
| 161 | logger.debug('Processing dependencies %s for layer %s.' % \ | 182 | 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 | |||
| 24 | scriptpath.add_oe_lib_path() | 24 | scriptpath.add_oe_lib_path() |
| 25 | scriptpath.add_bitbake_lib_path() | 25 | scriptpath.add_bitbake_lib_path() |
| 26 | 26 | ||
| 27 | from checklayer import LayerType, detect_layers, add_layers, add_layer_dependencies, get_layer_dependencies, get_signatures, check_bblayers | 27 | from checklayer import LayerType, detect_layers, add_layers, add_layer_dependencies, get_layer_dependencies, get_signatures, check_bblayers, sanity_check_layers |
| 28 | from oeqa.utils.commands import get_bb_vars | 28 | from oeqa.utils.commands import get_bb_vars |
| 29 | 29 | ||
| 30 | PROGNAME = 'yocto-check-layer' | 30 | PROGNAME = 'yocto-check-layer' |
| @@ -119,6 +119,10 @@ def main(): | |||
| 119 | for l in dep_layers: | 119 | for l in dep_layers: |
| 120 | dump_layer_debug(l) | 120 | dump_layer_debug(l) |
| 121 | 121 | ||
| 122 | if not sanity_check_layers(additional_layers + dep_layers, logger): | ||
| 123 | logger.error("Failed layer validation") | ||
| 124 | return 1 | ||
| 125 | |||
| 122 | logger.info("Detected layers:") | 126 | logger.info("Detected layers:") |
| 123 | for layer in layers: | 127 | for layer in layers: |
| 124 | if layer['type'] == LayerType.ERROR_BSP_DISTRO: | 128 | if layer['type'] == LayerType.ERROR_BSP_DISTRO: |
