diff options
author | Denys Dmytriyenko <denis@denix.org> | 2022-01-31 22:16:42 -0500 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2022-02-21 23:37:26 +0000 |
commit | bb4f2bfcecdf2ec9ede6f60f250fde130414c4ef (patch) | |
tree | 516d690d06f4c1406b7866a6a4064a86e0363a91 | |
parent | 66998aeec840f8d8c5e6c84bde0aaa599e8e3c67 (diff) | |
download | poky-bb4f2bfcecdf2ec9ede6f60f250fde130414c4ef.tar.gz |
yocto-check-layer: add ability to perform tests from a global bbclass
This is useful when needing to test layer's recipes, where this special
bbclass can define a global python function that gets called on each
recipe parsing during "bitbake -S none world" signature dump and be able
to fail layer's check accordingly.
First test being added is to detect recipes skipping "installed-vs-shipped"
QA check. As "installed-vs-shipped" is a packaging QA check, it happens very
late in the build process and failing it could mean some potential issues
with packaging, especially when recipe uses BBCLASSEXTEND="nativesdk" and
resulting package is used in an SDK.
In OE-Core failing this QA check leads to an error, but other layers can
suppress it or change it to a warning. Detecting weird packaging problems
with SDKs is quite difficult and time consuming. Also, waiting for the
actual "installed-vs-shipped" packaging QA check to fail means that all
recipes in the layer under test have to run through all standard tasks in
the build chain, equivalent to a multi-hour world-build.
Hence yocto-check-layer takes a shortcut and only detects a mere attempt
at skipping "installed-vs-shipped" QA check in the INSANE_SKIP list during
initial parsing when dumping the signature information for the layer.
(From OE-Core rev: e8baa75535fc888f1d768b23a0140475e832c910)
Signed-off-by: Denys Dmytriyenko <denis@denix.org>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r-- | meta/classes/yocto-check-layer.bbclass | 16 | ||||
-rw-r--r-- | scripts/lib/checklayer/__init__.py | 5 | ||||
-rw-r--r-- | scripts/lib/checklayer/cases/common.py | 15 |
3 files changed, 35 insertions, 1 deletions
diff --git a/meta/classes/yocto-check-layer.bbclass b/meta/classes/yocto-check-layer.bbclass new file mode 100644 index 0000000000..329d3f8edb --- /dev/null +++ b/meta/classes/yocto-check-layer.bbclass | |||
@@ -0,0 +1,16 @@ | |||
1 | # | ||
2 | # This class is used by yocto-check-layer script for additional per-recipe tests | ||
3 | # The first test ensures that the layer has no recipes skipping 'installed-vs-shipped' QA checks | ||
4 | # | ||
5 | |||
6 | WARN_QA:remove = "installed-vs-shipped" | ||
7 | ERROR_QA:append = " installed-vs-shipped" | ||
8 | |||
9 | python () { | ||
10 | packages = set((d.getVar('PACKAGES') or '').split()) | ||
11 | for package in packages: | ||
12 | skip = set((d.getVar('INSANE_SKIP') or "").split() + | ||
13 | (d.getVar('INSANE_SKIP:' + package) or "").split()) | ||
14 | if 'installed-vs-shipped' in skip: | ||
15 | oe.qa.handle_error("installed-vs-shipped", 'Package %s is skipping "installed-vs-shipped" QA test.' % package, d) | ||
16 | } | ||
diff --git a/scripts/lib/checklayer/__init__.py b/scripts/lib/checklayer/__init__.py index f91888ccbb..9713570841 100644 --- a/scripts/lib/checklayer/__init__.py +++ b/scripts/lib/checklayer/__init__.py | |||
@@ -282,7 +282,7 @@ def check_command(error_msg, cmd, cwd=None): | |||
282 | raise RuntimeError(msg) | 282 | raise RuntimeError(msg) |
283 | return output | 283 | return output |
284 | 284 | ||
285 | def get_signatures(builddir, failsafe=False, machine=None): | 285 | def get_signatures(builddir, failsafe=False, machine=None, extravars=None): |
286 | import re | 286 | import re |
287 | 287 | ||
288 | # some recipes needs to be excluded like meta-world-pkgdata | 288 | # some recipes needs to be excluded like meta-world-pkgdata |
@@ -294,6 +294,9 @@ def get_signatures(builddir, failsafe=False, machine=None): | |||
294 | tune2tasks = {} | 294 | tune2tasks = {} |
295 | 295 | ||
296 | cmd = 'BB_ENV_EXTRAWHITE="$BB_ENV_EXTRAWHITE BB_SIGNATURE_HANDLER" BB_SIGNATURE_HANDLER="OEBasicHash" ' | 296 | cmd = 'BB_ENV_EXTRAWHITE="$BB_ENV_EXTRAWHITE BB_SIGNATURE_HANDLER" BB_SIGNATURE_HANDLER="OEBasicHash" ' |
297 | if extravars: | ||
298 | cmd += extravars | ||
299 | cmd += ' ' | ||
297 | if machine: | 300 | if machine: |
298 | cmd += 'MACHINE=%s ' % machine | 301 | cmd += 'MACHINE=%s ' % machine |
299 | cmd += 'bitbake ' | 302 | cmd += 'bitbake ' |
diff --git a/scripts/lib/checklayer/cases/common.py b/scripts/lib/checklayer/cases/common.py index 9f15e05be9..318cda169e 100644 --- a/scripts/lib/checklayer/cases/common.py +++ b/scripts/lib/checklayer/cases/common.py | |||
@@ -54,6 +54,21 @@ class CommonCheckLayer(OECheckLayerTestCase): | |||
54 | ''' | 54 | ''' |
55 | get_signatures(self.td['builddir'], failsafe=False) | 55 | get_signatures(self.td['builddir'], failsafe=False) |
56 | 56 | ||
57 | def test_world_inherit_class(self): | ||
58 | ''' | ||
59 | This also does "bitbake -S none world" along with inheriting "yocto-check-layer" | ||
60 | class, which can do additional per-recipe test cases. | ||
61 | ''' | ||
62 | msg = [] | ||
63 | try: | ||
64 | get_signatures(self.td['builddir'], failsafe=False, machine=None, extravars='BB_ENV_EXTRAWHITE="$BB_ENV_EXTRAWHITE INHERIT" INHERIT="yocto-check-layer"') | ||
65 | except RuntimeError as ex: | ||
66 | msg.append(str(ex)) | ||
67 | if msg: | ||
68 | msg.insert(0, 'Layer %s failed additional checks from yocto-check-layer.bbclass\nSee below log for specific recipe parsing errors:\n' % \ | ||
69 | self.tc.layer['name']) | ||
70 | self.fail('\n'.join(msg)) | ||
71 | |||
57 | def test_signatures(self): | 72 | def test_signatures(self): |
58 | if self.tc.layer['type'] == LayerType.SOFTWARE and \ | 73 | if self.tc.layer['type'] == LayerType.SOFTWARE and \ |
59 | not self.tc.test_software_layer_signatures: | 74 | not self.tc.test_software_layer_signatures: |