summaryrefslogtreecommitdiffstats
path: root/scripts/yocto-check-layer
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/yocto-check-layer')
-rwxr-xr-xscripts/yocto-check-layer53
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
24scriptpath.add_oe_lib_path() 24scriptpath.add_oe_lib_path()
25scriptpath.add_bitbake_lib_path() 25scriptpath.add_bitbake_lib_path()
26 26
27from checklayer import LayerType, detect_layers, add_layers, add_layer_dependencies, get_signatures, check_bblayers 27from checklayer import LayerType, detect_layers, add_layers, add_layer_dependencies, get_layer_dependencies, get_signatures, check_bblayers, sanity_check_layers
28from oeqa.utils.commands import get_bb_vars 28from oeqa.utils.commands import get_bb_vars
29 29
30PROGNAME = 'yocto-check-layer' 30PROGNAME = 'yocto-check-layer'
@@ -35,12 +35,19 @@ logger = scriptutils.logger_create(PROGNAME, stream=sys.stdout)
35def test_layer(td, layer, test_software_layer_signatures): 35def 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
45def 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
44def main(): 51def 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)'