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]

(From OE-Core rev: 2fd257f6c610624f05c8dd3fe1486364af04696f)

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Richard Purdie 2011-08-15 23:59:32 +01:00
parent accab54cd5
commit f9c3639238
3 changed files with 53 additions and 27 deletions

View 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)
}

View File

@ -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

View 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}"