Brad Bishop | c342db3 | 2019-05-15 21:57:59 -0400 | [diff] [blame] | 1 | # |
Patrick Williams | 92b42cb | 2022-09-03 06:53:57 -0500 | [diff] [blame^] | 2 | # Copyright OpenEmbedded Contributors |
| 3 | # |
Brad Bishop | c342db3 | 2019-05-15 21:57:59 -0400 | [diff] [blame] | 4 | # SPDX-License-Identifier: MIT |
| 5 | # |
| 6 | |
Brad Bishop | d7bf8c1 | 2018-02-25 22:55:05 -0500 | [diff] [blame] | 7 | import os |
| 8 | import shutil |
| 9 | |
| 10 | import oeqa.utils.ftools as ftools |
Patrick Williams | 4585273 | 2022-04-02 08:58:32 -0500 | [diff] [blame] | 11 | from oeqa.utils.commands import runCmd, bitbake, get_bb_var |
Brad Bishop | d7bf8c1 | 2018-02-25 22:55:05 -0500 | [diff] [blame] | 12 | from oeqa.selftest.cases.sstate import SStateBase |
| 13 | |
| 14 | |
| 15 | class RebuildFromSState(SStateBase): |
| 16 | |
| 17 | @classmethod |
| 18 | def setUpClass(self): |
| 19 | super(RebuildFromSState, self).setUpClass() |
| 20 | self.builddir = os.path.join(os.environ.get('BUILDDIR')) |
| 21 | |
| 22 | def get_dep_targets(self, primary_targets): |
| 23 | found_targets = [] |
| 24 | bitbake("-g " + ' '.join(map(str, primary_targets))) |
| 25 | with open(os.path.join(self.builddir, 'pn-buildlist'), 'r') as pnfile: |
| 26 | found_targets = pnfile.read().splitlines() |
| 27 | return found_targets |
| 28 | |
| 29 | def configure_builddir(self, builddir): |
| 30 | os.mkdir(builddir) |
| 31 | self.track_for_cleanup(builddir) |
| 32 | os.mkdir(os.path.join(builddir, 'conf')) |
| 33 | shutil.copyfile(os.path.join(os.environ.get('BUILDDIR'), 'conf/local.conf'), os.path.join(builddir, 'conf/local.conf')) |
| 34 | config = {} |
| 35 | config['default_sstate_dir'] = "SSTATE_DIR ?= \"${TOPDIR}/sstate-cache\"" |
| 36 | config['null_sstate_mirrors'] = "SSTATE_MIRRORS = \"\"" |
| 37 | config['default_tmp_dir'] = "TMPDIR = \"${TOPDIR}/tmp\"" |
| 38 | for key in config: |
| 39 | ftools.append_file(os.path.join(builddir, 'conf/selftest.inc'), config[key]) |
| 40 | shutil.copyfile(os.path.join(os.environ.get('BUILDDIR'), 'conf/bblayers.conf'), os.path.join(builddir, 'conf/bblayers.conf')) |
| 41 | try: |
| 42 | shutil.copyfile(os.path.join(os.environ.get('BUILDDIR'), 'conf/auto.conf'), os.path.join(builddir, 'conf/auto.conf')) |
| 43 | except: |
| 44 | pass |
| 45 | |
| 46 | def hardlink_tree(self, src, dst): |
| 47 | os.mkdir(dst) |
| 48 | self.track_for_cleanup(dst) |
| 49 | for root, dirs, files in os.walk(src): |
| 50 | if root == src: |
| 51 | continue |
| 52 | os.mkdir(os.path.join(dst, root.split(src)[1][1:])) |
| 53 | for sstate_file in files: |
| 54 | os.link(os.path.join(root, sstate_file), os.path.join(dst, root.split(src)[1][1:], sstate_file)) |
| 55 | |
| 56 | def run_test_sstate_rebuild(self, primary_targets, relocate=False, rebuild_dependencies=False): |
| 57 | buildA = os.path.join(self.builddir, 'buildA') |
| 58 | if relocate: |
| 59 | buildB = os.path.join(self.builddir, 'buildB') |
| 60 | else: |
| 61 | buildB = buildA |
| 62 | |
| 63 | if rebuild_dependencies: |
| 64 | rebuild_targets = self.get_dep_targets(primary_targets) |
| 65 | else: |
| 66 | rebuild_targets = primary_targets |
| 67 | |
| 68 | self.configure_builddir(buildA) |
| 69 | runCmd((". %s/oe-init-build-env %s && " % (get_bb_var('COREBASE'), buildA)) + 'bitbake ' + ' '.join(map(str, primary_targets)), shell=True, executable='/bin/bash') |
| 70 | self.hardlink_tree(os.path.join(buildA, 'sstate-cache'), os.path.join(self.builddir, 'sstate-cache-buildA')) |
| 71 | shutil.rmtree(buildA) |
| 72 | |
| 73 | failed_rebuild = [] |
| 74 | failed_cleansstate = [] |
| 75 | for target in rebuild_targets: |
| 76 | self.configure_builddir(buildB) |
| 77 | self.hardlink_tree(os.path.join(self.builddir, 'sstate-cache-buildA'), os.path.join(buildB, 'sstate-cache')) |
| 78 | |
| 79 | result_cleansstate = runCmd((". %s/oe-init-build-env %s && " % (get_bb_var('COREBASE'), buildB)) + 'bitbake -ccleansstate ' + target, ignore_status=True, shell=True, executable='/bin/bash') |
| 80 | if not result_cleansstate.status == 0: |
| 81 | failed_cleansstate.append(target) |
| 82 | shutil.rmtree(buildB) |
| 83 | continue |
| 84 | |
| 85 | result_build = runCmd((". %s/oe-init-build-env %s && " % (get_bb_var('COREBASE'), buildB)) + 'bitbake ' + target, ignore_status=True, shell=True, executable='/bin/bash') |
| 86 | if not result_build.status == 0: |
| 87 | failed_rebuild.append(target) |
| 88 | |
| 89 | shutil.rmtree(buildB) |
| 90 | |
| 91 | self.assertFalse(failed_rebuild, msg="The following recipes have failed to rebuild: %s" % ' '.join(map(str, failed_rebuild))) |
| 92 | self.assertFalse(failed_cleansstate, msg="The following recipes have failed cleansstate(all others have passed both cleansstate and rebuild from sstate tests): %s" % ' '.join(map(str, failed_cleansstate))) |
| 93 | |
| 94 | def test_sstate_relocation(self): |
Andrew Geissler | c926e17 | 2021-05-07 16:11:35 -0500 | [diff] [blame] | 95 | self.run_test_sstate_rebuild(['core-image-weston-sdk'], relocate=True, rebuild_dependencies=True) |
Brad Bishop | d7bf8c1 | 2018-02-25 22:55:05 -0500 | [diff] [blame] | 96 | |
| 97 | def test_sstate_rebuild(self): |
Andrew Geissler | c926e17 | 2021-05-07 16:11:35 -0500 | [diff] [blame] | 98 | self.run_test_sstate_rebuild(['core-image-weston-sdk'], relocate=False, rebuild_dependencies=True) |