blob: 5f1c8df2d49a647b2e645720c7a4d75322ab971a [file] [log] [blame]
Brad Bishopc342db32019-05-15 21:57:59 -04001#
Patrick Williams92b42cb2022-09-03 06:53:57 -05002# Copyright OpenEmbedded Contributors
3#
Brad Bishopc342db32019-05-15 21:57:59 -04004# SPDX-License-Identifier: MIT
5#
6
Brad Bishopd7bf8c12018-02-25 22:55:05 -05007import os
8import shutil
9
10import oeqa.utils.ftools as ftools
Patrick Williams45852732022-04-02 08:58:32 -050011from oeqa.utils.commands import runCmd, bitbake, get_bb_var
Brad Bishopd7bf8c12018-02-25 22:55:05 -050012from oeqa.selftest.cases.sstate import SStateBase
13
14
15class 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 Geisslerc926e172021-05-07 16:11:35 -050095 self.run_test_sstate_rebuild(['core-image-weston-sdk'], relocate=True, rebuild_dependencies=True)
Brad Bishopd7bf8c12018-02-25 22:55:05 -050096
97 def test_sstate_rebuild(self):
Andrew Geisslerc926e172021-05-07 16:11:35 -050098 self.run_test_sstate_rebuild(['core-image-weston-sdk'], relocate=False, rebuild_dependencies=True)