[oe-commits] [openembedded-core] 01/02: externalsrc.bbclass: Avoid symlink clashes for virtclasses

git at git.openembedded.org git at git.openembedded.org
Mon Sep 11 16:51:45 UTC 2017


This is an automated email from the git hooks/post-receive script.

rpurdie pushed a commit to branch master-next
in repository openembedded-core.

commit 7cd896735f93f206314afb28c8c1286f775aa804
Author: Ola x Nilsson <ola.x.nilsson at axis.com>
AuthorDate: Mon Aug 28 16:58:16 2017 +0200

    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 at axis.com>
    Signed-off-by: Ross Burton <ross.burton at intel.com>
---
 meta/classes/externalsrc.bbclass        | 16 ++++++++++-
 meta/lib/oeqa/selftest/cases/devtool.py | 48 +++++++++++++++++++++++++++++++++
 2 files changed, 63 insertions(+), 1 deletion(-)

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 c17131a..2a9cc9d 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):

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Openembedded-commits mailing list