When you are working with YOCTO build system, you might be aware of the construct .bbclass.
For those who are not: these are code snippets which will be injected into the recipe itself. Mostly they add new tasks or provide some generalization for things you often. A good example might be pypi.bbclass. In your recipe you write usually something likes this
When it comes to python packages a way more elegant way is to use pypi.org.
And here does the pypi.bbclass provide some magic - you recipe will just look like this
the bbclass pypi will automatically translate the variable name PYPI_PACKAGE into a valid URL to fetch the package. Also it will set some internal variables such as HOMEPAGE or S to the correct settings. You see life can be convenient when you know how to do it.
If you want to apply a bbclass you can either insert
into each recipe or you can put it into your conf/local.conf. E.g. like this
Now imagine you're having a layer construction like this (cat conf/bblayers.conf)
which means hundreds of recipes, but most of these are written and maintained by somebody else.
So what can you do if you want a bbclass
this combined with
you can create magic. The function is executed on parsing the recipe by bitbake, so it would be obviously a good place to check if another class should be inherited here or not.
I wrote a small class here which simplifies this even further.
Now you can decide by global rules were to include some extra bbclass-magic.
E.g. (from conf/local.conf)
do include a bbclass named "foo.bbclass" into every recipe which is located under "meta-foo/recipes-foo" relative to your project root.
Another example
would inherit the bbclass "bar.bblass" into each recipe which is licensed under GPL.
Last example
this would inherit bar.bbclass into each recipe which requires python3.
Also you can combine these rules to make even more complex scenarios.
So I hope this will help you using more of the power from bbclasses.
For those who are not: these are code snippets which will be injected into the recipe itself. Mostly they add new tasks or provide some generalization for things you often. A good example might be pypi.bbclass. In your recipe you write usually something likes this
SRC_URI = "https://www.foo.org/foo.tar.gz"
When it comes to python packages a way more elegant way is to use pypi.org.
And here does the pypi.bbclass provide some magic - you recipe will just look like this
inherit pypi
PYPI_PACKAGE = "foo"
the bbclass pypi will automatically translate the variable name PYPI_PACKAGE into a valid URL to fetch the package. Also it will set some internal variables such as HOMEPAGE or S to the correct settings. You see life can be convenient when you know how to do it.
If you want to apply a bbclass you can either insert
inherit foo.bbclass
into each recipe or you can put it into your conf/local.conf. E.g. like this
# - 'buildstats' collect build statistics# - 'image-mklibs' to reduce shared library files size for an image# - 'image-prelink' in order to prelink the filesystem image# NOTE: if listing mklibs & prelink both, then make sure mklibs is before prelink# NOTE: mklibs also needs to be explicitly enabled for a given image, see local.conf.extendedUSER_CLASSES ?= "buildstats image-mklibs image-prelink"INHERIT += "rm_work"
Now imagine you're having a layer construction like this (cat conf/bblayers.conf)
# POKY_BBLAYERS_CONF_VERSION is increased each time build/conf/bblayers.conf# changes incompatiblyPOKY_BBLAYERS_CONF_VERSION = "2"
BBPATH = "${TOPDIR}"BBFILES ?= ""
BBLAYERS ?= " \ /media/disk/meta-sca \ /media/disk/meta-buildutils \ /media/disk/meta-clang \ /media/disk/poky/meta \ /media/disk/poky/meta-poky \ /media/disk/poky/meta-yocto-bsp \ /media/disk/poky/build/workspace \ "
So what can you do if you want a bbclass
- applied only to your layer?
- only applied to recipes of a certain license?
- only applied if the recipe is depending on a certain packages?
When I got into this problem I started digging through the bitbake-code itself and found a nice little function called "inherit" to be found at
from bb.parse.parse_py import BBHandler
this combined with
python __anonymous() {
}
you can create magic. The function is executed on parsing the recipe by bitbake, so it would be obviously a good place to check if another class should be inherited here or not.
I wrote a small class here which simplifies this even further.
Now you can decide by global rules were to include some extra bbclass-magic.
E.g. (from conf/local.conf)
# NOTE: if listing mklibs & prelink both, then make sure mklibs is before prelink# NOTE: mklibs also needs to be explicitly enabled for a given image, see local.conf.extendedUSER_CLASSES ?= "buildstats image-mklibs image-prelink"INHERIT += "rm_work auto-inherit"AUTO_INHERIT_CONF = "BBClass=foo;props=[auto_inherit_is_at_path(d,'meta-foo/recipes-foo/',False)]"
Another example
# NOTE: if listing mklibs & prelink both, then make sure mklibs is before prelink# NOTE: mklibs also needs to be explicitly enabled for a given image, see local.conf.extendedUSER_CLASSES ?= "buildstats image-mklibs image-prelink"INHERIT += "rm_work auto-inherit"AUTO_INHERIT_CONF = "BBClass=bar;props=[auto_inherit_license(d,'GPL.*')]"
Last example
# NOTE: if listing mklibs & prelink both, then make sure mklibs is before prelink# NOTE: mklibs also needs to be explicitly enabled for a given image, see local.conf.extendedUSER_CLASSES ?= "buildstats image-mklibs image-prelink"INHERIT += "rm_work auto-inherit"AUTO_INHERIT_CONF = "BBClass=bar;props=[auto_inherit_contains_package(d,'python3')]"
Also you can combine these rules to make even more complex scenarios.
So I hope this will help you using more of the power from bbclasses.
Kommentare
Kommentar veröffentlichen