archiver.bbclass: Fixes and improves archiver class for kernel and gcc packages

gcc packages use a shared source directory, this causes an issue since the archiver will
try to patch the same source several times (one for each gcc package), producing an error,
the archiver class used stamp-base to check this, nonetheless our gcc packages no longer
use stamp-base, they use gcc-shared instead, which is what broke this functionality.
This patch adds a check to see whether or not the source should be patched,
avoiding patching the source when it shouldn't.

Also, we dont need to create multiple identical tarballs for all gcc packages,
this patch fixes this and creates a single source tarball for gcc.

When requesting patched sources, a race condition is created for linux-yocto tasks,
unpack_and_patch is executed along with kernel_configme, which most of the time
causes errors during configure, since kernel_configme task is specific to the kernel,
simply modifying the tasks order by creating a dependency to kernel_configme was impossible,
causing errors on all other packages that didnt use kernel_configme, this is fixed by
creating a special case for the kernel, adding tasks with correct dependencies,
avoiding the race condition and behaving the way it should for all other packages as well.

[YOCTO #8378]

(From OE-Core rev: aecaa0e8739db1c228a6db78225a717d9f348a5b)

Signed-off-by: Alejandro Hernandez <alejandro.hernandez@linux.intel.com>
Signed-off-by: Ross Burton <ross.burton@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Alejandro Hernandez 2015-10-06 23:05:09 +00:00 committed by Richard Purdie
parent 2d008033c5
commit 92b26ad938
1 changed files with 20 additions and 7 deletions

View File

@ -157,7 +157,7 @@ python do_ar_patched() {
# Get the ARCHIVER_OUTDIR before we reset the WORKDIR
ar_outdir = d.getVar('ARCHIVER_OUTDIR', True)
bb.note('Archiving the patched source...')
d.setVar('WORKDIR', d.getVar('ARCHIVER_WORKDIR', True))
d.setVar('WORKDIR', ar_outdir)
create_tarball(d, d.getVar('S', True), 'patched', ar_outdir)
}
@ -202,6 +202,10 @@ def create_tarball(d, srcdir, suffix, ar_outdir):
"""
import tarfile
# Make sure we are only creating a single tarball for gcc sources
if d.getVar('SRC_URI', True) == "" and 'gcc' in d.getVar('PN', True):
return
bb.utils.mkdirhier(ar_outdir)
tarname = os.path.join(ar_outdir, '%s-%s.tar.gz' % \
(d.getVar('PF', True), suffix))
@ -246,11 +250,9 @@ python do_unpack_and_patch() {
[ 'patched', 'configured'] and \
d.getVarFlag('ARCHIVER_MODE', 'diff', True) != '1':
return
ar_outdir = d.getVar('ARCHIVER_OUTDIR', True)
# Change the WORKDIR to make do_unpack do_patch run in another dir.
d.setVar('WORKDIR', d.getVar('ARCHIVER_WORKDIR', True))
ar_outdir = d.getVar('ARCHIVER_OUTDIR', True)
d.setVar('WORKDIR', ar_outdir)
# The changed 'WORKDIR' also casued 'B' changed, create dir 'B' for the
# possibly requiring of the following tasks (such as some recipes's
@ -270,7 +272,11 @@ python do_unpack_and_patch() {
src = d.getVar('S', True).rstrip('/')
src_orig = '%s.orig' % src
oe.path.copytree(src, src_orig)
bb.build.exec_func('do_patch', d)
# Make sure gcc sources are patched only once
if not ((d.getVar('SRC_URI', True) == "" and 'gcc' in d.getVar('PN', True))):
bb.build.exec_func('do_patch', d)
# Create the patches
if d.getVarFlag('ARCHIVER_MODE', 'diff', True) == '1':
bb.note('Creating diff gz...')
@ -341,7 +347,6 @@ do_deploy_archives[sstate-inputdirs] = "${ARCHIVER_TOPDIR}"
do_deploy_archives[sstate-outputdirs] = "${DEPLOY_DIR_SRC}"
addtask do_ar_original after do_unpack
addtask do_unpack_and_patch after do_patch
addtask do_ar_patched after do_unpack_and_patch
addtask do_ar_configured after do_unpack_and_patch
addtask do_dumpdata
@ -354,3 +359,11 @@ do_deploy_all_archives[recideptask] = "do_${BB_DEFAULT_TASK}"
do_deploy_all_archives() {
:
}
python () {
# Add tasks in the correct order, specifically for linux-yocto to avoid race condition
if bb.data.inherits_class('kernel-yocto', d):
bb.build.addtask('do_kernel_configme', 'do_configure', 'do_unpack_and_patch', d)
else:
bb.build.addtask('do_unpack_and_patch', None, 'do_patch', d)
}