diff options
author | Christopher Larson <clarson@mvista.com> | 2010-01-19 11:56:27 +0000 |
---|---|---|
committer | Holger Hans Peter Freyther <zecke@selfish.org> | 2010-01-28 14:21:35 +0100 |
commit | 5a92a86e6567746f74a141445efc7f68658c9c4f (patch) | |
tree | d1491cfd120323c5ae82b9fb8d8e3808e0f2aea9 | |
parent | 6c827d6c799363a15f69840bef4734a61eee7173 (diff) | |
download | openembedded-5a92a86e6567746f74a141445efc7f68658c9c4f.tar.gz |
image, rootfs_ipk: implement IMAGE_FEATURES
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_VARS
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 one of these to an image, you can either append to IMAGE_FEATURES or override IMAGE_FEATURES.
Examples:
IMAGE_FEATURES_append = " dbg"
IMAGE_FEATURES = "base dbg vmlinux"
To add a new package group:
IMAGE_FEATURE_myfeature = "gstreamer python pulseaudio"
Signed-off-by: Chris Larson <clarson@mvista.com>
-rw-r--r-- | classes/image.bbclass | 100 | ||||
-rw-r--r-- | classes/rootfs_ipk.bbclass | 2 |
2 files changed, 99 insertions, 3 deletions
diff --git a/classes/image.bbclass b/classes/image.bbclass index 9dce609733..fa7cc9ee77 100644 --- a/classes/image.bbclass +++ b/classes/image.bbclass @@ -28,11 +28,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_staging" @@ -60,6 +59,7 @@ python () { bb.data.setVarFlag('do_rootfs', 'depends', deps, d) runtime_mapping_rename("PACKAGE_INSTALL", d) + runtime_mapping_rename("PACKAGE_INSTALL_ATTEMPTONLY", d) } # @@ -106,6 +106,102 @@ 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 ?= "base" + +# Define our default available image features +IMAGE_FEATURE_base = "${IMAGE_INSTALL} ${IMAGE_VARS}" +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" diff --git a/classes/rootfs_ipk.bbclass b/classes/rootfs_ipk.bbclass index 58e5f45ef5..1d3114858e 100644 --- a/classes/rootfs_ipk.bbclass +++ b/classes/rootfs_ipk.bbclass @@ -23,7 +23,7 @@ BAD_RECOMMENDATIONS ?= "" IPKG_VARIANT ?= "opkg" RDEPENDS_append = " ${@base_conditional("ONLINE_PACKAGE_MANAGEMENT", "none", "", "${IPKG_VARIANT} opkg-collateral", d)}" -PACKAGE_INSTALL_append = " ${@base_conditional("ONLINE_PACKAGE_MANAGEMENT", "none", "", "${IPKG_VARIANT} opkg-collateral", d)}" +IMAGE_INSTALL_append = " ${@base_conditional("ONLINE_PACKAGE_MANAGEMENT", "none", "", "${IPKG_VARIANT} opkg-collateral", d)}" fakeroot rootfs_ipk_do_rootfs () { set -x |