diff options
author | Alejandro Hernandez <alejandro.hernandez@linux.intel.com> | 2015-10-06 23:05:09 +0000 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2015-10-21 22:59:20 +0100 |
commit | aecaa0e8739db1c228a6db78225a717d9f348a5b (patch) | |
tree | 718812964cd9e352c92beb70888aa2574e5ab71d /meta | |
parent | ad33259b507914bfc8de92d1df12e0974157900e (diff) | |
download | openembedded-core-aecaa0e8739db1c228a6db78225a717d9f348a5b.tar.gz openembedded-core-aecaa0e8739db1c228a6db78225a717d9f348a5b.tar.bz2 openembedded-core-aecaa0e8739db1c228a6db78225a717d9f348a5b.zip |
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]
Signed-off-by: Alejandro Hernandez <alejandro.hernandez@linux.intel.com>
Signed-off-by: Ross Burton <ross.burton@intel.com>
Diffstat (limited to 'meta')
-rw-r--r-- | meta/classes/archiver.bbclass | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/meta/classes/archiver.bbclass b/meta/classes/archiver.bbclass index eec8024db7..41a552c76b 100644 --- a/meta/classes/archiver.bbclass +++ b/meta/classes/archiver.bbclass @@ -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) +} |