[oe] [PATCH] image, rootfs_ipk: implement IMAGE_FEATURES
Christopher Larson
clarson at mvista.com
Tue Jan 19 22:07:44 UTC 2010
On Jan 19, 2010, at 2:56 PM, Chris Larson wrote:
>
> 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 at mvista.com>
> ---
> classes/image.bbclass | 100 +++++++++++++++++++++++++++++++++++++++++++-
> classes/rootfs_ipk.bbclass | 2 +-
> 2 files changed, 99 insertions(+), 3 deletions(-)
>
> diff --git a/classes/image.bbclass b/classes/image.bbclass
> index 9dce609..fa7cc9e 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 16dd511..66bd7aa 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
> --
> 1.6.6
>
Erm, forgot to fix the IMAGE_VARS vs IMAGE_BOOT thing. Well, you get the idea :)
--
Chris Larson
Software Engineer
MontaVista Software, Inc.
Work: 480-517-5031
Home: 480-963-2636
Email: clarson AT mvista DOT com
Email: clarson AT kergoth DOT com
More information about the Openembedded-devel
mailing list