aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOla x Nilsson <ola.x.nilsson@axis.com>2017-08-28 16:58:16 +0200
committerRichard Purdie <richard.purdie@linuxfoundation.org>2017-09-14 14:07:53 +0100
commit1781f9f3c893c76656f0bd5879a0cdb5cbe158fe (patch)
treeaeef70ed5a05b32616a65a3896a74d5093bc9531
parent878c70a8a341c17fa81fc8314120b7f575d4c99f (diff)
downloadopenembedded-core-1781f9f3c893c76656f0bd5879a0cdb5cbe158fe.zip
openembedded-core-1781f9f3c893c76656f0bd5879a0cdb5cbe158fe.tar.gz
openembedded-core-1781f9f3c893c76656f0bd5879a0cdb5cbe158fe.tar.bz2
externalsrc.bbclass: Avoid symlink clashes for virtclasses
There was a race condifion in externalsrc_configure_prefuncs when the same source folder is used for several variants of the same recipe, like this: EXTERNALSRC_pn-foo = "..." EXTERNALSRC_pn-foo-native = "..." The symlinks were created once for each variant of the recipe, and where they led in the end depended on which do_configure task executed last. Create one set of symlinks for each variant by adding an EXTSRC_SUFFIX variable to the end of the link names. Tries to handle all known virtclasses and multilib variants. Use a lockfile for externalsrc_configure_prefuncs to protect the .git/info/exclude file. Signed-off-by: Ola x Nilsson <olani@axis.com> Signed-off-by: Ross Burton <ross.burton@intel.com>
-rw-r--r--meta/classes/externalsrc.bbclass16
-rw-r--r--meta/lib/oeqa/selftest/cases/devtool.py48
2 files changed, 63 insertions, 1 deletions
diff --git a/meta/classes/externalsrc.bbclass b/meta/classes/externalsrc.bbclass
index 8141f25..980e339 100644
--- a/meta/classes/externalsrc.bbclass
+++ b/meta/classes/externalsrc.bbclass
@@ -24,8 +24,21 @@
# EXTERNALSRC_BUILD_pn-myrecipe = "/path/to/my/source/tree"
#
+def get_symlink_suffix(var, suffixes, d):
+ # Like oe.utils.prune_suffix but return the suffix instead
+ for suffix in suffixes:
+ if var.endswith(suffix):
+ return suffix
+ if var.startswith('nativesdk-'):
+ return '-nativesdk'
+ prefix = d.getVar("MLPREFIX")
+ if prefix and var.startswith(prefix):
+ return '-' + prefix[:-1]
+ return ''
+
SRCTREECOVEREDTASKS ?= "do_patch do_unpack do_fetch"
-EXTERNALSRC_SYMLINKS ?= "oe-workdir:${WORKDIR} oe-logs:${T}"
+EXTSRC_SUFFIX = "${@get_symlink_suffix(d.getVar('PN'), d.getVar('SPECIAL_PKGSUFFIX').split(), d)}"
+EXTERNALSRC_SYMLINKS ?= "oe-workdir${EXTSRC_SUFFIX}:${WORKDIR} oe-logs${EXTSRC_SUFFIX}:${T}"
python () {
externalsrc = d.getVar('EXTERNALSRC')
@@ -128,6 +141,7 @@ python () {
d.setVar('STAMPCLEAN', '${STAMPS_DIR}/work-shared/${PN}/*-*')
}
+externalsrc_configure_prefunc[lockfiles] += " ${S}/conf_prefunc.lock"
python externalsrc_configure_prefunc() {
s_dir = d.getVar('S')
# Create desired symlinks
diff --git a/meta/lib/oeqa/selftest/cases/devtool.py b/meta/lib/oeqa/selftest/cases/devtool.py
index 1dfef59..69b7d5a 100644
--- a/meta/lib/oeqa/selftest/cases/devtool.py
+++ b/meta/lib/oeqa/selftest/cases/devtool.py
@@ -500,6 +500,54 @@ class DevtoolTests(DevtoolBase):
result = runCmd('devtool status')
self.assertNotIn('mdadm', result.output)
+ def test_devtool_modify_configure_prefunc(self):
+ self.write_config("""
+MACHINE = "qemux86-64"
+require conf/multilib.conf
+MULTILIBS = "multilib:lib32"
+DEFAULTTUNE_virtclass-multilib-lib32 = "x86"
+""")
+ self.add_command_to_tearDown('bitbake-layers remove-layer */workspace')
+ self.write_recipeinc('emptytest', '''
+BBCLASSEXTEND = "native nativesdk"
+do_patch[noexec] = "1"
+INHIBIT_DEFAULT_DEPS = "1"
+''')
+ self.track_for_cleanup(self.recipeinc('emptytest'))
+ targets = 'emptytest emptytest-native nativesdk-emptytest lib32-emptytest'
+ self.add_command_to_tearDown('bitbake -c clean ' + targets)
+ tempdir = tempfile.mkdtemp(prefix='devtoolqa')
+ self.track_for_cleanup(tempdir)
+ runCmd('devtool modify emptytest -x %s' % tempdir)
+ self.track_for_cleanup(self.workspacedir)
+ self.append_recipeinc('emptytest', 'EXTERNALSRC_pn-emptytest-native = "%s"\n' % tempdir)
+ self.append_recipeinc('emptytest', 'EXTERNALSRC_pn-nativesdk-emptytest = "%s"\n' % tempdir)
+ self.append_recipeinc('emptytest', 'EXTERNALSRC_pn-lib32-emptytest = "%s"\n' % tempdir)
+ bitbake('-c cleansstate ' + targets)
+ bitbake('-c configure ' + targets)
+
+ def assert_link(linkname, destdir):
+ linkname = os.path.join(tempdir, linkname)
+ self.assertExists(linkname)
+ self.assertTrue(os.path.islink(linkname))
+ dst = os.readlink(linkname)
+ self.assertEqual(dst, destdir)
+
+ bbvars = {'': get_bb_vars(['WORKDIR', 'T'], 'emptytest'),
+ '-native': get_bb_vars(['WORKDIR', 'T'], 'emptytest-native'),
+ '-lib32': get_bb_vars(['WORKDIR', 'T'], 'lib32-emptytest'),
+ '-nativesdk': get_bb_vars(['WORKDIR', 'T'], 'nativesdk-emptytest')}
+ for variant in bbvars:
+ assert_link('oe-logs' + variant, bbvars[variant]['T'])
+ assert_link('oe-workdir' + variant, bbvars[variant]['WORKDIR'])
+
+ with open(os.path.join(tempdir, '.git/info/exclude')) as efile:
+ lines = set(efile.readlines())
+ expected = {'/%s%s\n' % (base, sfx)
+ for base in ['oe-logs', 'oe-workdir']
+ for sfx in bbvars}
+ self.assertTrue(expected <= lines)
+
@OETestID(1620)
def test_devtool_buildclean(self):
def assertFile(path, *paths):