Skip to contentSkip to conversation

base.bbclass: Ensure PREFERRED_PROVIDER and PREFERRED_VERSION values are set for multilibs

PATCH Richard Purdie 2 participants 3 messages Aug 5, 2011 – Aug 9, 2011

lore
Share & tools
lore
#0 lore raw

When running multilib builds its not intuitive for the specificed versions/providers to be build in one case and the higher version in the other. This patch mirrors the options unless they're already set.

There shouldn't be any effect if the MULTILIBS variable isn't set.

[YOCTO #1339]

---

meta/classes/base.bbclass +41 -0
index ff960cd..4aee847 100644
@@ -139,6 +139,46 @@ def pkgarch_mapping(d):
         if d.getVar("TUNE_PKGARCH", True) == "armv7a-vfp-neon":
             d.setVar("TUNE_PKGARCH", "armv7a")
 
+def preferred_ml_updates(d):
+    # If any PREFERRED_PROVIDER or PREFERRED_VERSIONS are set,
+    # we need to mirror these variables in the multilib case
+    multilibs = d.getVar('MULTILIBS', True) or ""
+    if not multilibs:
+        return
+
+    prefixes = []
+    for ext in multilibs.split():
+        eext = ext.split(':')
+        if len(eext) > 1 and eext[0] == 'multilib':
+            prefixes.append(eext[1])
+
+    versions = []
+    providers = []
+    for v in d.keys():
+        if v.startswith("PREFERRED_VERSION_"):
+            versions.append(v)
+        if v.startswith("PREFERRED_PROVIDER_"):
+            providers.append(v)
+
+    for v in versions:
+        val = d.getVar(v, False)
+        pkg = v.replace("PREFERRED_VERSION_", "")
+        for p in prefixes:
+            newname = "PREFERRED_VERSION_" + p + "-" + pkg
+            if not d.getVar(newname, False):
+                d.setVar(newname, val)
+
+    for prov in providers:
+        val = d.getVar(prov, False)
+        pkg = prov.replace("PREFERRED_PROVIDER_", "")
+        virt = ""
+        if pkg.startswith("virtual/"):
+             pkg = pkg.replace("virtual/", "")
+             virt = "virtual/"
+        for p in prefixes:
+            newname = "PREFERRED_PROVIDER_" + virt + p + "-" + pkg
+            if not d.getVar(newname, False):
+                d.setVar(newname, p + "-" + val)
 
 addhandler base_eventhandler
 python base_eventhandler() {
@@ -211,6 +251,7 @@ python base_eventhandler() {
         if name == "ConfigParsed":
                 generate_git_config(e)
                 pkgarch_mapping(e.data)
+                preferred_ml_updates(e.data)
 
 	if not data in e.__dict__:
 		return
#1 lore raw

Richard Purdie wrote on 2011-08-05:

Quoted 44 lines

When running multilib builds its not intuitive for the specificed versions/providers to be build in one case and the higher version in the other. This patch mirrors the options unless they're already set.

There shouldn't be any effect if the MULTILIBS variable isn't set.

[YOCTO #1339]

meta/classes/base.bbclass index renamed from meta/classes/base.bbclass +0 -0

ff960cd..4aee847 100644 --- a/meta/classes/base.bbclass +++ b/meta/classes/base.bbclass @@ -139,6 +139,46 @@ def pkgarch_mapping(d):

         if d.getVar("TUNE_PKGARCH", True) == "armv7a-vfp-neon":
             d.setVar("TUNE_PKGARCH", "armv7a")
meta/classes/base.bbclass index renamed from meta/classes/base.bbclass +30 -0
+def preferred_ml_updates(d):
+    # If any PREFERRED_PROVIDER or PREFERRED_VERSIONS are set,
+    # we need to mirror these variables in the multilib case
+    multilibs = d.getVar('MULTILIBS', True) or ""
+    if not multilibs:
+        return
+
+    prefixes = []
+    for ext in multilibs.split():
+        eext = ext.split(':')
+        if len(eext) > 1 and eext[0] == 'multilib':
+            prefixes.append(eext[1])
+
+    versions = []
+    providers = []
+    for v in d.keys():
+        if v.startswith("PREFERRED_VERSION_"):
+            versions.append(v)
+        if v.startswith("PREFERRED_PROVIDER_"):
+            providers.append(v)
+
+    for v in versions:
+        val = d.getVar(v, False)
+        pkg = v.replace("PREFERRED_VERSION_", "")
+        for p in prefixes:
+            newname = "PREFERRED_VERSION_" + p + "-" + pkg
+            if not d.getVar(newname, False):
+                d.setVar(newname, val)
+
+    for prov in providers:

meta/classes/base.bbclass index

Quoted 10 lines
meta/classes/base.bbclass index renamed from meta/classes/base.bbclass +10 -0
+        val = d.getVar(prov, False)
+        pkg = prov.replace("PREFERRED_PROVIDER_", "")
+        virt = ""
+        if pkg.startswith("virtual/"):
+             pkg = pkg.replace("virtual/", "")
+             virt = "virtual/"
+        for p in prefixes:
+            newname = "PREFERRED_PROVIDER_" + virt + p + "-" + pkg
+            if not d.getVar(newname, False):
+                d.setVar(newname, p + "-" + val)

How about the native and nativesdk packages? I think they should not be prefixed.

meta/classes/base.bbclass index python base_eventhandler() { · line 257

Quoted 11 lines

addhandler base_eventhandler
python base_eventhandler() {

meta/classes/base.bbclass index renamed from meta/classes/base.bbclass +1 -0
@@ -211,6 +251,7 @@ python base_eventhandler() {
         if name == "ConfigParsed":
                 generate_git_config(e)
                 pkgarch_mapping(e.data)
+                preferred_ml_updates(e.data)
 
 	if not data in e.__dict__:
 		return

Best Regards,
Lianhao

#2 lore raw
Quoted 49 lines · Lianhao

Richard Purdie wrote on 2011-08-05:

Quoted 48 lines

When running multilib builds its not intuitive for the specificed versions/providers to be build in one case and the higher version in the other. This patch mirrors the options unless they're already set.

There shouldn't be any effect if the MULTILIBS variable isn't set.

[YOCTO #1339]

meta/classes/base.bbclass index renamed from meta/classes/base.bbclass +0 -0

ff960cd..4aee847 100644 --- a/meta/classes/base.bbclass +++ b/meta/classes/base.bbclass @@ -139,6 +139,46 @@ def pkgarch_mapping(d):

         if d.getVar("TUNE_PKGARCH", True) == "armv7a-vfp-neon":
             d.setVar("TUNE_PKGARCH", "armv7a")
meta/classes/base.bbclass index renamed from meta/classes/base.bbclass +34 -0
+def preferred_ml_updates(d):
+    # If any PREFERRED_PROVIDER or PREFERRED_VERSIONS are set,
+    # we need to mirror these variables in the multilib case
+    multilibs = d.getVar('MULTILIBS', True) or ""
+    if not multilibs:
+        return
+
+    prefixes = []
+    for ext in multilibs.split():
+        eext = ext.split(':')
+        if len(eext) > 1 and eext[0] == 'multilib':
+            prefixes.append(eext[1])
+
+    versions = []
+    providers = []
+    for v in d.keys():
+        if v.startswith("PREFERRED_VERSION_"):
+            versions.append(v)
+        if v.startswith("PREFERRED_PROVIDER_"):
+            providers.append(v)
+
+    for v in versions:
+        val = d.getVar(v, False)
+        pkg = v.replace("PREFERRED_VERSION_", "")
+        for p in prefixes:
+            newname = "PREFERRED_VERSION_" + p + "-" + pkg
+            if not d.getVar(newname, False):
+                d.setVar(newname, val)
+
+    for prov in providers:
+        val = d.getVar(prov, False)
+        pkg = prov.replace("PREFERRED_PROVIDER_", "")
+        virt = ""
+        if pkg.startswith("virtual/"):
Quoted 8 lines

meta/classes/base.bbclass index

Quoted 6 lines
meta/classes/base.bbclass index renamed from meta/classes/base.bbclass +6 -0
+             pkg = pkg.replace("virtual/", "")
+             virt = "virtual/"
+        for p in prefixes:
+            newname = "PREFERRED_PROVIDER_" + virt + p + "-" + pkg
+            if not d.getVar(newname, False):
+                d.setVar(newname, p + "-" + val)

How about the native and nativesdk packages? I think they should not be prefixed.

Agreed. I've merged this with a tweak to stop the preferred version/provider code taking effect for native/nativesdk packages.

Cheers,

Richard