diff options
-rw-r--r-- | scripts/lib/compatlayer/__init__.py | 16 | ||||
-rw-r--r-- | scripts/lib/compatlayer/cases/bsp.py | 26 |
2 files changed, 40 insertions, 2 deletions
diff --git a/scripts/lib/compatlayer/__init__.py b/scripts/lib/compatlayer/__init__.py index 0d6f4e9c3b..e35f8c0d32 100644 --- a/scripts/lib/compatlayer/__init__.py +++ b/scripts/lib/compatlayer/__init__.py @@ -233,9 +233,21 @@ def get_signatures(builddir, failsafe=False, machine=None): if failsafe: cmd += '-k ' cmd += '-S none world' - check_command('Generating signatures failed. This might be due to some parse error and/or general layer incompatibilities.', - cmd) sigs_file = os.path.join(builddir, 'locked-sigs.inc') + if os.path.exists(sigs_file): + os.unlink(sigs_file) + try: + check_command('Generating signatures failed. This might be due to some parse error and/or general layer incompatibilities.', + cmd) + except RuntimeError as ex: + if failsafe and os.path.exists(sigs_file): + # Ignore the error here. Most likely some recipes active + # in a world build lack some dependencies. There is a + # separate test_machine_world_build which exposes the + # failure. + pass + else: + raise sig_regex = re.compile("^(?P<task>.*:.*):(?P<hash>.*) .$") tune_regex = re.compile("(^|\s)SIGGEN_LOCKEDSIGS_t-(?P<tune>\S*)\s*=\s*") diff --git a/scripts/lib/compatlayer/cases/bsp.py b/scripts/lib/compatlayer/cases/bsp.py index 90256750af..43efae406f 100644 --- a/scripts/lib/compatlayer/cases/bsp.py +++ b/scripts/lib/compatlayer/cases/bsp.py @@ -25,6 +25,32 @@ class BSPCompatLayer(OECompatLayerTestCase): msg="Layer %s modified machine %s -> %s" % \ (self.tc.layer['name'], self.td['bbvars']['MACHINE'], machine)) + + def test_machine_world(self): + ''' + "bitbake world" is expected to work regardless which machine is selected. + BSP layers sometimes break that by enabling a recipe for a certain machine + without checking whether that recipe actually can be built in the current + distro configuration (for example, OpenGL might not enabled). + + This test iterates over all machines. It would be nicer to instantiate + it once per machine. It merely checks for errors during parse + time. It does not actually attempt to build anything. + ''' + + if not self.td['machines']: + self.skipTest('No machines set with --machines.') + msg = [] + for machine in self.td['machines']: + # In contrast to test_machine_signatures() below, errors are fatal here. + try: + get_signatures(self.td['builddir'], failsafe=False, machine=machine) + except RuntimeError as ex: + msg.append(str(ex)) + if msg: + msg.insert(0, 'The following machines broke a world build:') + self.fail('\n'.join(msg)) + def test_machine_signatures(self): ''' Selecting a machine may only affect the signature of tasks that are specific |