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