Yocto Slides
Yocto Slides
Yocto Slides
Corrections, suggestions, contributions and translations are welcome! embedded Linux and kernel engineering
Send them to feedback@bootlin.com
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 1/300
Rights to copy
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 2/300
Hyperlinks in the document
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 3/300
Company at a glance
https://elixir.bootlin.com
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 5/300
Generic course information
Generic course
information
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 6/300
Two supported hardware platforms
Two variants for this course, each using a different hardware platform.
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 7/300
Shopping list: BeagleBone Black Wireless variant
562?qs=k%2Fsw%252B3Yi%2FUbELBjXQpiBUQ%3D%3D
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 8/300
Shopping list: STM32MP1 Discovery Kit variant
DK1?qs=9r4v7xj2LnkgRwGGD4%252BIjQ%3D%3D
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 9/300
Supported hardware
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 10/300
Supported hardware
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 11/300
Course outline - Day 1
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 12/300
Course outline - Day 2
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 13/300
Course outline - Day 3
Images and packagegroups details, advanced concepts, SDK and runtime package
management.
▶ Adding a custom image.
▶ Further recipes concepts.
▶ Rootfs generation.
▶ Using the Yocto Project SDK.
▶ Runtime package management.
Labs: create a custom image, develop your application in the Poky SDK.
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 14/300
Participate!
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 15/300
Practical lab guidelines
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 16/300
Advise: write down your commands!
During practical labs, write down all your commands in a text file.
▶ You can save a lot of time re-using commands Lab commands
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 17/300
Cooperate!
As in the Free Software and Open Source community, cooperation during practical labs
is valuable in this training session:
▶ If you complete your labs before other people, don’t hesitate to help other people
and investigate the issues they face. The faster we progress as a group, the more
time we have to explore extra topics.
▶ Explain what you understood to other participants when needed. It also helps to
consolidate your knowledge.
▶ Don’t hesitate to report potential bugs to your instructor.
▶ Don’t hesitate to look for solutions on the Internet as well.
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 18/300
Command memento sheet
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 19/300
vi basic commands
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 20/300
Practical lab - Training Setup
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 21/300
Introduction to Embedded Linux
Introduction to
Embedded Linux
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 22/300
Simplified Linux system architecture
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 23/300
Overall Linux boot sequence
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 24/300
Embedded Linux work
▶ BSP work: porting the bootloader and Linux kernel, developing Linux device
drivers.
▶ system integration work: assembling all the user space components needed for
the system, configure them, develop the upgrade and recovery mechanisms, etc.
▶ application development: write the company-specific applications and libraries.
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 25/300
Complexity of user space integration
ALL
xlib_libXrandr harfbuzz xlib_libXcursor xlib_libXdamage xlib_libXi xlib_libXinerama xproto_xcmiscproto xlib_libXres xlib_libXxf86vm xproto_xf86dgaproto mcookie xdata_xbitmaps xproto_bigreqsproto xproto_compositeproto xproto_glproto xkeyboard-config xproto_videoproto xlib_libxkbfile
xproto_randrproto cairo xproto_damageproto xlib_libXfixes xlib_libXft xproto_xineramaproto xproto_resourceproto xproto_xf86vidmodeproto host-xapp_xkbcomp xfont_font-cursor-misc xfont_font-misc-misc xfont_font-alias
xlib_libXrender xproto_fixesproto gdk-pixbuf fontconfig xlib_libXext host-xlib_libxkbfile host-xapp_mkfontdir host-xapp_bdftopcf host-xfont_font-util xfont_font-util
glibc host-gdk-pixbuf xproto_xf86bigfontproto xproto_xextproto xproto_inputproto xproto_kbproto freetype libxcb xlib_xtrans host-libxcb xfont_encodings xproto_fontsproto host-xproto_xf86bigfontproto host-xproto_inputproto host-xproto_kbproto host-xproto_xextproto host-xlib_xtrans host-xfont_encodings host-xproto_fontsproto
linux-headers host-gcc-initial host-gawk host-libglib2 libpng libpthread-stubs xcb-proto host-xcb-proto host-intltool xlib_libfontenc xlib_libXdmcp xlib_libXau host-libxslt host-libpthread-stubs host-xapp_mkfontscale xproto_presentproto
host-binutils libffi host-libffi host-gettext host-libpng zlib host-python host-libxml-parser-perl xproto_xproto xutil_util-macros host-libxml2 host-freetype host-xlib_libfontenc host-xlib_libXau host-xlib_libXdmcp
host-gmp host-libtool
host-m4
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 26/300
System integration: several possibilities
Pros Cons
Building everything manually Full flexibility Dependency hell
Learning experience Need to understand a lot of details
Version compatibility
Lack of reproducibility
Binary distribution Easy to create and extend Hard to customize
Debian, Ubuntu, Fedora, etc. Hard to optimize (boot time, size)
Hard to rebuild the full system from source
Large system
Uses native compilation (slow)
No well-defined mechanism to generate an
image
Lots of mandatory dependencies
Not available for all architectures
Build systems Nearly full flexibility Not as easy as a binary distribution
Buildroot, Yocto, PTXdist, etc. Built from source: customization and op- Build time
timization are easy
Fully reproducible
Uses cross-compilation
Have embedded specific packages not nec-
essarily in desktop distros
Make more features optional
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 27/300
Embedded Linux build system: principle
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 29/300
Yocto Project and Poky reference system overview
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 30/300
Yocto Project and Poky reference system overview
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 31/300
About
▶ The Yocto Project is a set of templates, tools and methods that allow to build
custom embedded Linux-based systems.
▶ It is an open source project initiated by the Linux Foundation in 2010 and is still
managed by one of its fellows: Richard Purdie.
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 32/300
The Yocto Project lexicon
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 33/300
The Yocto Project lexicon
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 34/300
The Yocto Project lexicon
▶ Organization of OpenEmbedded-Core:
▶ Recipes describe how to fetch, configure, compile and package applications and
images. They have a specific syntax.
▶ Layers are sets of recipes, matching a common purpose. For Texas Instruments
board support, the meta-ti layer is used.
▶ Multiple layers are used within a same distribution, depending on the requirements.
▶ It supports the ARM, MIPS (32 and 64 bits), PowerPC, RISC-V and x86 (32 and 64
bits) architectures.
▶ It supports QEMU emulated machines for these architectures.
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 35/300
The Yocto Project lexicon
▶ The Yocto Project is not used as a finite set of layers and tools.
▶ Instead, it provides a common base of tools and layers on top of which custom
and specific layers are added, depending on your target.
▶ The main required element is Poky, the reference system which includes
OpenEmbedded-Core. Other available tools are optional, but may be useful in
some cases.
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 36/300
Example of a Yocto Project based BSP
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 37/300
Yocto Project and Poky reference system overview
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 38/300
Download the Poky reference system
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 39/300
Poky
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 40/300
Poky source tree 1/2
bitbake/ Holds all scripts used by the BitBake command. Usually matches the
stable release of the BitBake project.
documentation/ All documentation sources for the Yocto Project documentation. Can
be used to generate nice PDFs.
meta/ Contains the OpenEmbedded-Core metadata.
meta-skeleton/ Contains template recipes for BSP and kernel development.
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 41/300
Poky source tree 2/2
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 42/300
Documentation
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 43/300
Using Yocto Project - basics
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 44/300
Using Yocto Project - basics
Environment setup
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 45/300
Environment setup
▶ All Poky files are left unchanged when building a custom image.
▶ Specific configuration files and build repositories are stored in a separate build
directory.
▶ A script, oe-init-build-env, is provided to set up the build directory and the
environment variables (needed to be able to use the bitbake command for
example).
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 46/300
oe-init-build-env
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 47/300
Common targets
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 48/300
Exported environment variables
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 49/300
Available commands
bitbake The main build engine command. Used to perform tasks on available
recipes (download, configure, compile…).
bitbake-* Various specific commands related to the BitBake build engine.
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 50/300
The build/ directory 1/2
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 51/300
The build/ directory 2/2
tmp/buildstats/ Build statistics for all packages built (CPU usage, elapsed time, host,
timestamps…).
tmp/deploy/ Final output of the build.
tmp/deploy/images/ Contains the complete images built by the OpenEmbedded build
system. These images are used to flash the target.
tmp/work/ Set of specific work directories, split by architecture. They are used to
unpack, configure and build the packages. Contains the patched sources,
generated objects and logs.
tmp/sysroots/ Shared libraries and headers used to compile applications for the target
but also for the host.
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 52/300
Using Yocto Project - basics
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 53/300
The build/conf/ directory
▶ The conf/ directory in the build one holds build specific configuration.
bblayers.conf Explicitly list the available layers.
local.conf Set up the configuration variables relative to the current user for the
build. Configuration variables can be overridden there.
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 54/300
Configuring the build
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 55/300
Using Yocto Project - basics
Building an image
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 56/300
Compilation
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 57/300
Practical lab - First Yocto build
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 58/300
Using Yocto Project - advanced usage
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 59/300
Advanced build usage and configuration
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 60/300
A little reminder
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 61/300
Using Yocto Project - advanced usage
Advanced configuration
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 62/300
Overview
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 63/300
Methods and conditions 1/4
▶ Append the keyword _append to a configuration variable to add values after the
ones previously defined (without space).
▶ IMAGE_INSTALL_append = " dropbear" adds dropbear to the packages installed
on the image.
▶ Append the keyword _prepend to add values before the ones previously defined
(without space).
▶ FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" adds the folder to the set of
paths where files are located (in a recipe).
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 64/300
Methods and conditions 2/4
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 65/300
Methods and conditions 3/4
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 66/300
Methods and conditions 4/4
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 67/300
Operators 1/2
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 68/300
Operators 2/2
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 69/300
Using Yocto Project - advanced usage
Packages variants
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 70/300
Introduction to package variants
▶ Some packages have the same purpose, and only one can be used at a time.
▶ The build system uses virtual packages to reflect this. A virtual package
describes functionalities and several packages may provide it.
▶ Only one of the packages that provide the functionality will be compiled and
integrated into the resulting image.
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 71/300
Variant examples
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 72/300
Package selection
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 73/300
Version selection
▶ By default, Bitbake will try to build the provider with the highest version number,
unless the recipe defines DEFAULT_PREFERENCE = "-1"
▶ When multiple package versions are available, it is also possible to explicitly pick a
given version with PREFERRED_VERSION.
▶ The package names have to suffix this variable.
▶ % can be used as a wildcard.
▶ Example:
▶ PREFERRED_VERSION_linux-yocto = "3.10\%"
▶ PREFERRED_VERSION_python = "2.7.3"
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 74/300
Using Yocto Project - advanced usage
Packages
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 75/300
Selection
▶ The set of packages installed into the image is defined by the target you choose
(e.g. core-image-minimal).
▶ It is possible to have a custom set by defining our own target, and we will see this
later.
▶ When developing or debugging, adding packages can be useful, without modifying
the recipes.
▶ Packages are controlled by the IMAGE_INSTALL configuration variable.
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 76/300
Exclusion
▶ The list of packages to install is also filtered using the PACKAGE_EXCLUDE variable.
▶ If you choose to not install a package using this variable and some other package
is dependent on it (i.e. listed in a recipe’s RDEPENDS variable), the
OpenEmbedded build system generates a fatal installation error.
▶ This only works with RPM and IPK packages.
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 77/300
Using Yocto Project - advanced usage
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 78/300
Common BitBake options
▶ BitBake can be used to run a full build for a given target with bitbake [target].
▶ But it can be more precise, with optional options:
-c <task> execute the given task
-s list all locally available packages and their versions
-f force the given task to be run by removing its stamp file
world keyword for all recipes
-b <recipe> execute tasks from the given recipe (without resolving
dependencies).
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 79/300
BitBake examples
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 80/300
shared state cache
▶ BitBake stores the output of each task in a directory, the shared state cache. Its
location is controlled by the SSTATE_DIR variable.
▶ This cache is use to speed up compilation.
▶ Over time, as you compile more recipes, it can grow quite big. It is possible to
clean old data with:
$ ./scripts/sstate-cache-management.sh --remove-duplicated -d \
--cache-dir=<SSTATE_DIR>
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 81/300
Practical lab - Advanced Yocto configuration
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 82/300
Writing recipes - basics
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 83/300
Writing recipes - basics
Recipes: overview
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 84/300
Recipes
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 85/300
Basics
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 86/300
Content of a recipe
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 87/300
Common variables
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 88/300
Writing recipes - basics
Organization of a recipe
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 89/300
Organization of a recipe
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 90/300
Organization of a recipe
▶ Many applications have more than one recipe, to support different versions. In
that case the common metadata is included in each version specific recipe and is
in a .inc file:
▶ <application>.inc: version agnostic metadata.
▶ <application>_<version>.bb: require <application>.inc and version specific
metadata.
▶ We can divide a recipe into three main parts:
▶ The header: what/who
▶ The sources: where
▶ The tasks: how
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 91/300
The header
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 92/300
The source locations: overview
▶ We need to retrieve both the raw sources from an official location and the
resources needed to configure, patch or install the application.
▶ SRC_URI defines where and how to retrieve the needed elements. It is a set of URI
schemes pointing to the resource locations (local or remote).
▶ URI scheme syntax: scheme://url;param1;param2
▶ scheme can describe a local file using file:// or remote locations with https://,
git://, svn://, hg://, ftp://…
▶ By default, sources are fetched in $BUILDDIR/downloads. Change it with the
DL_DIR variable in conf/local.conf
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 93/300
The source locations: remote files 1/2
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 94/300
The source locations: remote files 2/2
▶ An md5 or an sha256 sum must be provided when the protocol used to retrieve the
file(s) does not guarantee their integrity. This is the case for https, http or ftp.
SRC_URI[md5sum] = "97b2c3fb082241ab5c56ab728522622b"
SRC_URI[sha256sum] = "..."
▶ It’s possible to use checksums for more than one file, using the name parameter:
SRC_URI = "http://example.com/src.tar.bz2;name=tarball \
http://example.com/fixes.patch;name=patch"
SRC_URI[tarball.md5sum] = "97b2c3fb082241ab5c56..."
SRC_URI[patch.md5sum] = "b184acf9eb39df794ffd..."
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 95/300
The source locations: local files
▶ All local files found in SRC_URI are copied into the recipe’s working directory, in
$BUILDDIR/tmp/work/.
▶ The searched paths are defined in the FILESPATH variable.
FILESPATH = "${@base_set_filespath(["${FILE_DIRNAME}/${BP}",
"${FILE_DIRNAME}/${BPN}","${FILE_DIRNAME}/files"], d)}
FILESOVERRIDES = "${TRANSLATED_TARGET_ARCH}:
${MACHINEOVERRIDES}:${DISTROOVERRIDES}"
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 97/300
The source locations: license files
LIC_FILES_CHKSUM = "file://gpl.txt;md5=393a5ca..."
LIC_FILES_CHKSUM = \
"file://main.c;beginline=3;endline=21;md5=58e..."
LIC_FILES_CHKSUM = \
"file://${COMMON_LICENSE_DIR}/MIT;md5=083..."
▶ This allows to track any license update: if the license changes, the build will
trigger a failure as the checksum won’t be valid anymore.
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 98/300
Dependencies 1/2
▶ A recipe can have dependencies during the build or at runtime. To reflect these
requirements in the recipe, two variables are used:
DEPENDS List of the recipe build-time dependencies.
RDEPENDS List of the package runtime dependencies. Must be package specific
(e.g. with _${PN}).
▶ DEPENDS = "recipe-b": the local do_configure task depends on the
do_populate_sysroot task of recipe-b.
▶ RDEPENDS_${PN} = "recipe-b": the local do_build task depends on the
do_package_write_<archive-format> task of recipe b.
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 99/300
Dependencies 2/2
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 100/300
Tasks
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 101/300
Writing tasks 1/2
▶ Functions use the sh shell syntax, with available OpenEmbedded variables and
internal functions available.
D The destination directory (root directory of where the files are
installed, before creating the image).
WORKDIR the recipe’s working directory
▶ Syntax of a task:
do_task() {
action0
action1
...
}
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 102/300
Writing tasks 2/2
▶ Example:
do_compile() {
oe_runmake
}
do_install() {
install -d ${D}${bindir}
install -m 0755 hello ${D}${bindir}
}
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 103/300
Modifying existing tasks
do_install_append() {
install -d ${D}${sysconfdir}
install -m 0644 hello.conf ${D}${sysconfdir}
}
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 104/300
Adding new tasks
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 105/300
Writing recipes - basics
Applying patches
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 106/300
Patches use cases
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 107/300
The source locations: patches
▶ Files ending in .patch, .diff or having the apply=yes parameter will be applied
after the sources are retrieved and extracted, during the do_patch task.
SRC_URI += "file://joystick-support.patch \
file://smp-fixes.diff \
"
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 108/300
Resolving conflicts
▶ The PATCHRESOLVE variable defines how to handle conflicts when applying patches.
▶ It has two valid values:
▶ noop: the build fails if a patch cannot be successfully applied.
▶ user: a shell is launched to resolve manually the conflicts.
▶ By default, PATCHRESOLVE = "noop" in meta-poky.
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 109/300
Writing recipes - basics
Example of a recipe
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 110/300
Hello world recipe
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 111/300
Writing recipes - basics
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 112/300
tar.inc
SRC_URI = "${GNU_MIRROR}/tar/tar-${PV}.tar.bz2"
do_configure() { ... }
do_compile() { ... }
do_install() { ... }
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 113/300
tar_1.17.bb
require tar.inc
LICENSE = "GPLv2"
LIC_FILES_CHKSUM = \
"file://COPYING;md5=59530bdf33659b29e73d4adb9f9f6552"
SRC_URI += "file://avoid_heap_overflow.patch"
SRC_URI[md5sum] = "c6c4f1c075dbf0f75c29737faa58f290"
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 114/300
tar_1.26.bb
require tar.inc
LICENSE = "GPLv3"
LIC_FILES_CHKSUM = \
"file://COPYING;md5=d32239bcb673463ab874e80d47fae504"
SRC_URI[md5sum] = "2cee42a2ff4f1cd4f9298eeeb2264519"
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 115/300
Practical lab - Add a custom application
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 116/300
Writing recipes - advanced
Writing recipes -
advanced
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 117/300
Writing recipes - advanced
Extending a recipe
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 118/300
Introduction to recipe extensions
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 119/300
Introduction to recipe extensions
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 120/300
Extend a recipe
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 121/300
Extend a recipe
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 122/300
Writing recipes - advanced
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 123/300
Hello world append file
FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
SRC_URI += "file://custom-modification-0.patch \
file://custom-modification-1.patch \
"
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 124/300
Writing recipes - advanced
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 125/300
Advanced configuration
▶ In the real word, more complex configurations are often needed because recipes
may:
▶ Provide virtual packages
▶ Inherit generic functions from classes
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 126/300
Providing virtual packages
▶ BitBake allows to use virtual names instead of the actual package name. We saw
a use case with package variants.
▶ The virtual name is specified through the PROVIDES variable.
▶ Several recipes can provide the same virtual name. Only one will be built and
installed into the generated image.
▶ PROVIDES = "virtual/kernel"
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 127/300
Writing recipes - advanced
Classes
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 128/300
Introduction to classes
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 129/300
Common classes
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 130/300
The base class
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 131/300
The kernel class
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 132/300
The autotools class
▶ Defines tasks and metadata to handle applications using the autotools build
system (autoconf, automake and libtool):
▶ do_configure: generates the configure script using autoreconf and loads it with
standard arguments or cross-compilation.
▶ do_compile: runs make
▶ do_install: runs make install
▶ Extra configuration parameters can be passed with EXTRA_OECONF.
▶ Compilation flags can be added thanks to the EXTRA_OEMAKE variable.
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 133/300
Example: use the autotools class
SRC_URI = "${GNU_MIRROR}/hello/hello-${PV}.tar.gz"
SRC_URI[md5sum] = "67607d2616a0faaf5bc94c59dca7c3cb"
SRC_URI[sha256sum] = "ecbb7a2214196c57ff9340aa71458e1559abd38f6d8d169666846935df191ea7"
LIC_FILES_CHKSUM = "file://COPYING;md5=d32239bcb673463ab874e80d47fae504"
inherit autotools
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 134/300
The useradd class
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 135/300
Example: use the useradd class
SRC_URI = "file://file0"
LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/MIT;md5=0835ade698e0bc..."
inherit useradd
USERADD_PACKAGES = "${PN}"
USERADD_PARAM = "-u 1000 -d /home/user0 -s /bin/bash user0"
do_install() {
install -m 644 file0 ${D}/home/user0/
chown user0:user0 ${D}/home/user0/file0
}
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 136/300
Writing recipes - advanced
Binary packages
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 137/300
Specifics for binary packages
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 138/300
Writing recipes - advanced
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 139/300
Locate files in the build system
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 140/300
The inherit keyword
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 141/300
The include and require keywords
▶ include and require can be used in all files, to insert the content of another file
at that location.
▶ If the path specified on the include (or require) path is relative, BitBake will
insert the first file found in BBPATH.
▶ include does not produce an error when a file cannot be found, whereas require
raises a parsing error.
▶ To include a local file: include ninvaders.inc
▶ To include a file from another location (which could be in another layer):
include path/to/file.inc
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 142/300
Writing recipes - advanced
Debugging recipes
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 143/300
Debugging recipes
▶ For each task, logs are available in the temp directory in the work folder of a
recipe. This includes both the actual tasks code that ran and the output of the
task.
▶ bitbake can dump the whole environment, including the variable values and how
they were set:
$ bitbake -e ninvaders
# $DEPENDS [4 operations]
# set /yocto-labs/poky/meta/conf/bitbake.conf:268
# ""
# set /yocto-labs/poky/meta/conf/documentation.conf:130
# [doc] "Lists a recipe's build-time dependencies (i.e. other recipe files)."
# _prepend /yocto-training/yocto-labs/poky/meta/classes/base.bbclass:74
# "${BASEDEPENDS} "
# set /yocto-labs/meta-bootlinlabs/recipes-games/ninvaders/ninvaders.inc:11
# "ncurses"
# pre-expansion value:
# "${BASEDEPENDS} ncurses"
DEPENDS="virtual/arm-poky-linux-gnueabi-gcc virtual/arm-poky-linux-gnueabi-compilerlibs virtual/libc ncurse
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 144/300
Debugging recipes
▶ A development shell, exporting the full environment can be used to debug build
failures:
$ bitbake -c devshell <recipe>
▶ To understand what a change in a recipe implies, you can activate build history in
local.conf:
INHERIT += "buildhistory"
BUILDHISTORY_COMMIT = "1"
Then use the buildhistory-diff tool to examine differences between two builds.
▶ ./scripts/buildhistory-diff
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 145/300
Writing recipes - advanced
Network usage
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 146/300
Source fetching
▶ BitBake will look for files to retrieve at the following locations, in order:
1. DL_DIR (the local download directory).
2. The PREMIRRORS locations.
3. The upstream source, as defined in SRC_URI.
4. The MIRRORS locations.
▶ If all the mirrors fail, the build will fail.
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 147/300
Mirror configuration in Poky
MIRRORS =+ "\
ftp://.*/.* http://downloads.yoctoproject.org/mirror/sources/ \n \
http://.*/.* http://downloads.yoctoproject.org/mirror/sources/ \n \
https://.*/.* http://downloads.yoctoproject.org/mirror/sources/ \n"
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 148/300
Configuring the mirrors
PREMIRRORS_prepend = "\
git://.*/.* http://www.yoctoproject.org/sources/ \n \
ftp://.*/.* http://www.yoctoproject.org/sources/ \n \
http://.*/.* http://www.yoctoproject.org/sources/ \n \
https://.*/.* http://www.yoctoproject.org/sources/ \n"
INHERIT += "own-mirrors"
SOURCE_MIRROR_URL = "http://example.com/my-source-mirror"
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 149/300
Forbidding network access
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 150/300
Layers
Layers
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 151/300
Layers
Introduction to layers
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 152/300
Layers’ principles
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 153/300
Layers in Poky
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 154/300
Layers in Poky
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 155/300
Third party layers
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 156/300
Integrate and use a layer 1/3
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 157/300
Integrate and use a layer 2/3
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 158/300
Integrate and use a layer 3/3
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 159/300
Some useful layers
▶ Many SoC specific layers are available, providing support for the boards using
these SoCs. Some examples: meta-ti, meta-freescale and meta-raspberrypi.
▶ Other layers offer to support applications not available in the Poky reference
system:
▶ meta-browser: web browsers (Chromium, Firefox).
▶ meta-filesystems: support for additional filesystems.
▶ meta-gstreamer10: support for GStreamer 1.0.
▶ meta-java and meta-oracle-java: Java support.
▶ meta-linaro-toolchain: Linaro toolchain recipes.
▶ meta-qt5: QT5 modules.
▶ meta-realtime: real time tools and test programs.
▶ meta-telephony and many more…
Notice that some of these layers do not come with all the Yocto branches. The
meta-browser did not have a krogoth branch, for example.
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 160/300
Layers
Creating a layer
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 161/300
Custom layer
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 162/300
Create a custom layer 1/2
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 163/300
Create a custom layer 2/2
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 164/300
Use a layer: best practices
▶ Do not copy and modify existing recipes from other layers. Instead use append
files.
▶ Avoid duplicating files. Use append files or explicitly use a path relative to other
layers.
▶ Save the layer alongside other layers, in OEROOT.
▶ Use LAYERDEPENDS to explicitly define layer dependencies.
▶ Use LAYERSERIES_COMPAT to define the Yocto version(s) with which the layer is
compatible.
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 165/300
Practical lab - Create a custom layer
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 166/300
Practical lab - Extend a recipe
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 167/300
BSP Layers
BSP Layers
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 168/300
BSP Layers
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 169/300
BSP layers
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 170/300
Overview
▶ BSP layers are device specific layers. They hold metadata with the purpose of
supporting specific hardware devices.
▶ BSP layers describe the hardware features and often provide a custom kernel and
bootloader with the required modules and drivers.
▶ BSP layers can also provide additional software, designed to take advantage of the
hardware features.
▶ As a layer, it is integrated into the build system as we previously saw.
▶ A good practice is to name it meta-<bsp_name>.
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 171/300
BSP layers Specifics
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 172/300
BSP Layers
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 173/300
Overview 1/2
▶ A layer provides one machine file (hardware configuration file) per machine it
supports.
▶ These configuration files are stored under
meta-<bsp_name>/conf/machine/*.conf
▶ The file names correspond to the values set in the MACHINE configuration variable.
▶ meta-ti/conf/machine/beaglebone.conf
▶ MACHINE = "beaglebone"
▶ Each machine should be described in the README file of the BSP.
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 174/300
Overview 2/2
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 175/300
Machine configuration
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 176/300
MACHINE_FEATURES
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 177/300
conf/machine/include/cfa10036.inc
SOC_FAMILY = "mxs:mx28:cfa10036"
PREFERRED_PROVIDER_virtual/kernel ?= "linux-cfa"
PREFERRED_PROVIDER_virtual/bootloader ?= "barebox"
IMAGE_BOOTLOADER = "barebox"
BAREBOX_BINARY = "barebox"
IMAGE_FSTYPES_mxs = "tar.bz2 barebox.mxsboot-sdcard sdcard.gz"
IMXBOOTLETS_MACHINE = "cfa10036"
KERNEL_IMAGETYPE = "zImage"
KERNEL_DEVICETREE = "imx28-cfa10036.dtb"
# we need the kernel to be installed in the final image
IMAGE_INSTALL_append = " kernel-image kernel-devicetree"
SDCARD_ROOTFS ?= "${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.ext3"
SERIAL_CONSOLE = "115200 ttyAMA0"
MACHINE_FEATURES = "usbgadget usbhost vfat"
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 178/300
conf/machine/cfa10057.conf
#@TYPE: Machine
#@NAME: Crystalfontz CFA-10057
#@SOC: i.MX28
#@DESCRIPTION: Machine configuration for CFA-10057, also called CFA-920
#@MAINTAINER: Alexandre Belloni <alexandre.belloni@bootlin.com>
include conf/machine/include/cfa10036.inc
KERNEL_DEVICETREE += "imx28-cfa10057.dtb"
MACHINE_FEATURES += "touchscreen"
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 179/300
BSP Layers
Bootloader
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 180/300
Default bootloader 1/2
▶ By default the bootloader used is the mainline version of U-Boot, with a fixed
version (per Poky release).
▶ All the magic is done in meta/recipes-bsp/u-boot/u-boot.inc
▶ Some configuration variables used by the U-Boot recipe can be customized, in the
machine file.
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 181/300
Default bootloader 2/2
SPL_BINARY If an SPL is built, describes the name of the output binary. Defaults to
an empty string.
UBOOT_SUFFIX bin (default) or img.
UBOOT_MACHINE The target used to build the configuration.
UBOOT_ENTRYPOINT The bootloader entry point.
UBOOT_LOADADDRESS The bootloader load address.
UBOOT_MAKE_TARGET Make target when building the bootloader. Defaults to
all.
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 182/300
Customize the bootloader
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 183/300
BSP Layers
Kernel
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 184/300
Linux kernel recipes in Yocto
▶ There are basically two ways of compiling a kernel in the Yocto Project:
▶ By using the linux-yocto packages, provided in Poky.
▶ By using a fully custom kernel recipe.
▶ The kernel used is selected in the machine file thanks to:
PREFERRED_PROVIDER_virtual/kernel
▶ Its version is defined with: PREFERRED_VERSION_<kernel_provider>
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 185/300
Linux Yocto 1/4
▶ linux-yocto is a generic set of recipes for building mainline Linux kernel images.
▶ PREFERRED_PROVIDER_virtual/kernel = "linux-yocto"
▶ PREFERRED_VERSION_linux-yocto = "5.10\%"
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 186/300
Linux Yocto 2/4
▶ Like other appended recipes, patches can be added by filling SRC_URI with .patch
and/or .diff files.
▶ The kernel configuration must also be provided, and the file containing it must be
called defconfig.
▶ This can be generated from a Linux source tree, by using make savedefconfig
▶ The configuration can be split in several files, by using the .cfg extension. It is the
best practice when adding new features:
SRC_URI += "file://defconfig \
file://nand-support.cfg \
file://ethernet-support.cfg"
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 187/300
Linux Yocto 3/4
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 188/300
Linux Yocto 4/4
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 189/300
Linux Yocto: Kernel Metadata 1/4
▶ Kernel Metadata is a way to organize and to split the kernel configuration and
patches in little pieces each providing support for one feature.
▶ Two main configuration variables help taking advantage of this:
LINUX_KERNEL_TYPE standard (default), tiny or preempt-rt
▶ standard: generic Linux kernel policy.
▶ tiny: bare minimum configuration, for small kernels.
▶ preempt-rt: applies the PREEMPT_RT patch.
KERNEL_FEATURES List of features to enable. Features are sets of patches and
configuration fragments.
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 190/300
Linux Yocto: Kernel Metadata 2/4
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 191/300
Linux Yocto: Kernel Metadata 3/4
▶ Kernel Metadata description files have their own syntax, used to describe the
feature provided and which patches and configuration fragments to use.
▶ Simple example, features/smp.scc
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 192/300
Linux Yocto: Kernel Metadata 4/4
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 193/300
Practical lab - Create a custom machine configuration
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 194/300
Distro Layers
Distro Layers
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 195/300
Distro Layers
Distro Layers
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 196/300
Distro layers
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 197/300
Distro layers
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 198/300
Best practice
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 199/300
Creating a Distro layer
require conf/distro/poky.conf
DISTRO = "distro"
DISTRO_NAME = "distro description"
DISTRO_VERSION = "1.0"
MAINTAINER = "..."
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 200/300
DISTRO_FEATURES
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 201/300
Toolchain selection
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 202/300
Sample files
▶ A distro layer often contains sample files, used as templates to build key
configurations files.
▶ Example of sample files:
▶ bblayers.conf.sample
▶ local.conf.sample
▶ In Poky, they are in meta-poky/conf/.
▶ The TEMPLATECONF variable controls where to find the samples.
▶ It is set in ${OEROOT}/.templateconf.
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 203/300
Distro Layers
Release management
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 204/300
Release management
There are multiple tasks that OE/bitbake based projects let you do on your own to
ensure build reproducibility:
▶ Code distribution and project setup.
▶ Release tagging
A separate tool is needed for that, usual solutions are:
▶ combo-layer, as done by Poky:
https://wiki.yoctoproject.org/wiki/Combo-layer
▶ git submodules + setup script. Great example in YOE:
https://github.com/YoeDistro/yoe-distro
▶ repo and templateconf or setup script
▶ kas
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 205/300
Distribute the distribution
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 206/300
Manifest example
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 207/300
Retrieve the project using repo
▶ repo init uses the default.xml manifest in the repository, unless specified
otherwise.
▶ You can see the full repo documentation at
https://source.android.com/source/using-repo.html.
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 208/300
repo: release
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 209/300
kas
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 210/300
kas configuration
header:
version: 8
machine: mymachine
distro: mydistro
target:
- myimage
repos:
meta-custom:
bitbake:
url: "https://git.openembedded.org/bitbake"
refspec: "1.46"
layers:
.: excluded
openembedded-core:
url: "https://git.openembedded.org/openembedded-core"
refspec: dunfell
layers:
meta:
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 211/300
kas configuration
meta-freescale:
url: "https://github.com/Freescale/meta-freescale"
refspec: dunfell
meta-openembedded:
url: http://git.openembedded.org/meta-openembedded
refspec: dunfell
layers:
meta-oe:
meta-python:
meta-networking:
▶ Then a single commande will build all the listed target for the machine:
$ kas build meta-custom/mymachine.yaml
▶ Or, alternatively, invoke bitbake commands:
$ kas shell /path/to/kas-project.yml -c 'bitbake dosfsutils-native'
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 212/300
Images
Images
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 213/300
Images
Introduction to images
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 214/300
Overview 1/3
▶ An image is the top level recipe and is used alongside the machine definition.
▶ Whereas the machine describes the hardware used and its capabilities, the image
is architecture agnostic and defines how the root filesystem is built, with what
packages.
▶ By default, several images are provided in Poky:
▶ meta*/recipes*/images/*.bb
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 215/300
Overview 2/3
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 216/300
Overview 3/3
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 217/300
Organization of an image recipe
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 218/300
Example of an image
require recipes-core/images/core-image-minimal.bb
IMAGE_INSTALL += "ninvaders"
LICENSE = "MIT"
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 219/300
Images
Image types
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 220/300
IMAGE_FSTYPES
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 221/300
Creating an image type
▶ If you have a particular layout on your storage (for example bootloader location on
an SD card), you may want to create your own image type.
▶ This is done through a class that inherits from image_types.
▶ It has to define a function named IMAGE_CMD_<type>.
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 222/300
wic
▶ wic is a tool that can create a flashable image from the compiled packages and
artifacts.
▶ It can create partitions.
▶ It can select which files are located in which partition through the use of plugins.
▶ The final image layout is described in a .wks or .wks.in file.
▶ It can be extended in any layer.
▶ Usage example:
WKS_FILE = "imx-uboot-custom.wks.in"
IMAGE_FSTYPES = "wic.bmap wic"
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 223/300
imx-uboot-custom.wks.in
part u-boot --source rawcopy --sourceparams="file=imx-boot" --ondisk sda --no-table --align ${IMX_BOOT_SEEK}
part /boot --source bootimg-partition --ondisk sda --fstype=vfat --label boot --active --align 8192 --size 64
part / --source rootfs --ondisk sda --fstype=ext4 --label root --exclude-path=home/ --exclude-path=opt/ --align 8192
part /home --source rootfs --rootfs-dir=${IMAGE_ROOTFS}/home --ondisk sda --fstype=ext4 --label home --align 8192
part /opt --source rootfs --rootfs-dir=${IMAGE_ROOTFS}/opt --ondisk sda --fstype=ext4 --label opt --align 8192
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 224/300
Images
Package groups
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 225/300
Overview
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 226/300
Common package groups
▶ packagegroup-core-boot
▶ packagegroup-core-buildessential
▶ packagegroup-core-nfs-client
▶ packagegroup-core-nfs-server
▶ packagegroup-core-tools-debug
▶ packagegroup-core-tools-profile
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 227/300
Example
./meta/recipes-core/packagegroups/packagegroup-core-tools-debug.bb:
inherit packagegroup
RDEPENDS_${PN} = "\
gdb \
gdbserver \
strace"
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 228/300
Practical lab - Create a custom image
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 229/300
Licensing
Licensing
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 230/300
Licensing
Managing licenses
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 231/300
Tracking license changes
LIC_FILES_CHKSUM = " \
file://COPYING;md5=... \
file://src/file.c;beginline=3;endline=21;md5=..."
▶ LIC_FILES_CHKSUM is mandatory in every recipe, unless LICENSE is set to CLOSED.
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 232/300
Package exclusion
INCOMPATIBLE_LICENSE = "GPLv3"
▶ License names are the ones used in the LICENSE variable.
▶ The meta-gplv2 layer provides recipes for software where upstream has moved to
GPLv3 licenses.
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 233/300
Commercial licenses
LICENSE_FLAGS = "commercial"
▶ To build a package with a commercial component, the package must be in the
LICENSE_FLAGS_WHITELIST variable.
▶ Example, gst-plugins-ugly:
LICENSE_FLAGS_WHITELIST = "commercial_gst-plugins-ugly"
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 234/300
Listing licenses
OpenEmbbedded will generate a manifest of all the licenses of the software present on
the target image in $BUILDDIR/tmp/deploy/licenses/<image>/license.manifest
PACKAGE NAME: busybox
PACKAGE VERSION: 1.31.1
RECIPE NAME: busybox
LICENSE: GPLv2 & bzip2-1.0.6
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 235/300
Providing license text
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 236/300
Providing sources
OpenEmbbedded provides the archiver class to generate tarballs of the source code:
▶ Use INHERIT += "archiver"
▶ Set the ARCHIVER_MODE variable, the default is to provide patched sources. To
provide configured sources:
ARCHIVER_MODE[src] = "configured"
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 237/300
Writing recipes - going further
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 238/300
Writing recipes - going further
Packages features
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 239/300
Benefits
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 240/300
PACKAGECONFIG
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 241/300
Example: from ConnMan
PACKAGECONFIG[wifi] = "--enable-wifi, \
--disable-wifi, \
wpa-supplicant, \
wpa-supplicant"
PACKAGECONFIG[bluez] = "--enable-bluetooth, \
--disable-bluetooth, \
bluez5, \
bluez5"
PACKAGECONFIG[openvpn] = "--enable-openvpn, \
--disable-openvpn, \
, \
openvpn"
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 242/300
Writing recipes - going further
Conditional features
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 243/300
Conditional features
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 244/300
Writing recipes - going further
Python tasks
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 245/300
Tasks in Python
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 246/300
Accessing the datastore with Python
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 247/300
Python task example
# Anonymous function
python () {
if d.getVar("FOO", True) == "example":
d.setVar("BAR", "Hello, World.")
}
# Task
python do_settime() {
import time
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 248/300
Writing recipes - going further
Variable flags
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 249/300
Variable flags
▶ Variable flags are used to store extra information on tasks and variables.
▶ They are used to control task functionalities.
▶ A number of these flags are already used by BitBake:
▶ dirs: directories that should be created before the task runs. The last one becomes
the work directory for the task.
▶ noexec: disable the execution of the task.
▶ nostamp: do not create a stamp file when running the task. The task will always be
executed.
▶ doc: task documentation displayed by listtasks.
do_settime[noexec] = "1"
do_compile[nostamp] = "1"
do_settime[doc] = "Set the current time in ${TIME}"
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 250/300
Writing recipes - going further
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 251/300
Files and directories selection
▶ The FILES variable controls the list of files and directories to be placed into
packages.
▶ It must be package specific (e.g. with _${PN}).
▶ In Poky, defaults to:
FILES_${PN} = \
"${bindir}/* ${sbindir}/* ${libexecdir}/* ${libdir}/lib*${SOLIBS} \
${sysconfdir} ${sharedstatedir} ${localstatedir} \
${base_bindir}/* ${base_sbindir}/* \
${base_libdir}/*${SOLIBS} \
${base_prefix}/lib/udev/rules.d ${prefix}/lib/udev/rules.d \
${datadir}/${BPN} ${libdir}/${BPN}/* \
${datadir}/pixmaps ${datadir}/applications \
${datadir}/idl ${datadir}/omf ${datadir}/sounds \
${libdir}/bonobo/servers"
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 253/300
Example: rootfs creation with .deb packages
rootfs_deb_do_rootfs () {
[...]
export INSTALL_ROOTFS_DEB="${IMAGE_ROOTFS}"
[...]
apt update
apt ${APT_ARGS} install ${package_to_install} \
--force-yes --allow-unauthenticated
[...]
}
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 254/300
Writing recipes - going further
Splitting packages
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 255/300
Benefits
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 256/300
Example
require kexec-tools.inc
export LDFLAGS = "-L${STAGING_LIBDIR}"
EXTRA_OECONF = " --with-zlib=yes"
SRC_URI[md5sum] = \
"b9f2a3ba0ba9c78625ee7a50532500d8"
SRC_URI[sha256sum] = "..."
FILES_kexec = "${sbindir}/kexec"
FILES_kdump = "${sbindir}/kdump"
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 257/300
Default packages
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 258/300
Inspecting packages
oe-pkgdata-util is a tool that can help inspecting packages:
▶ Which package is shipping a file:
$ oe-pkgdata-util find-path /bin/busybox
busybox: /bin/busybox
Application
development workflow
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 260/300
Recommended workflows
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 261/300
Application development workflow
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 262/300
Overview
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 263/300
The Yocto Project SDK
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 264/300
Available SDKs
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 265/300
The generic SDK
▶ Mainly used for low-level development, where only the toolchain is needed:
▶ Bootloader development.
▶ Kernel development.
▶ The recipe meta-toolchain generates this SDK:
▶ bitbake meta-toolchain
▶ The generated script, containing all the tools for this SDK, is in:
▶ $BUILDDIR/tmp/deploy/sdk
▶ Example:
poky-glibc-x86_64-meta-toolchain-cortexa8hf-neon-toolchain-2.5.sh
▶ The SDK will be configured to be compatible with the specified MACHINE.
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 266/300
The image-based SDK
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 267/300
SDK format
$ ./poky-glibc-x86_64-meta-toolchain-cortexa8hf-neon-toolchain-2.5.sh
Poky (Yocto Project Reference Distro) SDK installer version 2.5
===============================================================
Enter target directory for SDK (default: /opt/poky/2.5):
You are about to install the SDK to "/opt/poky/2.5". Proceed[Y/n]?
Extracting SDK.................done
Setting it up...done
SDK has been successfully set up and is ready to be used.
Each time you wish to use the SDK in a new shell session, you need to source
the environment setup script e.g.
$ . /opt/poky/2.5/environment-setup-cortexa8hf-neon-poky-linux-gnueabi
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 268/300
Use the SDK
$ cd /opt/poky/2.5
$ source ./environment-setup-cortexa8hf-neon-poky-linux-gnueabi
▶ The PATH is updated to take into account the binaries installed alongside the SDK.
▶ Environment variables are exported to help using the tools.
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 269/300
SDK installation
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 270/300
SDK environment variables
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 271/300
Examples
$ unset LDFLAGS
$ make menuconfig
$ make
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 272/300
Application development workflow
Devtool
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 273/300
Overview
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 274/300
devtool usage 1/3
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 275/300
devtool usage 2/3
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 276/300
devtool usage 3/3
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 277/300
Application development workflow
Quilt
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 278/300
Overview
▶ Quilt is a utility to manage patches which can be used without having a clean
source tree.
▶ It can be used to create patches for recipes already available in the build system.
▶ Be careful when using this workflow: the modifications won’t persist across builds!
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 279/300
Using Quilt
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 280/300
Practical lab - Create and use a Poky SDK
▶ Generate an SDK
▶ Compile an application for the target in the
SDK
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 281/300
Runtime Package Management
Runtime Package
Management
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 282/300
Introduction
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 283/300
Requirements
▶ First of all, you need a server to serve the packages to a private subnet or over the
Internet. Packages are typically served over https or http.
▶ Specific tools are also required on the target, and must be shipped on the
product. They should be included into the images generated by the build system.
▶ These tools will be specific to the package type used.
▶ This is similar to Linux distributions: Debian is using .deb related tools (dpkg,
apt…) while Fedora uses .rpm related ones (rpm, dnf).
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 284/300
Runtime Package Management
Build configuration
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 285/300
Build configuration 1/2
▶ The PACKAGE_CLASSES variable controls which package format to use. More than
one can be used.
▶ Valid values are package_rpm, package_deb, package_ipk.
▶ By default Poky uses the RPM format, while OpenEmbedded-Core uses the IPK
one.
▶ Example:
▶ PACKAGE_CLASSES = "package_ipk"
▶ PACKAGE_CLASSES = "package_rpm package_deb"
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 286/300
Build configuration 2/2
To install the required tools on the target, there are two possible solutions:
▶ By adding package-management to the images features.
▶ The required tool will be installed on the target.
▶ The package database corresponding to the build will be installed as well.
▶ Or by manually adding the required tools in IMAGE_INSTALL. For example, to use
the IPK format we need opkg.
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 287/300
Build considerations
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 288/300
Runtime Package Management
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 289/300
Apache2 example setup
<VirtualHost *:80>
ServerName packages.example.net
DocumentRoot /path/to/build/tmp/deploy/ipk
<Directory /path/to/build/tmp/deploy/ipk>
Options +Indexes
Options Indexes FollowSymLinks
Order allow,deny
allow from all
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 290/300
Runtime Package Management
Target configuration
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 291/300
The IPK runtime management software
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 292/300
opkg usage
▶ opkg update: fetch and update the package databases, from the remote package
servers.
▶ opkg list: list available packages.
▶ opkg upgrade: upgrade all installed packages.
▶ opkg upgrade <package>: upgrade one package explicitly.
▶ opkg install <package>: install a specific package.
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 293/300
opkg upgrade over an unstable network
# opkg update
# opkg --download-only upgrade
# opkg upgrade
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 294/300
Yocto Project Resources
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 295/300
Yocto Project documentation
▶ https://docs.yoctoproject.org/
▶ Wiki: https://wiki.yoctoproject.org/wiki/Main_Page
▶ https://layers.openembedded.org/
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 296/300
Useful Reading (1)
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 297/300
Useful Reading (2)
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 298/300
Last slides
Last slides
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 299/300
Last slide
Thank you!
And may the Source be with you
- Kernel, drivers and embedded Linux - Development, consulting, training and support - https://bootlin.com 300/300