On 08/03/2010 09:40 PM, Chris Larson wrote:
From: Christopher Larson<[email protected]>
This adds the ability to include groups of packages in an image. It is
similar in concept to the IMAGE_FEATURES used in Poky, but here we use
IMAGE_FEATURE_<feature> and IMAGE_FEATURE_<feature>_OPTIONAL, rather than
base_contains calls.
Initially defined groups:
base - the packages requested via IMAGE_INSTALL& IMAGE_BOOT
dbg - debug packages
dev - development packages
doc - documentation packages (of limited use at the moment due to task.bbclass)
vmlinux - kernel debugging packages (just kernel-vmlinux at the moment)
To add groups to your images:
IMAGE_FEATURES += "dbg dev"
To add a new package group:
IMAGE_FEATURE_myfeature = "gstreamer python pulseaudio"
Signed-off-by: Chris Larson<[email protected]>
Acked-by: Philip Balister <[email protected]>
Works for me. I'm using it to install and the -dbg packages in an image
so I can oprofile better.
Philip
---
classes/image.bbclass | 101 ++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 99 insertions(+), 2 deletions(-)
diff --git a/classes/image.bbclass b/classes/image.bbclass
index 2105195..30137be 100644
--- a/classes/image.bbclass
+++ b/classes/image.bbclass
@@ -29,11 +29,10 @@ ${IMAGE_DEV_MANAGER} \
${IMAGE_INIT_MANAGER} \
${IMAGE_LOGIN_MANAGER} "
-RDEPENDS += "${IMAGE_INSTALL} ${IMAGE_BOOT}"
+RDEPENDS += "${__PACKAGE_INSTALL}"
# "export IMAGE_BASENAME" not supported at this time
IMAGE_BASENAME[export] = "1"
-export PACKAGE_INSTALL ?= "${IMAGE_INSTALL} ${IMAGE_BOOT}"
# We need to recursively follow RDEPENDS and RRECOMMENDS for images
do_rootfs[recrdeptask] += "do_deploy do_populate_sysroot"
@@ -61,6 +60,7 @@ python () {
bb.data.setVarFlag('do_rootfs', 'depends', deps, d)
runtime_mapping_rename("PACKAGE_INSTALL", d)
+ runtime_mapping_rename("PACKAGE_INSTALL_ATTEMPTONLY", d)
}
#
@@ -107,6 +107,103 @@ IMAGE_LINGUAS ?= "de-de fr-fr en-gb"
LINGUAS_INSTALL = "${@" ".join(map(lambda s: "locale-base-%s" % s,
bb.data.getVar('IMAGE_LINGUAS', d, 1).split()))}"
+def __pkgmap(d):
+ from os import listdir
+ from os.path import isdir, join, dirname
+
+ os = d.getVar("TARGET_OS", True)
+ vendor = d.getVar("TARGET_VENDOR", True)
+ basedir = dirname(d.getVar("PKGDATA_DIR", True))
+
+ dirs = ("%s%s-%s" % (arch, vendor, os)
+ for arch in d.getVar("PACKAGE_ARCHS", True).split())
+
+ for pkgdatadir in (join(basedir, sys) for sys in dirs):
+ try:
+ files = listdir(pkgdatadir)
+ except OSError:
+ continue
+
+ for pn in filter(lambda f: not isdir(join(pkgdatadir, f)), files):
+ try:
+ pkgdata = read_pkgdatafile(join(pkgdatadir, pn))
+ except OSError:
+ continue
+
+ for pkg in pkgdata["PACKAGES"].split():
+ yield pkg, pn
+
+def pkgmap(d):
+ pkgmap_data = d.getVar("__pkgmap_data", False)
+ if pkgmap_data is None:
+ pkgmap_data = dict(__pkgmap(d))
+ d.setVar("__pkgmap_data", pkgmap_data)
+
+ return pkgmap_data
+
+def recipename(pkg, d):
+ return pkgmap(d).get(pkg)
+
+def pkgjoin(l):
+ return ' '.join(set(l))
+
+def pkgsplit(var, d):
+ return (d.getVar(var, True) or "").split()
+
+def __packages(features, d):
+ for feature in features:
+ for pkg in pkgsplit('IMAGE_FEATURE_%s' % feature, d):
+ yield pkg
+
+def required_packages(features, d):
+ for pkg in __packages((f for f in features if not
d.getVar("IMAGE_FEATURE_%s_OPTIONAL" % f, True)), d):
+ yield pkg
+
+def optional_packages(features, d):
+ for pkg in __packages((f for f in features if
d.getVar("IMAGE_FEATURE_%s_OPTIONAL" % f, True)), d):
+ yield pkg
+
+def active_packages(features, d):
+ from itertools import chain
+
+ for pkg in chain(required_packages(features, d),
optional_packages(features, d)):
+ yield pkg
+
+def active_recipes(features, d):
+ for pkg in active_packages(features, d):
+ recipe = recipename(pkg, d)
+ if recipe:
+ yield recipe
+
+def image_features_noextras(d):
+ for f in d.getVar("IMAGE_FEATURES", True).split():
+ if not f in ('dbg', 'dev', 'doc'):
+ yield f
+
+def dbg_packages(d):
+ from itertools import chain
+
+ features = image_features_noextras(d)
+ return pkgjoin("%s-dbg" % pkg for pkg in chain(active_packages(features,
d), active_recipes(features, d)))
+
+__PACKAGE_INSTALL = "${@' '.join(required_packages(d.getVar('IMAGE_FEATURES',
True).split(), d))}"
+PACKAGE_INSTALL = "${__PACKAGE_INSTALL}"
+PACKAGE_INSTALL_ATTEMPTONLY = "${@'
'.join(optional_packages(d.getVar('IMAGE_FEATURES', True).split(), d))}"
+
+IMAGE_FEATURES ?= ""
+IMAGE_FEATURES_prepend = "base "
+
+# Define our default available image features
+IMAGE_FEATURE_base = "${IMAGE_INSTALL} ${IMAGE_BOOT}"
+IMAGE_FEATURE_vmlinux = "kernel-vmlinux"
+
+IMAGE_FEATURE_dbg = "$...@dbg_packages(d)}"
+IMAGE_FEATURE_dbg_OPTIONAL = "1"
+IMAGE_FEATURE_dev = "$...@pkgjoin('%s-dev' % pn for pn in
active_recipes(image_features_noextras(d), d))}"
+IMAGE_FEATURE_dev_OPTIONAL = "1"
+IMAGE_FEATURE_doc = "$...@pkgjoin('%s-doc' % pn for pn in
active_recipes(image_features_noextras(d), d))}"
+IMAGE_FEATURE_doc_OPTIONAL = "1"
+
do_rootfs[nostamp] = "1"
do_rootfs[dirs] = "${TOPDIR}"
do_build[nostamp] = "1"
_______________________________________________
Openembedded-devel mailing list
[email protected]
http://lists.linuxtogo.org/cgi-bin/mailman/listinfo/openembedded-devel