diff options
Diffstat (limited to 'classes/swupd-image.bbclass')
-rw-r--r-- | classes/swupd-image.bbclass | 186 |
1 files changed, 20 insertions, 166 deletions
diff --git a/classes/swupd-image.bbclass b/classes/swupd-image.bbclass index 67a9316..bc23cce 100644 --- a/classes/swupd-image.bbclass +++ b/classes/swupd-image.bbclass @@ -35,9 +35,7 @@ DEPLOY_DIR_SWUPD = "${DEPLOY_DIR}/swupd/${MACHINE}/${SWUPD_IMAGE_PN}" # User configurable variables to disable all swupd processing or deltapack # generation. SWUPD_GENERATE ??= "1" -SWUPD_DELTAPACKS ??= "1" -# Create delta packs for N versions back — default 2 -SWUPD_N_DELTAPACK ??= "2" +SWUPD_DELTAPACK_VERSIONS ??= "" SWUPD_LOG_FN ??= "bbdebug 1" @@ -79,12 +77,6 @@ python () { megarootfs = megarootfs.replace('/' + pn +'/', '/bundle-%s-mega/' % (pn_base or pn)) d.setVar('MEGA_IMAGE_ROOTFS', megarootfs) - # We need to use a custom manifest filename for stage_swupd_inputs so that - # the generated sstate can be used to fetch inputs for multiple "releases" - manfileprefix = d.getVar('SSTATE_MANFILEPREFIX', True) - manfileprefix = manfileprefix + '-' + ver - d.setVar('SSTATE_MANFILEPREFIX', manfileprefix) - # do_stage_swupd_inputs in the main image recipe and do_image in the # swupd images will copy files from the mega bundle and thus those # recipes must use the same pseudo database. @@ -230,16 +222,9 @@ do_image_append () { #" SWUPD_FILE_BLACKLIST ??= "" -# When set to a non-empty string, the "swupd/image" content for the -# current build gets archived in the sstate-cache. This is -# experimental and disabled by default. Using it to create deltas -# between builds also implies doing some extra work to preserve the -# SWUPD_SSTATE_MAP map file across builds. -SWUPD_SSTATE ??= "" - -SWUPDIMAGEDIR = "${@ '${WORKDIR}/swupd-image' if '${SWUPD_SSTATE}' else '${DEPLOY_DIR_SWUPD}/image'}" +SWUPDIMAGEDIR = "${DEPLOY_DIR_SWUPD}/image" SWUPDMANIFESTDIR = "${WORKDIR}/swupd-manifests" -SWUPD_SSTATE_MAP = "${DEPLOY_DIR_SWUPD}/${PN}-map.inc" + fakeroot python do_stage_swupd_inputs () { import swupd.bundles @@ -249,149 +234,12 @@ fakeroot python do_stage_swupd_inputs () { swupd.bundles.copy_core_contents(d) swupd.bundles.copy_bundle_contents(d) - - # Write information about all known OSV->sstate obj mappings - mapfile = d.getVar('SWUPD_SSTATE_MAP', True) - pn = d.getVar('PN', True) - sstatepkg = d.getVar('SSTATE_PKGNAME', True) + '_stage_swupd_inputs.tgz' - osv = d.getVar('OS_VERSION', True) - verdict = {} - versions = (d.getVar('OS_VERSION_SSTATE_MAP_%s' % pn, True) or '').split() - for version in versions: - ver, pkg = version.split('=') - verdict[ver] = pkg - verdict[osv] = sstatepkg - - with open(mapfile, 'w') as f: - f.write('OS_VERSION_SSTATE_MAP_%s = "\\\n' % pn) - for ver, pkg in verdict.items(): - f.write(' %s=%s \\\n' % (ver, pkg)) - f.write(' "\n') - - bb.debug(3, 'Writing mapfile to %s' % mapfile) + swupd.bundles.copy_old_versions(d) } addtask stage_swupd_inputs after do_image before do_swupd_update do_stage_swupd_inputs[dirs] = "${SWUPDIMAGEDIR} ${SWUPDMANIFESTDIR} ${DEPLOY_DIR_SWUPD}/maps/" do_stage_swupd_inputs[depends] += "virtual/fakeroot-native:do_populate_sysroot" -SSTATETASKS += "${@ 'do_stage_swupd_inputs' if '${SWUPD_SSTATE}' else ''}" -do_stage_swupd_inputs[sstate-inputdirs] = "${SWUPDIMAGEDIR}/${OS_VERSION} ${SWUPDMANIFESTDIR}" -do_stage_swupd_inputs[sstate-outputdirs] = "${DEPLOY_DIR_SWUPD}/image/${OS_VERSION} ${DEPLOY_DIR_IMAGE}" - -python swupd_fix_manifest_link() { - """ - Ensure the manifest symlink points to the latest version of the manifest, - not the most recently staged. - """ - import glob - - sourcedir = d.getVar('SWUPDMANIFESTDIR', True) - destdir = d.getVar('DEPLOY_DIR_IMAGE', True) - links = [] - # Find symlinks in SWUPDMANIFESTDIR - for f in os.listdir(sourcedir): - if os.path.islink(os.path.join(sourcedir, f)): - links.append(f) - - for link in links: - target = None - latest = None - # Extract a pattern for glob: - # core-image-minimal-qemux86.manifest -> - # core-image-minimal-qemux86-20160602082427.rootfs.manifest - components = link.split('.') - prefix = components[0] - suffix = components[1] - pattern = prefix + '-*.' + suffix - # Find files matching the pattern in DEPLOY_DIR_IMAGE - for f in glob.glob(destdir+'/'+pattern): - # Find the most recent file matching that pattern - fname = os.path.basename(f) - date = f.split('-')[-1].split('.')[0] - if not latest or latest < date: - target = f - # Update the symlink - lnk = os.path.join(destdir, link) - os.remove(lnk) - bb.debug(3, 'Updating link %s to %s' % (lnk, target)) - os.symlink(target, lnk) -} - -python do_stage_swupd_inputs_setscene () { - if d.getVar('PN_BASE', True): - bb.debug(2, 'Skipping update input staging from sstate for non-base image %s' % d.getVar('PN', True)) - return - - sstate_setscene(d) -} -addtask do_stage_swupd_inputs_setscene -do_stage_swupd_inputs_setscene[dirs] = "${SWUPDIMAGEDIR} ${DEPLOY_DIR_SWUPD}/image/ ${SWUPDMANIFESTDIR} ${DEPLOY_DIR_IMAGE}" -do_stage_swupd_inputs_setscene[postfuncs] += "swupd_fix_manifest_link " - -fakeroot python do_fetch_swupd_inputs () { - import subprocess - import swupd.path - - if d.getVar('PN_BASE', True): - bb.debug(2, 'Skipping update input fetching for non-base image %s' % d.getVar('PN', True)) - return - - fetchlist = {} - pn = d.getVar('PN', True) - currv = d.getVar('OS_VERSION', True) - maplist = (d.getVar('OS_VERSION_SSTATE_MAP_%s' % pn, True) or '').split() - for map in maplist: - osv, pkg = map.split('=') - if osv == currv: - continue - fetchlist[osv] = pkg - - workdir = d.expand('${WORKDIR}/fetched-inputs') - bb.utils.mkdirhier(workdir) - - deploydirswupd = d.getVar('DEPLOY_DIR_SWUPD', True) - deploydirimage = d.getVar('DEPLOY_DIR_IMAGE', True) - sstatedir = d.getVar('SSTATE_DIR', True) - # For each identified input sstate object, try and ensure we have the - # object file available - for osv, pkg in fetchlist.items(): - # Don't try and fetch & unpack the sstate for a version directory - # which already exists - imgdst = os.path.join(deploydirswupd, 'image', osv) - if os.path.exists(imgdst): - continue - - sstatefetch = pkg - sstatepkg = '%s/%s' % (sstatedir, pkg) - - bb.debug(1, 'Preparing sstate package %s' % sstatepkg) - - if not os.path.exists(sstatepkg): - bb.debug(2, 'Fetching object %s from mirror' % sstatepkg) - pstaging_fetch(sstatefetch, sstatepkg, d) - - if not os.path.isfile(sstatepkg): - bb.debug(2, "Shared state package %s is not available" % sstatepkg) - continue - - # We now have a copy of the sstate for a do_stage_swupd_inputs - # version let's "install" it. We have two directories: - # $osv: should be extracted to ${DEPLOY_DIR_SWUPD}/image/$osv - # swupd-manifests: should be extracted to ${DEPLOY_DIR_IMAGE} - src = os.path.join(workdir, osv) - bb.utils.mkdirhier(src) - - bb.debug(2, 'Unpacking sstate object %s in %s' % (sstatepkg, src)) - cmd = 'cd %s && tar -xvzf %s' % (src, sstatepkg) - subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT) - bb.utils.mkdirhier(imgdst) - swupd.path.copyxattrtree('%s/%s/' % (src, osv), imgdst) - swupd.path.copyxattrtree('%s/swupd-manifests/' % src, deploydirimage) -} -addtask fetch_swupd_inputs before do_swupd_update -do_fetch_swupd_inputs[dirs] = "${DEPLOY_DIR_SWUPD}/maps ${DEPLOY_DIR_SWUPD}/image" -do_fetch_swupd_inputs[depends] += "virtual/fakeroot-native:do_populate_sysroot" - SWUPD_FORMAT ??= "3" # do_swupd_update uses its own pseudo database, for several reasons: # - Performance is better when the pseudo instance is not shared @@ -464,6 +312,12 @@ END if [ -e ${DEPLOY_DIR_SWUPD}/image/latest.version ]; then PREVREL=`cat ${DEPLOY_DIR_SWUPD}/image/latest.version` else + # TODO: locate information about latest version from online www update repo + # and download the relevant files. That makes swupd_create_fullfiles + # a lot faster because it allows reusing existing, unmodified files. + # Saves a lot of space, too, because the new Manifest files then merely + # point to the older version (no entry in ${DEPLOY_DIR_SWUPD}/www/${OS_VERSION}/files, + # not even a link). bbdebug 2 "Stubbing out empty latest.version file" touch ${DEPLOY_DIR_SWUPD}/image/latest.version PREVREL="0" @@ -517,20 +371,15 @@ END invoke_swupd ${STAGING_BINDIR_NATIVE}/swupd_make_pack --log-stdout -S ${DEPLOY_DIR_SWUPD} 0 ${OS_VERSION} $bndl done - # Generate delta-packs going back SWUPD_N_DELTAPACK versions + # Generate delta-packs against previous versions chosen by our caller. # env $PSEUDO bsdtar -acf ${DEPLOY_DIR}/swupd-before-make-delta-pack.tar.gz -C ${DEPLOY_DIR} swupd - if [ ${SWUPD_DELTAPACKS} -eq 1 -a ${SWUPD_N_DELTAPACK} -gt 0 -a $PREVREL -gt 0 ]; then + for prevver in ${SWUPD_DELTAPACK_VERSIONS}; do for bndl in ${ALL_BUNDLES}; do bndlcnt=0 - # Build list of previous versions and pick the last n ones to build - # deltas against. Ignore the latest one, which is the one we build - # right now. - ls -d -1 ${DEPLOY_DIR_SWUPD}/image/*/$bndl | sed -e 's;${DEPLOY_DIR_SWUPD}/image/\([^/]*\)/.*;\1;' | grep -e '^[0-9]*$' | sort -n | head -n -1 | tail -n ${SWUPD_N_DELTAPACK} | while read prevver; do - ${SWUPD_LOG_FN} "Generating delta pack from $prevver to ${OS_VERSION} for $bndl" - invoke_swupd ${STAGING_BINDIR_NATIVE}/swupd_make_pack --log-stdout -S ${DEPLOY_DIR_SWUPD} $prevver ${OS_VERSION} $bndl - done + ${SWUPD_LOG_FN} "Generating delta pack from $prevver to ${OS_VERSION} for $bndl" + invoke_swupd ${STAGING_BINDIR_NATIVE}/swupd_make_pack --log-stdout -S ${DEPLOY_DIR_SWUPD} $prevver ${OS_VERSION} $bndl done - fi + done # Write version to www/version/format${SWUPD_FORMAT}/latest and image/latest.version bbdebug 2 "Writing latest file" @@ -538,6 +387,11 @@ END echo ${OS_VERSION} > ${DEPLOY_DIR_SWUPD}/www/version/format${SWUPD_FORMAT}/latest echo ${OS_VERSION} > ${DEPLOY_DIR_SWUPD}/image/latest.version # env $PSEUDO bsdtar -acf ${DEPLOY_DIR}/swupd-done.tar.gz -C ${DEPLOY_DIR} swupd + + # Archive the files of the current build which will be needed in the future + # for a <current version> -> <future version> delta computation. We exclude + # the expanded "full" rootfs, because we already have "full.tar". + (cd ${DEPLOY_DIR_SWUPD}; tar -zcf ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}-${OS_VERSION}-swupd.tar --exclude=full --exclude=Manifest.*.tar image/${OS_VERSION} www/${OS_VERSION}/Manifest.*) } SWUPDDEPENDS = "\ |