summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2011-08-15 23:59:32 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2011-09-02 18:23:31 +0100
commit2fd257f6c610624f05c8dd3fe1486364af04696f (patch)
tree25f9a866435f7698d51e4989daa6ba9966d2866e
parent88abab9ba9632e87f3a081915a69cbc5c36b4d3c (diff)
downloadopenembedded-core-2fd257f6c610624f05c8dd3fe1486364af04696f.tar.gz
openembedded-core-2fd257f6c610624f05c8dd3fe1486364af04696f.tar.bz2
openembedded-core-2fd257f6c610624f05c8dd3fe1486364af04696f.tar.xz
openembedded-core-2fd257f6c610624f05c8dd3fe1486364af04696f.zip
multilib: Only build one kernel
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>
-rw-r--r--meta/classes/multilib.bbclass39
-rw-r--r--meta/classes/multilib_global.bbclass39
-rw-r--r--meta/conf/multilib.conf2
3 files changed, 53 insertions, 27 deletions
diff --git a/meta/classes/multilib.bbclass b/meta/classes/multilib.bbclass
index 5d975fd33..583d76b0f 100644
--- a/meta/classes/multilib.bbclass
+++ b/meta/classes/multilib.bbclass
@@ -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
index 000000000..217349b2d
--- /dev/null
+++ b/meta/classes/multilib_global.bbclass
@@ -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
diff --git a/meta/conf/multilib.conf b/meta/conf/multilib.conf
index babf19166..eec1da79c 100644
--- a/meta/conf/multilib.conf
+++ b/meta/conf/multilib.conf
@@ -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}"