]> code.ossystems Code Review - openembedded-core.git/commitdiff
multilib: Only build one kernel
authorRichard Purdie <richard.purdie@linuxfoundation.org>
Mon, 15 Aug 2011 22:59:32 +0000 (23:59 +0100)
committerRichard Purdie <richard.purdie@linuxfoundation.org>
Fri, 2 Sep 2011 17:23:31 +0000 (18:23 +0100)
For a given system we only want one kernel to be built. This change makes
the main kernel recipe provide all of the provides of the various enabled
multilibs hence allowing it to fulfil all the appropriate dependencies.

To make this work a global multilib class file needed to be created.

This patch also enables this multi provider functionality for "allarch"
packages.

[YOCTO #1361]

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
meta/classes/multilib.bbclass
meta/classes/multilib_global.bbclass [new file with mode: 0644]
meta/conf/multilib.conf

index 5d975fd33e1e529a78e3f01e217cc51c645e634d..583d76b0f3e216eabcf2c41ca5d6901a1d38394f 100644 (file)
@@ -6,12 +6,17 @@ python multilib_virtclass_handler () {
     variant = e.data.getVar("BBEXTENDVARIANT", True)
     if cls != "multilib" or not variant:
         return
+
+    # There should only be one kernel in multilib configs
+    if bb.data.inherits_class('kernel', e.data) or bb.data.inherits_class('module-base', e.data) or bb.data.inherits_class('allarch', e.data):
+        raise bb.parse.SkipPackage("We shouldn't have multilib variants for the kernel")
+
     save_var_name=e.data.getVar("MULTILIB_SAVE_VARNAME", True) or ""
     for name in save_var_name.split():
         val=e.data.getVar(name, True)
         if val:
             e.data.setVar(name + "_MULTILIB_ORIGINAL", val)
-
     override = ":virtclass-multilib-" + variant
 
     e.data.setVar("MLPREFIX", variant + "-")
@@ -28,16 +33,6 @@ STAGINGCC_prepend = "${BBEXTENDVARIANT}-"
 python __anonymous () {
     variant = d.getVar("BBEXTENDVARIANT", True)
 
-    def extend_name(name):
-        if name.startswith("virtual/"):
-            subs = name.split("/", 1)[1]
-            if not subs.startswith(variant):
-                return "virtual/" + variant + "-" + subs
-            return name
-        if not name.startswith(variant):
-            return variant + "-" + name
-        return name
-
     def map_dependencies(varname, d, suffix = ""):
         if suffix:
             varname = varname + "_" + suffix
@@ -50,25 +45,15 @@ python __anonymous () {
             if dep.endswith(("-native", "-native-runtime")):
                 newdeps.append(dep)
             else:
-                newdeps.append(extend_name(dep))
+                newdeps.append(multilib_extend_name(variant, dep))
         d.setVar(varname, " ".join(newdeps))
 
-    def map_variable(varname, d):
-        var = d.getVar(varname, True)
-        if not var:
-            return
-        var = var.split()
-        newvar = []
-        for v in var:
-            newvar.append(extend_name(v))
-        d.setVar(varname, " ".join(newvar))
-
     pkgs_mapping = []
     for pkg in (d.getVar("PACKAGES", True) or "").split():
         if pkg.startswith(variant):
             pkgs_mapping.append([pkg.split(variant + "-")[1], pkg])
             continue
-        pkgs_mapping.append([pkg, extend_name(pkg)])
+        pkgs_mapping.append([pkg, multilib_extend_name(variant, pkg)])
 
     d.setVar("PACKAGES", " ".join([row[1] for row in pkgs_mapping]))
 
@@ -87,8 +72,8 @@ python __anonymous () {
         map_dependencies("RCONFLICTS", d, pkg)
         map_dependencies("PKG", d, pkg)
 
-    map_variable("PROVIDES", d)
-    map_variable("PACKAGES_DYNAMIC", d)
-    map_variable("PACKAGE_INSTALL", d)
-    map_variable("INITSCRIPT_PACKAGES", d)
+    multilib_map_variable("PROVIDES", variant, d)
+    multilib_map_variable("PACKAGES_DYNAMIC", variant, d)
+    multilib_map_variable("PACKAGE_INSTALL", variant, d)
+    multilib_map_variable("INITSCRIPT_PACKAGES", variant, d)
 }
diff --git a/meta/classes/multilib_global.bbclass b/meta/classes/multilib_global.bbclass
new file mode 100644 (file)
index 0000000..217349b
--- /dev/null
@@ -0,0 +1,39 @@
+python multilib_virtclass_handler_global () {
+    if not e.data:
+        return
+
+    variant = e.data.getVar("BBEXTENDVARIANT", True)
+
+    if isinstance(e, bb.event.RecipeParsed) and not variant:
+        if bb.data.inherits_class('kernel', e.data) or bb.data.inherits_class('module-base', e.data) or bb.data.inherits_class('allarch', e.data):
+            origprovs = provs = e.data.getVar("PROVIDES", True)
+            variants = (e.data.getVar("MULTILIB_VARIANTS", True) or "").split()
+            for variant in variants:
+                provs = provs + " " + multilib_map_variable("PROVIDES", variant, e.data)
+                e.data.setVar("PROVIDES", origprovs)
+            e.data.setVar("PROVIDES", provs)
+}
+
+addhandler multilib_virtclass_handler_global
+
+def multilib_extend_name(variant, name):
+    if name.startswith("virtual/"):
+        subs = name.split("/", 1)[1]
+        if not subs.startswith(variant):
+            return "virtual/" + variant + "-" + subs
+        return name
+    if not name.startswith(variant):
+        return variant + "-" + name
+    return name
+
+def multilib_map_variable(varname, variant, d):
+    var = d.getVar(varname, True)
+    if not var:
+        return
+    var = var.split()
+    newvar = []
+    for v in var:
+        newvar.append(multilib_extend_name(variant, v))
+    newdata =  " ".join(newvar)
+    d.setVar(varname, newdata)
+    return newdata
index babf1916698c61a735ad59ccf9dbeb3d87a26f70..eec1da79c9f7085b7c61d19b28884dbd4e8ec2f6 100644 (file)
@@ -9,6 +9,8 @@ MULTILIBS ??= "multilib:lib32"
 STAGING_DIR_HOST = "${STAGING_DIR}/${MLPREFIX}${MACHINE}"
 STAGING_DIR_TARGET = "${STAGING_DIR}/${MLPREFIX}${MACHINE}"
 
+INHERIT += "multilib_global"
+
 BBCLASSEXTEND_append_pn-acl = " ${MULTILIBS}"
 BBCLASSEXTEND_append_pn-alsa-lib = " ${MULTILIBS}"
 BBCLASSEXTEND_append_pn-alsa-utils = " ${MULTILIBS}"