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)' |