diff options
Diffstat (limited to 'scripts/yocto-check-layer')
| -rwxr-xr-x | scripts/yocto-check-layer | 53 |
1 files changed, 43 insertions, 10 deletions
diff --git a/scripts/yocto-check-layer b/scripts/yocto-check-layer index b7c83c8b54..8c8b4dbcad 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_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' |
| @@ -35,12 +35,19 @@ logger = scriptutils.logger_create(PROGNAME, stream=sys.stdout) | |||
| 35 | def test_layer(td, layer, test_software_layer_signatures): | 35 | def test_layer(td, layer, test_software_layer_signatures): |
| 36 | from checklayer.context import CheckLayerTestContext | 36 | from checklayer.context import CheckLayerTestContext |
| 37 | logger.info("Starting to analyze: %s" % layer['name']) | 37 | logger.info("Starting to analyze: %s" % layer['name']) |
| 38 | logger.info('Distro: %s' % td['bbvars']["DISTRO"]) | ||
| 38 | logger.info("----------------------------------------------------------------------") | 39 | logger.info("----------------------------------------------------------------------") |
| 39 | 40 | ||
| 40 | tc = CheckLayerTestContext(td=td, logger=logger, layer=layer, test_software_layer_signatures=test_software_layer_signatures) | 41 | tc = CheckLayerTestContext(td=td, logger=logger, layer=layer, test_software_layer_signatures=test_software_layer_signatures) |
| 41 | tc.loadTests(CASES_PATHS) | 42 | tc.loadTests(CASES_PATHS) |
| 42 | return tc.runTests() | 43 | return tc.runTests() |
| 43 | 44 | ||
| 45 | def dump_layer_debug(layer): | ||
| 46 | logger.debug("Found layer %s (%s)" % (layer["name"], layer["path"])) | ||
| 47 | collections = layer.get("collections", {}) | ||
| 48 | if collections: | ||
| 49 | logger.debug("%s collections: %s" % (layer["name"], ", ".join(collections))) | ||
| 50 | |||
| 44 | def main(): | 51 | def main(): |
| 45 | parser = argparse.ArgumentParser( | 52 | parser = argparse.ArgumentParser( |
| 46 | description="Yocto Project layer checking tool", | 53 | description="Yocto Project layer checking tool", |
| @@ -51,6 +58,8 @@ def main(): | |||
| 51 | help='File to output log (optional)', action='store') | 58 | help='File to output log (optional)', action='store') |
| 52 | parser.add_argument('--dependency', nargs="+", | 59 | parser.add_argument('--dependency', nargs="+", |
| 53 | help='Layers to process for dependencies', action='store') | 60 | help='Layers to process for dependencies', action='store') |
| 61 | parser.add_argument('--no-auto-dependency', help='Disable automatic testing of dependencies', | ||
| 62 | action='store_true') | ||
| 54 | parser.add_argument('--machines', nargs="+", | 63 | parser.add_argument('--machines', nargs="+", |
| 55 | help='List of MACHINEs to be used during testing', action='store') | 64 | help='List of MACHINEs to be used during testing', action='store') |
| 56 | parser.add_argument('--additional-layers', nargs="+", | 65 | parser.add_argument('--additional-layers', nargs="+", |
| @@ -104,6 +113,17 @@ def main(): | |||
| 104 | else: | 113 | else: |
| 105 | dep_layers = layers | 114 | dep_layers = layers |
| 106 | 115 | ||
| 116 | logger.debug("Found additional layers:") | ||
| 117 | for l in additional_layers: | ||
| 118 | dump_layer_debug(l) | ||
| 119 | logger.debug("Found dependency layers:") | ||
| 120 | for l in dep_layers: | ||
| 121 | dump_layer_debug(l) | ||
| 122 | |||
| 123 | if not sanity_check_layers(additional_layers + dep_layers, logger): | ||
| 124 | logger.error("Failed layer validation") | ||
| 125 | return 1 | ||
| 126 | |||
| 107 | logger.info("Detected layers:") | 127 | logger.info("Detected layers:") |
| 108 | for layer in layers: | 128 | for layer in layers: |
| 109 | if layer['type'] == LayerType.ERROR_BSP_DISTRO: | 129 | if layer['type'] == LayerType.ERROR_BSP_DISTRO: |
| @@ -112,7 +132,7 @@ def main(): | |||
| 112 | % layer['name']) | 132 | % layer['name']) |
| 113 | layers.remove(layer) | 133 | layers.remove(layer) |
| 114 | elif layer['type'] == LayerType.ERROR_NO_LAYER_CONF: | 134 | elif layer['type'] == LayerType.ERROR_NO_LAYER_CONF: |
| 115 | logger.error("%s: Don't have conf/layer.conf file."\ | 135 | logger.info("%s: Doesn't have conf/layer.conf file, so ignoring"\ |
| 116 | % layer['name']) | 136 | % layer['name']) |
| 117 | layers.remove(layer) | 137 | layers.remove(layer) |
| 118 | else: | 138 | else: |
| @@ -121,6 +141,21 @@ def main(): | |||
| 121 | if not layers: | 141 | if not layers: |
| 122 | return 1 | 142 | return 1 |
| 123 | 143 | ||
| 144 | # Find all dependencies, and get them checked too | ||
| 145 | if not args.no_auto_dependency: | ||
| 146 | depends = [] | ||
| 147 | for layer in layers: | ||
| 148 | layer_depends = get_layer_dependencies(layer, dep_layers, logger) | ||
| 149 | if layer_depends: | ||
| 150 | for d in layer_depends: | ||
| 151 | if d not in depends: | ||
| 152 | depends.append(d) | ||
| 153 | |||
| 154 | for d in depends: | ||
| 155 | if d not in layers: | ||
| 156 | logger.info("Adding %s to the list of layers to test, as a dependency", d['name']) | ||
| 157 | layers.append(d) | ||
| 158 | |||
| 124 | shutil.copyfile(bblayersconf, bblayersconf + '.backup') | 159 | shutil.copyfile(bblayersconf, bblayersconf + '.backup') |
| 125 | def cleanup_bblayers(signum, frame): | 160 | def cleanup_bblayers(signum, frame): |
| 126 | shutil.copyfile(bblayersconf + '.backup', bblayersconf) | 161 | shutil.copyfile(bblayersconf + '.backup', bblayersconf) |
| @@ -134,11 +169,13 @@ def main(): | |||
| 134 | 169 | ||
| 135 | layers_tested = 0 | 170 | layers_tested = 0 |
| 136 | for layer in layers: | 171 | for layer in layers: |
| 137 | if layer['type'] == LayerType.ERROR_NO_LAYER_CONF or \ | 172 | if layer['type'] in (LayerType.ERROR_NO_LAYER_CONF, LayerType.ERROR_BSP_DISTRO): |
| 138 | layer['type'] == LayerType.ERROR_BSP_DISTRO: | ||
| 139 | continue | 173 | continue |
| 140 | 174 | ||
| 141 | if check_bblayers(bblayersconf, layer['path'], logger): | 175 | # Reset to a clean backup copy for each run |
| 176 | shutil.copyfile(bblayersconf + '.backup', bblayersconf) | ||
| 177 | |||
| 178 | if layer['type'] not in (LayerType.CORE, ) and check_bblayers(bblayersconf, layer['path'], logger): | ||
| 142 | logger.info("%s already in %s. To capture initial signatures, layer under test should not present " | 179 | logger.info("%s already in %s. To capture initial signatures, layer under test should not present " |
| 143 | "in BBLAYERS. Please remove %s from BBLAYERS." % (layer['name'], bblayersconf, layer['name'])) | 180 | "in BBLAYERS. Please remove %s from BBLAYERS." % (layer['name'], bblayersconf, layer['name'])) |
| 144 | results[layer['name']] = None | 181 | results[layer['name']] = None |
| @@ -149,17 +186,13 @@ def main(): | |||
| 149 | logger.info("Setting up for %s(%s), %s" % (layer['name'], layer['type'], | 186 | logger.info("Setting up for %s(%s), %s" % (layer['name'], layer['type'], |
| 150 | layer['path'])) | 187 | layer['path'])) |
| 151 | 188 | ||
| 152 | shutil.copyfile(bblayersconf + '.backup', bblayersconf) | ||
| 153 | |||
| 154 | missing_dependencies = not add_layer_dependencies(bblayersconf, layer, dep_layers, logger) | 189 | missing_dependencies = not add_layer_dependencies(bblayersconf, layer, dep_layers, logger) |
| 155 | if not missing_dependencies: | 190 | if not missing_dependencies: |
| 156 | for additional_layer in additional_layers: | 191 | for additional_layer in additional_layers: |
| 157 | if not add_layer_dependencies(bblayersconf, additional_layer, dep_layers, logger): | 192 | if not add_layer_dependencies(bblayersconf, additional_layer, dep_layers, logger): |
| 158 | missing_dependencies = True | 193 | missing_dependencies = True |
| 159 | break | 194 | break |
| 160 | if not add_layer_dependencies(bblayersconf, layer, dep_layers, logger) or \ | 195 | if missing_dependencies: |
| 161 | any(map(lambda additional_layer: not add_layer_dependencies(bblayersconf, additional_layer, dep_layers, logger), | ||
| 162 | additional_layers)): | ||
| 163 | logger.info('Skipping %s due to missing dependencies.' % layer['name']) | 196 | logger.info('Skipping %s due to missing dependencies.' % layer['name']) |
| 164 | results[layer['name']] = None | 197 | results[layer['name']] = None |
| 165 | results_status[layer['name']] = 'SKIPPED (Missing dependencies)' | 198 | results_status[layer['name']] = 'SKIPPED (Missing dependencies)' |
