_sstatetests_noauto.py 4.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. #
  2. # Copyright OpenEmbedded Contributors
  3. #
  4. # SPDX-License-Identifier: MIT
  5. #
  6. import os
  7. import shutil
  8. import oeqa.utils.ftools as ftools
  9. from oeqa.utils.commands import runCmd, bitbake, get_bb_var
  10. from oeqa.selftest.cases.sstatetests import SStateBase
  11. class RebuildFromSState(SStateBase):
  12. @classmethod
  13. def setUpClass(self):
  14. super(RebuildFromSState, self).setUpClass()
  15. self.builddir = os.path.join(os.environ.get('BUILDDIR'))
  16. def get_dep_targets(self, primary_targets):
  17. found_targets = []
  18. bitbake("-g " + ' '.join(map(str, primary_targets)))
  19. with open(os.path.join(self.builddir, 'pn-buildlist'), 'r') as pnfile:
  20. found_targets = pnfile.read().splitlines()
  21. return found_targets
  22. def configure_builddir(self, builddir):
  23. os.mkdir(builddir)
  24. self.track_for_cleanup(builddir)
  25. os.mkdir(os.path.join(builddir, 'conf'))
  26. shutil.copyfile(os.path.join(os.environ.get('BUILDDIR'), 'conf/local.conf'), os.path.join(builddir, 'conf/local.conf'))
  27. config = {}
  28. config['default_sstate_dir'] = "SSTATE_DIR ?= \"${TOPDIR}/sstate-cache\""
  29. config['null_sstate_mirrors'] = "SSTATE_MIRRORS = \"\""
  30. config['default_tmp_dir'] = "TMPDIR = \"${TOPDIR}/tmp\""
  31. for key in config:
  32. ftools.append_file(os.path.join(builddir, 'conf/selftest.inc'), config[key])
  33. shutil.copyfile(os.path.join(os.environ.get('BUILDDIR'), 'conf/bblayers.conf'), os.path.join(builddir, 'conf/bblayers.conf'))
  34. try:
  35. shutil.copyfile(os.path.join(os.environ.get('BUILDDIR'), 'conf/auto.conf'), os.path.join(builddir, 'conf/auto.conf'))
  36. except:
  37. pass
  38. def hardlink_tree(self, src, dst):
  39. os.mkdir(dst)
  40. self.track_for_cleanup(dst)
  41. for root, dirs, files in os.walk(src):
  42. if root == src:
  43. continue
  44. os.mkdir(os.path.join(dst, root.split(src)[1][1:]))
  45. for sstate_file in files:
  46. os.link(os.path.join(root, sstate_file), os.path.join(dst, root.split(src)[1][1:], sstate_file))
  47. def run_test_sstate_rebuild(self, primary_targets, relocate=False, rebuild_dependencies=False):
  48. buildA = os.path.join(self.builddir, 'buildA')
  49. if relocate:
  50. buildB = os.path.join(self.builddir, 'buildB')
  51. else:
  52. buildB = buildA
  53. if rebuild_dependencies:
  54. rebuild_targets = self.get_dep_targets(primary_targets)
  55. else:
  56. rebuild_targets = primary_targets
  57. self.configure_builddir(buildA)
  58. runCmd((". %s/oe-init-build-env %s && " % (get_bb_var('COREBASE'), buildA)) + 'bitbake ' + ' '.join(map(str, primary_targets)), shell=True, executable='/bin/bash')
  59. self.hardlink_tree(os.path.join(buildA, 'sstate-cache'), os.path.join(self.builddir, 'sstate-cache-buildA'))
  60. shutil.rmtree(buildA)
  61. failed_rebuild = []
  62. failed_cleansstate = []
  63. for target in rebuild_targets:
  64. self.configure_builddir(buildB)
  65. self.hardlink_tree(os.path.join(self.builddir, 'sstate-cache-buildA'), os.path.join(buildB, 'sstate-cache'))
  66. 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')
  67. if not result_cleansstate.status == 0:
  68. failed_cleansstate.append(target)
  69. shutil.rmtree(buildB)
  70. continue
  71. result_build = runCmd((". %s/oe-init-build-env %s && " % (get_bb_var('COREBASE'), buildB)) + 'bitbake ' + target, ignore_status=True, shell=True, executable='/bin/bash')
  72. if not result_build.status == 0:
  73. failed_rebuild.append(target)
  74. shutil.rmtree(buildB)
  75. self.assertFalse(failed_rebuild, msg="The following recipes have failed to rebuild: %s" % ' '.join(map(str, failed_rebuild)))
  76. 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)))
  77. def test_sstate_relocation(self):
  78. self.run_test_sstate_rebuild(['core-image-weston-sdk'], relocate=True, rebuild_dependencies=True)
  79. def test_sstate_rebuild(self):
  80. self.run_test_sstate_rebuild(['core-image-weston-sdk'], relocate=False, rebuild_dependencies=True)