To build the project on the host independently of Yocto first clone the example repository
Following a successful compilation you will have a number of new files in the root of the build folder.
Adding new recipes to the build system
There are different ways to add new recipes to Yocto.
One way is to simply create a new recipe_version.bb file in a recipe-foo/recipe
folder within one of the existing layers used by Yocto.
Placing a recipe in an existing layer (example only)
For example you could
$ cd ~/yocto/poky-jethro-14.0.0/meta-yocto
$ mkdir recipes-example
$ cd recipes-example
$ mkdir bbexample
$ cd bbexample
$ wget https:
The recipe will then be picked up by bitbake and you can build the recipe with
$ cd ~/yocto/poky-jethro-14.0.0/build-qemux86
$ bitbake bbexample
Using a new layer for recipes
A preferred method for adding recipes to the build environment, and the method you should use with this guide, is to place them within a new layer.
Layers isolate particular sets of build meta-data based on machine, functionality or similar, and help to keep the environment clean.
An example layer, meta-example, has been created using the yocto-layer
command and committed into a GitHub repository here.
To use a new layer such as this you first clone the git repository and then add the layer to your bitbake configuration in conf/bblayers.conf
.
$ cd ~/yocto/poky-jethro-14.0.0
$ git clone https:
$ cd ~/yocto/poky-jethro-14.0.0/build_qemux86
$ nano conf/bblayers.conf
Your bblayers.conf
should look similar to this
# LAYER_CONF_VERSION is increased each time build/conf/bblayers.conf
# changes incompatibly
LCONF_VERSION = "6"
BBPATH = "${TOPDIR}"
BBFILES ?= ""
BBLAYERS ?= " \
/home/user/yocto/poky-jethro-14.0.0/meta \
/home/user/yocto/poky-jethro-14.0.0/meta-yocto \
/home/user/yocto/poky-jethro-14.0.0/meta-yocto-bsp \
"
BBLAYERS_NON_REMOVABLE ?= " \
/home/user/yocto/poky-jethro-14.0.0/meta \
/home/user/yocto/poky-jethro-14.0.0/meta-yocto \
"
Make the new layer visible to bitbake
by adding a line to BBLAYERS
<code> BBLAYERS ?= " \
/home/user/yocto/poky-jethro-14.0.0/meta \
/home/user/yocto/poky-jethro-14.0.0/meta-yocto \
/home/user/yocto/poky-jethro-14.0.0/meta-yocto-bsp \
/home/user/yocto/poky-jethro-14.0.0/meta-example \
" </code>
Now bitbake
can see the recipes in the new layer.
You will also see when bitbake
runs and shows the Build Configuration that the repository branch and hash of your layer is shown which is useful to know, particularly when comparing notes with others as to why a build fails, e.g.
Build Configuration:
BB_VERSION = "1.22.0"
BUILD_SYS = "i686-linux"
NATIVELSBSTRING = "Ubuntu-12.04"
TARGET_SYS = "i586-poky-linux"
MACHINE = "qemux86"
DISTRO = "poky"
DISTRO_VERSION = "1.6"
TUNE_FEATURES = "m32 i586"
TARGET_FPU = ""
meta
meta-yocto
meta-yocto-bsp = "<unknown>:<unknown>"
meta-example = "master:5ee4f20b041bc886b1d2d913ac11814057317634"
Build an example package based on a git repository commit
The bbexample recipe
The recipe we are going to build is <a href="https://github.com/DynamicDevices/meta-example/blob/master/recipes-example/bbexample/bbexample_1.0.bb">/home/user/yocto/poky-jethro-14.0.0/meta-example/recipes-example/bbexample/bbexample_1.0.bb</a>
.
The main points to note are that
SRC_URI
is set to point to the git repository SRC_REV
corresponds to a particular commit into that repository (it is also possible to specify a branch) - There is a
LICENSE
variable defined to indicate the type of license to the build environment (MIT) and another variable, LIC_FILES_CHKSUM
, points to a file, or files, within the source tree that will be retrieved, with a corresponding md5 check-sum to ensure that somebody has actually verified the source license file corresponds to that given to the build environment. Also that this file, and thus potentially the license, has not changed over time. - The source directory for the recipe build,
${S}
is set to "${WORKDIR}/git"
which is the default location to which the retrieved git repository will be checked out and unpacked. - We inherit a class called
autotools
which provides the functionality to enable <code>bitbake</code> to automatically build projects with autotools
support. - There is a marked absence of a
do_install
function, which you may have seen elsewhere, as this is dealt with by the autotools
support
To start the build
$ bitbake bbexample
Bitbake
will work through a number of tasks, including fetching the source from the git repository, unpacking, configuring, compiling, installing and packaging the output.
As we are building for the emulator, qemux86
, and are building RPM packages (the default), output packages will be in
~/yocto/poky-jethro-14.0.0/build_qemux86/tmp/deploy/rpm/i586/bbexample-1.0-r0.0.i586.rpm
For other machine targets the folder and suffix i586
will be replaced by a different machine-specific name. To find the location of the package you can use
$ cd ~/yocto/poky-jethro-14.0.0/build_qemux86/tmp/deploy/rpm
$ find -name bbexample*
(Or instead of bbexample
use a prefix of the name of the recipe you are building)
This will show you both the main package and the subsidiary packages which bitbake
builds for each recipe such as -dev
, -debug
, -staticdev
and so forth. For more on this see here.
Having found the package you can check that the contents are as expected with
$ cd ~/yocto/poky-jethro-14.0.0/build_qemux86/tmp/deploy/rpm
$ rpm -qlp i586/bbexample-1.0-r0.0.i586.rpm
For the bbexample
recipe we expect to see the cross-compiled executable bbexample
and the shared library it needs libbbexample.so.1
/usr
/usr/bin
/usr/bin/bbexample
/usr/lib
/usr/lib/libbbexample.so.1
/usr/lib/libbbexample.so.1.0.0
You could then add the output of this recipe to your output image by adding something like this to your conf/local.conf
IMAGE_INSTALL_append = " bbexample"
Alternatively you could make the new packages available to existing target systems using the Yocto package-management
tools such as smart
.
If you wish to build and test your example on the emulator skip forward to [[#Testing the example on a target]]
Build an example package based on a remote source archive
The recipe we are going to build is <a href="https://github.com/DynamicDevices/meta-example/blob/master/recipes-example/bbexample/bbexample-rt_1.0.bb">/home/user/yocto/poky-jethro-14.0.0/meta-example/recipes-example/bbexample/bbexample-rt_1.0.bb</a>
.
This is based on the previous recipe that builds from a git checkout, with the major difference being we are building from a remote tarball.
This tarball may, in theory, contain any sources we wish to build, although sometimes build failures may require patching of the sources, and if autotools
is not provided then the recipe may well have to be extended with a do_install
function to ensure appropriate files are installed, and the FILES_${PN}
variable modified to ensure installed files are correctly packaged.
We are using a release archived that was manually uploaded to GitHub. The archive corresponds to the bbexample
source code tagged at v1.0
. This is the preferred approach to using dynamically generated GitHub archives, as the checksums of these archives can change intermittently when they are regenerated. Manually uploaded archives will not change.
This tagged archive is what we set in the recipe SRC_URI
to retrieve and build.
The main points to note are that
SRC_URI
is set to point to the remote source archive
SRC_URI = "https://github.com/DynamicDevices/bbexample/releases/download/v1.0/bbexample-${PV}.tar.gz"
Ideally we would use both of the variables ${PN}
and ${PV}
which would be replaced by the recipe name and recipe version, and could usually be expected to map to the naming convention employed for the source archive file. This makes the recipe more generic and easier to update to a new version of the source code by renaming the recipe .bb file. However as I am using a slightly different recipe name, bbexample-rt
I have hard-coded the names here.
- There is no
SRC_REV
here but instead we have SRC_URI
values for md5sum and an sha256sum check-sums. As you would expect, these correspond to the particular check-sums generated by those algorithms when run over the entire archive.
- You can generate these by hand by retrieving the file yourself, running
md5sum archivename
and sha256sum archivename
but it is easier to set these incorrectly and let bitbake
retrieve the archive and error on incorrect check-sums and which point it will tell you what the values should be. e.g.
SRC_URI[md5sum] = "e15723f0d5ac710bbe788cd3a797bc44"
SRC_URI[sha256sum] = "0b34eb133596348bb6f1a3ef5e05e4d5bf0c88062256affe768d8337d7cc8f83"
- You should be aware that sometimes maintainers re-release archives under the same name but with updated contents. Should this happen the check-sum check will fail and you will have to look into whether this is because of a corrupted download (check the downloaded archive in
~/yocto/poky-jethro-14.0.0/build_qemux86/downloads
) or because the archive has actually been changed.
- There is a
LICENSE
variable defined to indicate the type of license to the build environment (MIT) and another variable, LIC_FILES_CHKSUM
, points to a file within the source tree that will be retrieved, with a corresponding md5 check-sum to ensure that somebody has actually verified the source license file corresponds to that given to the build environment. Also that this file, and thus potentially the license, has not changed over time. - The source directory for the recipe build,
${S}
is set to S = "${WORKDIR}/bbexample-${PV}
which corresponds to the path to the source-code when extracted from the archive uploaded to GitHub.
# Make sure our source directory (for the build) matches the directory structure in the tarball
S = "${WORKDIR}/bbexample-${PV}"
- We inherit a class called
autotools
which provides the functionality to enable bitbake
to automatically build projects with autotools
support. - There is a marked absence of a
do_install
function, which you may have seen elsewhere, as this is dealt with by the autotools
support
Clean out any existing bbexample files with
$ bitbake -f -c cleansstate bbexample
To start the build
$ bitbake bbexample-rt
Bitbake
will work through a number of tasks, including fetching the source archive, unpacking, configuring, compiling, installing and packaging the output.
There may be some warnings shown as all three recipes bbexample
, bbexample-rt
and bbexample-lt
are generating the same output and thus there is some collision of shared files. These warnings may be ignored.
As we are building for the emulator, qemux86
, and are building RPM packages (the default), output packages will be in
~/yocto/poky-jethro-14.0.0/build_qemux86/tmp/deploy/rpm/i586/bbexample-rt-1.0-r0.0.i586.rpm
For other machine targets the folder and suffix i586
will be replaced by a different machine-specific name. To find the location of the package you can use
$ cd ~/yocto/poky-jethro-14.0.0/build_qemux86/tmp/deploy/rpm
$ find -name bbexample-rt*
(Or instead of bbexample-rt
use a prefix of the name of the recipe you are building)
This will show you both the main package and the subsidiary packages which bitbake
builds for each recipe such as -dev
, -debug
, -staticdev
and so forth. For more on this see here.
Having found the package you can check that the contents are as expected with
$ cd ~/yocto/poky-jethro-14.0.0/build_qemux86/tmp/deploy/rpm
$ rpm -qlp i586/bbexample-rt-1.0-r0.0.i586.rpm
For the bbexample-rt
recipe we expect to see the cross-compiled executable bbexample
and the shared library it needs libbbexample.so.1
/usr
/usr/bin
/usr/bin/bbexample
/usr/lib
/usr/lib/libbbexample.so.1
/usr/lib/libbbexample.so.1.0.0
You could then add the output of this recipe to your output image by adding something like this to your conf/local.conf
.
IMAGE_INSTALL_append = " bbexample-rt"
Alternatively you could make the new packages available to existing target systems using the Yocto package-management
tools such as smart
.
If you wish to build and test your example on the emulator skip forward to [[#Testing the example on a target]]
Build an example package based on a local source archive
The recipe we are going to build is <a href="https://github.com/DynamicDevices/meta-example/blob/master/recipes-example/bbexample/bbexample-lt_1.0.bb">/home/user/yocto/poky-jethro-14.0.0/meta-example/recipes-example/bbexample/bbexample-lt_1.0.bb</a>
.
This is based on the previous recipe that builds from a remote source release, with the major difference being we are building from a local source tarball.
This tarball may, in theory, contain any sources we wish to build, although sometimes build failures may require patching of the sources, and if autotools
is not provided then the recipe may well have to be extended with a do_install
function to ensure appropriate files are installed, and the FILES_${PN}
variable modified to ensure installed files are correctly packaged.
For this simple example the release source archive we uploaded to GitHub has been copied locally into the meta-example
layer folder tree, yocto/poky-jethro-14.0.0/meta-example/recipes-example/bbexample/bbexample-lt-1.0/bbexample-v1.0.tar.gz
This local file is what we set in the recipe SRC_URI
to copy across, unpack, patch (if necessary) and build.
The main points to note are that
SRC_URI
is set to point to a local file archive
SRC_URI = "file://bbexample-${PV}.tar.gz"
- Ideally we would use both of the variables
${PN}
and ${PV}
which would be replaced by the recipe name and recipe version, and could usually be expected to map to the naming convention employed for the source archive file. This makes the recipe more generic and easier to update to a new version of the source code by renaming the recipe .bb file. However as I am using a slightly different recipe name, bbexample-lt
I have hard-coded the names here.
- We provide a search path to ensure
bitbake
can find the archive
<code><code>FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}-${PV}:"</code></code>
In this case the above will expand to the following folder, which is where we have placed bbexample-1.0.tar.gz
, and thus bitbake
will find it to unpack ~/yocto/poky-jethro-14.0.0/meta-example/recipes-example/bbexample/bbexample-lt-1.0
- There is no
SRC_REV
here or check-sum for the local archive. - There is a
LICENSE
variable defined to indicate the type of license to the build environment (MIT) and another variable, LIC_FILES_CHKSUM,
points to a file within the source tree that will be retrieved, with a corresponding md5 check-sum to ensure that somebody has actually verified the source license file corresponds to that given to the build environment. Also that this file, and thus potentially the license, has not changed over time.
- The source directory for the recipe build,
${S}
is set to "bbexample-${PV}"
which corresponds to the path to the source-code when extracted from the local archive.
# Make sure our source directory (for the build) matches the directory structure in the tarball
S = "${WORKDIR}/bbexample-${PV}"
- We inherit a class called
autotools
which provides the functionality to enable bitbake
to automatically build projects with autotools
support. - There is a marked absence of a
do_install
function, which you may have seen elsewhere, as this is dealt with by the autotools
support
Clean out any existing bbexample files with
$ bitbake -f -c cleansstate bbexample bbexample-rt
To start the build
$ bitbake bbexample-lt
Bitbake
will work through a number of tasks, including fetching the source archive from the local file-system, unpacking, configuring, compiling, installing and packaging the output.
There may be some warnings shown as all three recipes bbexample
, bbexample-rt
and
bbexample-lt
are generating the same output and thus there is some collision of shared files. These warnings may be ignored.
As we are building for the emulator, qemux86
and are building RPM packages (the default), output packages will be in ~/yocto/poky-jethro-14.0.0/build_qemux86/tmp/deploy/rpm/i586/bbexample-lt-1.0-r0.0.i586.rpm
For other machine targets the folder and suffix i586
will be replaced by a different machine-specific name. To find the location of the package you can use
$ cd ~/yocto/poky-jethro-14.0.0/build_qemux86/tmp/deploy/rpm
$ find -name bbexample-lt*
(Or instead of bbexample-lt
use a prefix of the name of the recipe you are building)
This will show you both the main package and the subsidiary packages which bitbake
builds for each recipe such as -dev
, -debug
, -staticdev
and so forth. For more on this see here.
Having found the package you can check that the contents are as expected with
$ cd ~/yocto/poky-jethro-14.0.0/build_qemux86/tmp/deploy/rpm
$ rpm -qlp i586/bbexample-lt-1.0-r0.0.i586.rpm
For the bbexample-lt
recipe we expect to see the cross-compiled executable bbexample
and the shared library it needs libbbexample.so.1
/usr
/usr/bin
/usr/bin/bbexample
/usr/lib
/usr/lib/libbbexample.so.1
/usr/lib/libbbexample.so.1.0.0
You could then add the output of this recipe to your output image by adding something like this to your conf/local.conf
IMAGE_INSTALL_append = " bbexample-lt"
Alternatively you could make the new packages available to existing target systems using the Yocto package-management
tools such as smart
.
If you wish to build and test your example on the emulator skip forward to Testing the example on a target
Testing the example on an emulated target
To to this we first want to add the appropriate recipe to an image and then run up that image in our emulator target. We could of course be targeting a real board, but with the wide variety of boards available this is outside the scope of this guide, and you should consult the documentation provided by your board vendor.
Adding a package to an image via local.conf
There are a couple of ways (at least!) to add a new package to an image. The simplest is to add the package to a variable within your local.conf
.
$ cd ~/yocto/poky-jethro-14.0.0/build_qemux86/
$ nano conf/local.conf
Add a line at the bottom. You may wish to use bbexample-rt
or bbexample-lt
instead of bbexample
. There should be no different in the output files.
IMAGE_INSTALL_append = " bbexample"
Then bitbake
an image of your choice. With this method any image you build will have the bbexample
package added to it.
Clean out any existing bbexample files with
$ bitbake -f -c cleansstate bbexample bbexample-rt bbexample-lt
Then build
$ bitbake core-image-minimal
Adding a package to an image via a .bbappend
Alternatively you may wish to add specific packages to specific images, which is generally viewed as better practice. We are using core-image-minimal
for this guide. The recipe for this image can be found in ~/yocto/poky-jethro-14.0.0/meta/recipes-core/images/core-image-minimal.bb
We are also using our own new meta-example
layer, so this seems an appropriate place to add a .bbappend
to extend the original core-image-minimal
recipe.
We need to recreate the path to the original recipe in our own layer, so
<code> $ cd ~/yocto/poky-jethro-14.0.0/meta-example
$ mkdir -p recipes-core/images
$ cd recipes-core.images
$ nano core-image-minimal.bbappend </code>
Add the following line to your empty new file
IMAGE_INSTALL += " bbexample"
(Ensure that you no longer have bbexample
in your conf/local.conf
. It won't break the build but you want to be sure your .bbappend
is working correctly)
Now build the image
$ cd ~/yocto/poky-jethro-14.0.0/build_qemux86
$ bitbake core-image-minimal
Running the image in the emulator
To run up the image, simply use
$ runqemu qemux86
This will boot the emulator, load up the image, you'll see a kernel loading and with core-image-minimal
a console prompt. If you were building, say core-image-sato
instead you would see a basic user interface.
If you find that your keymap is incorrect you might wish to set this explicitly, for example
$ runqemu qemux86 qemuparams='-k en-gb'
or
$ runqemu qemux86 qemuparams='-k en-us'
Log into the emulator as 'root', no password and run the example
$ bbexample
You will see the Hello World output!
Recipe Gotchas
Incorrect source folder ${S}
It is extremely important to make sure that the source folder, the ${S}
variable is set correctly.
When retrieving files from git repositories, or when archives are unpacked, it is entirely possible that the source folder default will not be correct for the actual unpacked location of the sources.
If this happens the build will fail, often with a message that the LICENSE
file cannot be found, as this is checked early on in the unpack.
To check through this one option is to drop into a development shell with
$ bitbake -c devshell recipename
This will drop you into the configured location of ${S}
. If the sources defined in SRC_URI
seemed to be retrieved correctly but you see nothing in your devshell, excepting perhaps a patches
folder, this is a good indication that the code has been unpacked into a different folder.
$ cd ..
$ ls
You often will see another folder in the directory level about ${S}
which contains the source code.
This being the case you need to exit your devshell and edit your recipe to modify the source directory to point to the correct location. e.g.
${S} = "${WORKDIR}/correctfoldername"
Dropping back into the devshell should then show the correct files, and you should be able to make progress with the build.
Incorrect license checksum
This can occur, particularly when upgrading a recipe to use a new repository commit or source archive version, as the licensing file may have changed.
If this does occur it is important to check through the new licensing file to ensure that the build environment is still being given correct information on the type of license for the source code.
It may also be that a minor textual change has been made to the file (e.g. new copyright date) which doesn't affect the type of the license itself.
Having satisfied yourself that the LICENSE
variable in the recipe reports the correct license type you can update the license checksum to that reported by bitbake
by modifying LIC_FILES_CHKSUM
Incorrect source archive checksum
You should be aware that sometimes maintainers re-release archives under the same name but with updated contents. Should this happen the check-sum check will fail and you will have to look into whether this is because of a corrupted download (check the downloaded archive in ~/yocto/poky-jethro-14.0.0/build_qemux86/downloads
) or because the archive has actually been changed.
- You can try removing the archive from the downloads folder, and the corresponding .done file. The archive will then be downloaded again which may work if there was a corrupt/interrupted download (although in my experience this occurrence is unlikely).
- Alternatively the archive may have changed and you may wish to use the new archive, in which case you will need to update the check-sums in the recipe to those you calculate yourself on the archive with
md5sum
and sha256sum
or simply use what bitbake
calculates and provides for you in the log.
SRC_URI[md5sum] = "???"
SRC_URI[sha256sum] = "???"
- Lastly you may be able to source the correct archive file from a mirror or through Googling, in which case you can drop it into the
downloads
folder for use by bitbake
.
- In the latter two cases you may wish to feed the issue back to the Yocto mailing list (or other relevant mailing list for the layer in which the recipe resides) as this type of thing means mirrored copies of primary sources become out of sync, and the layer/mirror maintainers may wish to address the issue.
Missing source archive
This is less of an issue than it has been in the past as primary sources are now mirrored in one or more locations, not least by the Yocto project itself in some cases.
You can also set up your own mirror sources, which is dealt with [[How_do_I#Q:How do I create my own source download mirror? | here]]
However for a one-off missing archive it is often quickest and easiest to Google to find it, then drop it into the ~/yocto/poky-jethro-14.0.0/build_qemux86/downloads
folder, creating an empty .done
file with
$ touch archivename.done
It should then be picked up and used by bitbake
Feedback
This is a living document. Please feel free to send comments, questions, corrections to Alex Lennon here.
The original article is hosted here.