yocto: training in english
TRANSCRIPT
Yocto: Your Next Development Platform for Embedded Linux
Otavio SalvadorChief Technical Officer
Mario GoulartDeveloper
About O.S. SystemsAbout O.S. Systems
● Brazilian Company, founded in 2002● Uses Yocto/OpenEmbedded since 2008● Actively contributes to the development of Yocto
and many other open source projects● Customers and partners in Brazil and around the
world
O.S. Systems' work areasO.S. Systems' work areas
● Operating systems customization● Expertise in development based on the Linux
kernel● Consultancy services in several areas● Development/customization of BSPs● Migration of build systems to Yocto● ...
Using the training virtual machineUsing the training virtual machine
● Before booting the VM up– The VM is configured to use 3 cores and 3GB of RAM. If
your system doesn't have at least 4 cores and 6GB of RAM, you'll may want to change the VM settings before booting it up.
● After booting the VM– User: yocto
– Password: yocto
– Click the “Warm up” icon
YoctoYocto
● Linux-based cross-compilation framework● Open source (but can be used to build proprietarry
code)● Used by many players in the embedded industry,
for several architectures (ARM, PPC, MIPS etc)
What Yocto doesWhat Yocto does
● Source code download● Patch application● Cross compilation● Package management
What Yocto generatesWhat Yocto generates
● Binary packages● Linux-based system images● Toolchains● SDKs (Software Development Kits)
Advantages in using YoctoAdvantages in using Yocto
● Detailed control over the final product– Possibility of compile-time software configuration
● Easy migration to different hardware platforms– Exemple: migrating a whole x86 image to ARM is trivial
● Huge amount of available software– Thousands of packages available
● Extensible– Adding packages is easy
● Large community of developers– Active development, with participation of members of big players of the
embedded industry
● Highly performant– Possibility of parallelization of build tasks
ComponentsComponents
● BitBake: tasks scheduler and executor● Metadata:
– Configuration (.conf): global definition of variables
– Classes (.bbclass): inheritance and encapsulation of build logic, packaging etc.
– Recipes (.bb): instructions about how to build software and images
● Poky: build system
Poky = BitBake + Metadata
PackagesPackages
● Set of files generated by the build system, packaged into some popular archiving format
● Exemples of package types:– .ipk
– .deb
– .rpm
– .tar{.gz,.bz2}
RecipesRecipes
● Set of instructions about how to build software, including (but not limited to):– source code location specification
– patches to apply
– dependencies
– build-time configuration options
– how to split files into packages
● May inherit behavior from classes (.bbclass) and/or include files containing common definitions (.inc)
● Support recipe code in shell script, Python and in a custom configuration language
TasksTasks
● Tasks to be executed by the build system● Specified in classes and/or recipes● Scheduled by BitBake● Examples of standard tasks: do_fetch, do_unpack,
do_configure, do_compile, do_package
LayersLayers
● Set of recipes, classes, configuration files that can be added to the build system to extend it
● A BSP (Board Support Package) can be implemented as a layer
● Examples of layers: meta-fsl-arm, meta-fsl-demos, meta-fsl-arm-extras, meta-java, meta-browser
Recipe exampleRecipe example
DESCRIPTION = "BSD replacement for libreadline"HOMEPAGE = "http://www.thrysoee.dk/editline/"SECTION = "libs"LICENSE = "BSD"LIC_FILES_CHKSUM = "file://COPYING;md5=1e4228d0c5a9093b01aeaaeae6641533"
DEPENDS = "ncurses"
inherit autotools
SRC_URI = "http://www.thrysoee.dk/editline/${PN}-${PV}-3.0.tar.gz"
S = "${WORKDIR}/${PN}-${PV}-3.0"
SRC_URI[md5sum] = "e50f6a7afb4de00c81650f7b1a0f5aea"SRC_URI[sha256sum] = "51f0f4b4a97b7ebab26e7b5c2564c47628cdb3042fd8ba8d0605c719d2541918"
BitBakeBitBake
● Command line tool made in Python● Processes recipes● Runs and manages tasks● bitbake -h
Frequent uses of BitBakeFrequent uses of BitBake
● bitbake <recipe>– Processes all tasks for the given recipe. <recipe> is the name
of any recipe available in any of the available layers (e.g., samba)
● bitbake -c cleansstate <recipe>– Cleans up all the tasks state with regard to the given <recipe>.
This option is frequently used during the development of new recipes
● bitbake -e– Displays the internal state of variables used by BitBake
Generating an imageGenerating an image
$ cd ~/src/fsl-community-bsp
$ MACHINE=wandboard-dual source setup-environment build
$ bitbake core-image-minimal
In this case, core-image-minimal is a recipe that produces an image, not only packages (packages are also generated, but for being dependencies.)
Exploring Yocto's root directoryExploring Yocto's root directory
● ~/src/fsl-community-bsp:– build: directory created by the build system to store
files generated during the build process
– sources: layers' metadata
– downloads: source files to be used by the build system
Exploring Yocto's build directory Exploring Yocto's build directory (build)(build)
● ~/src/fsl-community-bsp/build:– cache: directory where cache data used by BitBake is stored
– conf: directory where the main configuration files (local.conf and bblayers.conf) are stored
– sstate-cache: directory where previously generated packages are stored, so that they can be reused without rebuilding
– tmp: temporary directory for the build system. This directory is used to store files that are produced by the build system: toolchains, binary files for the target platform, images etc.
Exploring Yocto's configuration Exploring Yocto's configuration directory (build/conf)directory (build/conf)
● ~/src/fsl-community-bsp/build/conf– Main files: local.conf and bblayers.conf
● Some variables:– MACHINE: target machine specification
– DISTRO: distribution to build
– BBLAYERS: path layers directories
– BB_NUMBER_THREADS: number of BitBake threads to run in parallel
– PARALLEL_MAKE: number of make threads to run in parallel (-j)
●
Explorando Yocto's temporary directory Explorando Yocto's temporary directory (build/tmp)(build/tmp)
● ~/src/fsl-community-bsp/build/tmp● Some directories in it:
– deploy: build products: images, packages, SDKs
– sysroots: shared libraries and headers that can be reused along the process of building recipes. Files in this directory are organized by architecture.
– work: work directory used to actually build recipes
Exploring Yocto's work directory Exploring Yocto's work directory (build/tmp/work)(build/tmp/work)
● ~/src/fsl-community-bsp/build/tmp/work● One of the main directories to be exaplored when
debugging● In this directory:
– source code for the software to be compiled is extracted
– the tasks' configuration and execution logs are stored
– the content of generated packages is stored
– etc.
Structure of the build/tmp/work Structure of the build/tmp/work directorydirectory
<arch>/<recipe name>/<software version>/● Some directories under this tree:
– temp: tasks' configuration and execution logs
– packages: content of packages, extracted
– packages-split: content of packages, extracted and split
– <sources>: extracted source code of the software to be built
BuildhistoryBuildhistory
● Log system that keeps track of what was generated during the build (packages and images)
● Useful to show differences between, for example, two image versions
● Git-based
Activating buildhistoryActivating buildhistory
● Edit the file
~/src/fsl-community-bsp/build/conf/local.conf
and add:
INHERIT += "buildhistory"
BUILDHISTORY_COMMIT = "1"
● You'll need to rerun BitBake to populate the buildhistory directory
Adding layersAdding layers
● To add a layer, you basically need to add its path to the BBLAYERS variable, which is in the $BUILDDIR/conf/bblayers.conf file
Anatomy of a layerAnatomy of a layer
● Layers usually follow a structure like:– <layer dir>/classes
– <layer dir>/conf
– <layer dir>/recipes-<category1>
– <layer dir>/recipes-<category...>
where <layer dir> is usually the layer name (e.g., meta-fsl-arm)
Anatomy of a layer (conf)Anatomy of a layer (conf)
● <layer dir>/conf must provide at least the layer configuration file: layer.conf, which can be used to configure layer-related variables.
● Configuration examples:– Where recipes can be found in the layer
– Layer priority
Anatomy of a layer (layer.conf)Anatomy of a layer (layer.conf)# We have a conf and classes directory, add to BBPATHBBPATH .= ":${LAYERDIR}"
# We have a packages directory, add to BBFILESBBFILES += "${LAYERDIR}/recipes-*/*/*.bb ${LAYERDIR}/recipes-*/*/*.bbappend"
BBFILE_COLLECTIONS += "fsl-arm"BBFILE_PATTERN_fsl-arm := "^${LAYERDIR}/"BBFILE_PRIORITY_fsl-arm = "5"
FSL_EULA_FILE = "${LAYERDIR}/EULA"
FSL_MIRROR ?= "http://www.freescale.com/lgfiles/NMG/MAD/YOCTO/"
MIRRORS += " \${FSL_MIRROR} http://download.ossystems.com.br/bsp/freescale/source/ \n \"
# Let us add layer-specific bbappends which are only applied when that# layer is included in our configurationBBFILES += "${@' '.join('${LAYERDIR}/%s/recipes*/*/*.bbappend' % layer \ for layer in BBFILE_COLLECTIONS.split())}"
Anatomy of a layer (conf/machine)Anatomy of a layer (conf/machine)
● The <layer dir>/conf/machine contains machine description files, usually used to configure variables related to the target machine (e.f., imx23evk.conf)
● This directory is optional, but it usually is present in layers that implement BSPs
● The file names in this directory (without extension) are used as value to the MACHINE variable in $BUILDDIR/conf/local.conf
Anatomy of a layer Anatomy of a layer (conf/machines/imx23evk.conf) (conf/machines/imx23evk.conf)
#@TYPE: Machine#@NAME: Freescale i.MX23 Evaluation Kit#@SOC: i.MX23#@DESCRIPTION: Machine configuration for Freescale i.MX23 Evaluation Kit
include conf/machine/include/mxs-base.inc
SOC_FAMILY = "mxs:mx23"
IMXBOOTLETS_MACHINE = "stmp378x_dev"UBOOT_MACHINE = "mx23evk_config"
KERNEL_IMAGETYPE = "uImage"KERNEL_DEVICETREE = "${S}/arch/arm/boot/dts/imx23-evk.dts"
SDCARD_ROOTFS ?= "${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.ext3"IMAGE_FSTYPES ?= "tar.bz2 ext3 uboot.mxsboot-sdcard sdcard"
MACHINE_FEATURES = "apm usbgadget usbhost vfat alsa touchscreen"
Anatomy of a layerAnatomy of a layer(recipes-<category>)(recipes-<category>)
● Directories which store recipes available in layers, organized by actegory
● Exemples: – recipes-qt: recipes related to the Qt library
– recipes-kernel: recipes related to kernels
Applying patchesApplying patches
Assuming a recipe named “foo” and a patch “fix.patch”:● Patches are referenced by the SRC_URI variable in
.bb files (recipes)● SRC_URI += “file://fix.patch”
Storing patchesStoring patches
● Patches are stored into special directories in the recipe directory. Examples:– foo/files/fix.patch : the patch can be referenced by any
recipe in the “foo” directory
– foo/foo/fix.patch : the patch can only be referenced by the “foo” recipe (any version)
– foo/foo-1.0/fix.patch : the patch can only be referenced by recipe “foo”, version 1.0
Hands on: creating a layerHands on: creating a layer
Goal:● Create a meta-training layer containing a
hello-freescale recipe and add it to the fsl-community-bsp BSP
Hands on: creating a layer Hands on: creating a layer
● yocto-layer create meta-training -o ~/src/fsl-community-bsp/sources/meta-training 4
Hands on: creating a layerHands on: creating a layer(adding the layer to the build directory)(adding the layer to the build directory)
echo 'BBLAYERS += " ${BSPDIR}/sources/meta-training "' >> \
~/src/fsl-community-bsp/build/conf/bblayers.conf
Hands on: creating a layerHands on: creating a layer(creating a recipe)(creating a recipe)
● Change to the layer's sources directory– cd ~/src/fsl-community-bsp/sources/meta-training
● Create the recipe directory– mkdir -p recipes-training/hello-freescale
● Create the directory to store the code of the application (unusual)– mkdir recipes-training/hello-freescale/hello-freescale
● Write the application code– echo 'int main () { puts("Hello FreeScale"); }' >
recipes-training/hello-freescale/hello-freescale/hello-freescale.c
Hands on: creating a layerHands on: creating a layer(recipe file)(recipe file)
File ~/src/fsl-community-bsp/sources/meta-training/recipes-training/hello-freescale/hello-freescale_1.0.bb
DESCRIPTION = "A Hello World application"SECTION = "console/utils"LICENSE = "CLOSED"
SRC_URI = "file://hello-freescale.c"
S = "${WORKDIR}"
do_compile () { ${CC} -o hello-freescale hello-freescale.c}
do_install () { install -d ${D}/${bindir} install -m 755 hello-freescale ${D}/${bindir}/hello-freescale}
Hands on: creating a layerHands on: creating a layer(generating a package)(generating a package)
● Generate the package for the recipe– cd ~/src/fsl-community-bsp/build
– bitbake hello-freescale
Hands on: creating a layerHands on: creating a layer(checking the package)(checking the package)
● Check the generated package– rpm -qlp
tmp/deploy/rpm/armv7a_vfp_neon/hello-freescale-1.0-r0.armv7a_vfp_neon.rpm
– mkdir test
– cd test
– rpm2cpio ../tmp/deploy/rpm/armv7a_vfp_neon/hello-freescale-1.0-r0.armv7a_vfp_neon.rpm | cpio -i --make-directories
– file usr/bin/hello-freescale
usr/bin/hello-freescale: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.16, BuildID[sha1]=0xdf0a4bcbe5872d18a571d51e6ee10895198c84c6, stripped
Hands on: creating a layerHands on: creating a layer(applying a patch)(applying a patch)
● Generate the patch– cd
~/src/fsl-community-bsp/sources/meta-training/recipes-training/hello-freescale
– cp hello-freescale/hello-freescale.c hello-freescale/hello-freescale.c.orig
– sed -i 's/Hello FreeScale/Hello, FreeScale./' hello-freescale/hello-freescale.c
– diff -u hello-freescale/hello-freescale.c.orig hello-freescale/hello-freescale.c > hello-freescale/fix.patch
– mv hello-freescale/hello-freescale.c.orig hello-freescale/hello-freescale.c
● Add fix.patch to SRC_URI in the recipe file– SRC_URI = "file://hello-freescale.c file://fix.patch"
● Use BitBake to regenerate the package
Hands on: creating a layerHands on: creating a layer(check patch application)(check patch application)
less ~/src/fsl-community-bsp/build/tmp/work/armv7a-vfp-neon-poky-linux-gnueabi/hello-freescale/1.0-r0/temp/log.do_patch
...NOTE: Applying patch 'fix.patch' (../sources/meta-training/recipes-training/hello-freescale/hello-freescale/fix.patch)
...
Hands on: creating a layerHands on: creating a layer(creating an image)(creating an image)
● To create an image you just need to make a recipe● New images usually inherit characteristics from
base images available in Yocto (e.g., core-image)
Hands on: creating a layerHands on: creating a layer(image recipe)(image recipe)
● ~/src/fsl-community-bsp/sources/meta-training/recipes-training/images/training-image.bb
DESCRIPTION = "Image for Yocto training"
LICENSE = "MIT"
inherit core-image
CORE_IMAGE_EXTRA_INSTALL += "hello-freescale"● bitbake training-image
Hands on: creating a layerHands on: creating a layer(exploring buildhistory)(exploring buildhistory)
● Directory where historic compilation data gets stored– ~/src/fsl-community-bsp/build/buildhistory
● Organized by packages, images and SDKs
Hands on: creating a layerHands on: creating a layer(checking the image)(checking the image)
● Check if the hello-freescale package has been added to the image (buildhistory)– cd
~/src/fsl-community-bsp/build/buildhistory/images/wandboard_dual/eglibc/training-image
– grep hello-freescale installed-packages.txt
● Check if the binary file has been added to the image– grep hello-freescale files-in-image.txt
Hands on: creating a layerHands on: creating a layer(copying the image to a memory card)(copying the image to a memory card)
● Image files go into– ~/src/fsl-community-bsp/build/tmp/deploy/images
● Write the image to a memory card– Insert the memory card into the memory slot
– On VirtualBox, share the the device the memory card is connected to with the virtual machine (Devices menu)
– Run “dmesg” on the virtual machine system and check which device the memory card got bound to
– cd ~/src/fsl-community-bsp/build/tmp/deploy/images
– sudo dd if=training-image-wandboard-dual.sdcard of=/dev/<memory card device> bs=1M
Hands on: creating a layerHands on: creating a layer(serial console)(serial console)
● Conect the target board to your computer using a serial console cable– Use an USB<->DB9 cable to connect your computer to the
target board
– On VirtualBox, share the USB device your cable is connected to with the virtual machine (Devices menu)
– sudo screen /dev/ttyUSB<n> 115200● <n> is a number (0 if no other device is connected)
Hands on: Eclipse SDKHands on: Eclipse SDK
Goals:● Configure the Eclipse IDE to use an SDK
generated by Yocto● Create a “helloworld” project/application to test the
SDK
Hands on: Eclipse SDKHands on: Eclipse SDK(environment setup)(environment setup)
● Install the Yocto plugin for Eclipse:– http://www.yoctoproject.org/docs/1.4/dev-manual/dev-manual.html#adt-eclipse
● Generate the toolchain– bitbake meta-toolchain
● After generating the toolchain, you need to install it:
$ cd tmp/deploy/sdk
$ sudo ./poky-<arch>-toolchain-<version>.sh● The SDK will be installed into:
/opt/poky/<version>/
Hands on: Eclipse SDKHands on: Eclipse SDK(environment setup)(environment setup)
● Set up the Yocto plugin for Eclipse to use the SDK:– On Eclipse, click Window → Preferences
– On the left listing, click “Yocto Project ADT”
– On the “Cross Compiler Options” dialog:● Select “Standalone pre-built toolchain”● On “Toolchain Root Location”, fill in the SDK root directory
(e.g:, /opt/poky/<version>/)● On “Sysroot Location”, fill in the sysroot directory
(/opt/poky/<version>/sysroots/<target_sysroot>)● On “Target Architecture”, select the board architecture
– On the “Target Options” dialog, select “External HW”
Hands on: Eclipse SDKHands on: Eclipse SDK(creating the helloworld project)(creating the helloworld project)
● On Eclipse, click File → New → Project...● Select “C Project”, then click “Next”● Type a name for the new project: “helloworld”● Click the “Yocto Project ADT Project” folder● Select “Hello World ANSI C Autotools Project”, then click “Next”
– There are two other templates that could also be used: “Empty Project” and “Hello World GTK C Autotools”; all of them are pre-configured with Autotools
● If you want, you can add more information to the project, such as “Author”, “Copyright notice”, “Hello world greeting”, the “Source” directory and “License”. Click “Finish”
● At this point, the “helloworld” project has been created
Hands on: Eclipse SDKHands on: Eclipse SDK(building the helloworld project)(building the helloworld project)
● To build the helloworld project:– On Eclipse, click Project → Reconfigure Project. This
only needs to be done when some project configuration changes
– Click Project → Build Project
● At this point, the binary file for the program has been generated
Hands on: Eclipse SDKHands on: Eclipse SDK(image generation)(image generation)
● Add to the $BUILDDIR/conf/local.conf file:
IMAGE_FEATURES += "eclipse-debug"
● Generate the image– bitbake training-image
Hands on: Eclipse SDKHands on: Eclipse SDK(deploying the helloworld project)(deploying the helloworld project)
● Board setup:– Configure a local network between the development machine
and the target board
– Boot the target board up
– Check the target board IP address
$ /sbin/ifconfig● If it doesn't have an IP address, assign it a new one. Example:
$ sudo ifconfig eth0 10.9.0.1
– Check if the “TCF Agent” is running
$ ps | grep tcf● If it is not running, start the service up:
$ sudo /etc/init.d/tcf-agent start
Hands on: Eclipse SDKHands on: Eclipse SDK(deploying the helloworld project)(deploying the helloworld project)
● Development machine setup:– On Eclipse, click Run → Debug configurations
– On the left area, unfold “C/C++ Remote Application”
– Look for the project to brig the settings to the right area
– On the “Connection” field, select the target board configuration. Those connections are bound to IP addresses, that is, if the target board's IP address doesn't change, you can use the same connection. If you want to create a new one:
● Click “New” to create a new connection to the target board● Select “TCF” (Target Communication Framework), then click “Next”● Fill in the target board's IP address, the connection name and, optionally, the connection
description. Click “Finish” to create the new connection
– Assign the application an absolute path (path on the target board's filesystem), then click “Apply”
Hands on: Eclipse SDKHands on: Eclipse SDK(deploying the helloworld project)(deploying the helloworld project)
● Development machine setup (continued):– At the same window, click “Debug” to run the application on
the target board
– The first time it is executed, a login dialog is displayed. Log in with credentials for the target board then click “OK”
– Eclipse will ask you if you want to change the interface layout. Accept or deny that according to your preferences (when in doubt, accept it)
● At this point, the application is running in debug mode (on GDB) and stuck on a breakpoint. To resume its execution, hit “F8” on the keyboard