1
0
mirror of https://git.yoctoproject.org/poky synced 2026-05-30 12:29:55 +00:00

oeqa: reproducible: Do two clean builds

Perform two clean builds without sstate instead of one partial rebuild
with sstate and one clean build without. There are some classes of
reproducibility issues that this solves, and while we would like to
resolve them in the long term the direction to do so is not currently
clear.

(From OE-Core rev: e97c529bfa4e1d0038ea44f15ee3298003daf981)

Signed-off-by: Joshua Watt <JPEWhacker@gmail.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Joshua Watt
2019-08-29 10:31:06 -05:00
committed by Richard Purdie
parent dc04d6cdc2
commit 7e01f2fdad
+32 -24
View File
@@ -123,45 +123,53 @@ class ReproducibleTests(OESelftestTestCase):
def test_reproducible_builds(self): def test_reproducible_builds(self):
capture_vars = ['DEPLOY_DIR_' + c.upper() for c in self.package_classes] capture_vars = ['DEPLOY_DIR_' + c.upper() for c in self.package_classes]
common_config = textwrap.dedent('''\
INHERIT += "reproducible_build"
PACKAGE_CLASSES = "%s"
''') % (' '.join('package_%s' % c for c in self.package_classes))
# Do an initial build. It's acceptable for this build to use sstate
self.write_config(common_config)
vars_reference = get_bb_vars(capture_vars)
bitbake(' '.join(self.images))
# Build native utilities # Build native utilities
self.write_config('')
bitbake("diffutils-native -c addto_recipe_sysroot") bitbake("diffutils-native -c addto_recipe_sysroot")
diffutils_sysroot = get_bb_var("RECIPE_SYSROOT_NATIVE", "diffutils-native") diffutils_sysroot = get_bb_var("RECIPE_SYSROOT_NATIVE", "diffutils-native")
reproducible_tmp = os.path.join(self.topdir, 'reproducible', 'tmp') # Reproducible builds should not pull from sstate or mirrors, but
if os.path.exists(reproducible_tmp): # sharing DL_DIR is fine
bb.utils.remove(reproducible_tmp, recurse=True) common_config = textwrap.dedent('''\
INHERIT += "reproducible_build"
# Perform another build. This build should *not* share sstate or pull PACKAGE_CLASSES = "%s"
# from any mirrors, but sharing a DL_DIR is fine
self.write_config((textwrap.dedent('''\
TMPDIR = "%s"
SSTATE_DIR = "${TMPDIR}/sstate" SSTATE_DIR = "${TMPDIR}/sstate"
SSTATE_MIRROR = "" SSTATE_MIRROR = ""
''') % reproducible_tmp) + common_config) ''') % (' '.join('package_%s' % c for c in self.package_classes))
vars_test = get_bb_vars(capture_vars)
# Perform a build.
reproducibleA_tmp = os.path.join(self.topdir, 'reproducibleA', 'tmp')
if os.path.exists(reproducibleA_tmp):
bb.utils.remove(reproducibleA_tmp, recurse=True)
self.write_config((textwrap.dedent('''\
TMPDIR = "%s"
''') % reproducibleA_tmp) + common_config)
vars_A = get_bb_vars(capture_vars)
bitbake(' '.join(self.images)) bitbake(' '.join(self.images))
# NOTE: The temp directory from the reproducible build is purposely # Perform another build.
reproducibleB_tmp = os.path.join(self.topdir, 'reproducibleB', 'tmp')
if os.path.exists(reproducibleB_tmp):
bb.utils.remove(reproducibleB_tmp, recurse=True)
self.write_config((textwrap.dedent('''\
TMPDIR = "%s"
''') % reproducibleB_tmp) + common_config)
vars_B = get_bb_vars(capture_vars)
bitbake(' '.join(self.images))
# NOTE: The temp directories from the reproducible build are purposely
# kept after the build so it can be diffed for debugging. # kept after the build so it can be diffed for debugging.
for c in self.package_classes: for c in self.package_classes:
with self.subTest(package_class=c): with self.subTest(package_class=c):
package_class = 'package_' + c package_class = 'package_' + c
deploy_reference = vars_reference['DEPLOY_DIR_' + c.upper()] deploy_A = vars_A['DEPLOY_DIR_' + c.upper()]
deploy_test = vars_test['DEPLOY_DIR_' + c.upper()] deploy_B = vars_B['DEPLOY_DIR_' + c.upper()]
result = self.compare_packages(deploy_reference, deploy_test, diffutils_sysroot) result = self.compare_packages(deploy_A, deploy_B, diffutils_sysroot)
self.logger.info('Reproducibility summary for %s: %s' % (c, result)) self.logger.info('Reproducibility summary for %s: %s' % (c, result))