introduction to openembedded and yocto

40
OpenEmbedded and Yocto introduction Nicolas Dechesne <[email protected]> Riku Voipio <[email protected]> Trevor Woerner <[email protected]> LCE13, Dublin

Upload: tututi22

Post on 29-Oct-2015

202 views

Category:

Documents


4 download

DESCRIPTION

Overview of the Yocto Project, an open source collaboration project that provides templates, tools and methods to help you create custom Linux-based systems for embedded products regardless of the hardware architecture

TRANSCRIPT

Page 1: Introduction to OpenEmbedded and Yocto

OpenEmbedded and Yocto

introduction

Nicolas Dechesne <[email protected]>

Riku Voipio <[email protected]>

Trevor Woerner <[email protected]>

LCE13, Dublin

Page 2: Introduction to OpenEmbedded and Yocto

2

Agenda

● Intro to OpenEmbedded / Yocto

● Overview of Yocto Project, organization and releases

● Yocto Project vs. DIY

● Introduction to OpenEmbedded concepts (recipes,

packages, images, layers, configuration, SDK, …)

● OpenEmbedded/Yocto and Linaro

● 'OpenEmbedded/Yocto Lab' (this afternoon, 3PM)

● Beginners practical introduction

● Guide you through a 'qemuarm' console image build

● Q&A

Page 3: Introduction to OpenEmbedded and Yocto

3

What is the Yocto Project?

It provides all the basic bits that every Linux product needs, pre-integrated and

tested to let you spend more time on differentiators that matter to you!

Page 4: Introduction to OpenEmbedded and Yocto

4

The Yocto Project ● Open source project, hosted by the Linux Foundation.

● Not the “new kid on the block”, OpenEmbedded has been around since

2003!

● A collaboration project, an “umbrella” project. A collection of projects that

make up the “Yocto Project”

● Bitbake

● OpenEmbedded-Core

● Poky

● Application Development Toolkit

● And even more...

● It helps you build a 'tailored' Linux distribution/product for your exact needs.

● Support for ARM, PPC, MIPS, x86

Page 5: Introduction to OpenEmbedded and Yocto

5

Yocto Project organization

● Hierarchical technical leadership:

● Richard Purdie as the project architect

● Sub system maintainers

● Somehow similar to Linux kernel technical leadership

● Yocto Project Advisory Board for administrative leadership

● community, finance, infrastructure, advocacy

● From linaro: TI, Enea, Huawei

● Open to all contributors

● Yocto Compliance program

● Yocto project participants

● Yocto project compatible

Page 6: Introduction to OpenEmbedded and Yocto

6

Yocto/OE releases ● 1 new release ~6 months

● Yocto Project releases in sync with OE, bitbake projects

releases

● Yocto Project release is the aggregation of oe-core, bitbake and

Poky layers/tools/documentation.

● Stable releases

● v1.4 (aka dylan), v1.3 (aka danny)

● No new feature, only bug fixes

● Development / master branch

● New features (systemd, wayland, Qt5, build engine improvements, ...)

● Components version updates

● Does not 'work' every single day

Page 7: Introduction to OpenEmbedded and Yocto

7

Yocto/OpenEmbedded vs DIY

● Spend less time on things that bring no value to your business:

● OE provides and maintains thousands of up-to-date recipes

● Build an entire Linux system from sources in less than 1 hour, using a validated set of

packages (toolchain, busybox, libc, init system...)

● Built in support for package management

● Predictable and reproducible builds

● Provides set of standard tools and build guidelines.

● What you build for a product can be reused for other products.

● autobuilder 'bot' for continuous integration

● Minimal dependencies on host, build as standard user (no root)

● Still, you have all the flexibility you need to

● patch as needed any OE component for your needs/product

● Add any unsupported component, even proprietary bits

● Fully configure the system, and make it exactly the way you want.

Page 8: Introduction to OpenEmbedded and Yocto

8

OpenEmbedded metadata

● OpenEmbedded does not contain components source code, only their metadata

● Bitbake is the build engine, a metadata parser, written in Python

● Recipes

● Component (.bb, .bbappend)

● Image (.bb)

● Class (.bbclass)

● Configuration files: behavior largely controlled by variables

● bitbake.conf

● <machine>.conf

● <distro>.conf

● local.conf, site.conf

● bblayers.conf

● Patches

Page 9: Introduction to OpenEmbedded and Yocto

9

OpenEmbedded overview

Page 10: Introduction to OpenEmbedded and Yocto

10

OpenEmbedded packages ● A recipe generates 1 or more binary packages

● Each recipe build is split into 'tasks'

● Tasks are scheduled by bitbake based on parallelism and dependencies

● fetch, unpack, patch, configure, build, install, package

● All packages are built from scratch with same compiler configuration (CPU,

optimizations, tuning, …) according to the underlying target CPU.

● Standard packages are created managed automatically (most of the time)

● Binaries are stripped automatically, and debug binaries are placed in -dbg

packages

● Development packages with .h , .so, .a, .pc, …

● ...

● Packages dependencies

● build depends (DEPENDS) are mandatory and explicit in recipes

● Run time depends (RDEPENDS) are semi-automatic (shlibdeps, pcdeps)

Page 11: Introduction to OpenEmbedded and Yocto

11

OpenEmbedded images ● Images are standard recipe (e.g. .bb file), with a different 'task set'

● Images are expected to be 'deployed' on target

● Most standard image format are supported (ext2/3, tarball, jffs2, cramfs, ramdisk,

…)

● Support for image generation 'post scripting'

● Packages are assembled into the final root file system to make up images

● Image recipe lists all components/applications required in the image

● RDEPENDS used to pull all the needed libraries, ...

● Multiple images can be built from the same 'build', by assembling different set of

packages

● OpenEmbedded has (optional) support for package management in the target

image: .rpm, .ipk, .deb.

● Can be used to implement a binary package based distro (with package feed)

● However OE always uses packages 'internally' to build images.

Page 12: Introduction to OpenEmbedded and Yocto

12

OpenEmbedded layers

● Couple of years ago, OpenEmbedded used to be a monolithic repo with thousands of

recipes, and became impractical to maintain and use

● Layer concept introduced

● Layers contain additional metadata (recipes, machine, distro, …)

● Oe-core is the base layer for the most fundamental components

● layers provide additional features: meta-systemd, meta-gnome, …

● Layers can be inter-dependent

● Layers can be hosted in different 'trees' (git)

● All layers must work with oe-core

● Layers can add, modify content/beahvior, and/or alter, extend metadata from other

layers.

● Generally, each BSP or distro has its own layer(s)

● meta-linaro, https://git.linaro.org/gitweb?p=openembedded/meta-linaro.git

● OpenEmbedded metadata on line index: http://layers.openembedded.org/

Page 13: Introduction to OpenEmbedded and Yocto

13

Poky

● Poky is a reference distro implementation.

● Minimal console only image

● Full Linux system with GUI using “sato”

● Generally used as a starting point (or an example) for building one's own

(commercial) distro: Angstrom, ELDK, Mentor Linux, Wind River Linux, ENEA

Linux, ...

● “it is often just a starting point, not an end goal”

● Built with bitbake and these layers: oe-core, meta-yocto, meta-yocto-bsp

(and yes, the name is confusing!)

● Used to test/validate OpenEmbedded by Yocto Project developers

● “Poky-tiny” is a variant that provides size optimized image.

● “Poky-bleeding” is a variant that uses bleeding edge software version

Page 14: Introduction to OpenEmbedded and Yocto

14

SDK ● Application Development Toolkit (ADT) provides custom built,

cross development SDK tailored for the image being built

● Cross toolchain

● Matching sysroot

● Eclipse IDE Yocto plugin

● Support SDK for x86 and/or x86-64 hosts

● ADT can be installed on 'OEM', customer hosts without the

need to rebuild the entire image packages

● “bitbake meta-toolchain” : includes only the minimal cross toolchain and

libs

● “bitbake -c populate_sdk <image>” : includes all the development

headers, libs, … for every package included in the image. e.g. build SDK

that matches the target image

Page 15: Introduction to OpenEmbedded and Yocto

15

Anatomy of a build folder ● Lots of space … ~20 Gb

● Entirely contained in '<build>' folder

● Sources used are in '<build>/downloads'

● Builds are in '<build>/tmp/work/<arch>'

● 'deploy' has

● Ready to use images

● Packages

● license information

● Buildhistory records information about content of

images, and package build after build (with diffs)

● 'flat' rootfs also available in image <work> folder

● INHERIT += “rm_work” cleans up each <work> folder

upon successful build

Page 16: Introduction to OpenEmbedded and Yocto

OpenEmbedded and Linaro

Page 17: Introduction to OpenEmbedded and Yocto

17

Background

● Originally we started using OE to bootstrap

Aarch64 support

● Also used by Toolchain WG to validate compiler

● Extended interest by networking WG and others

● Integrated to our CI loop

Page 18: Introduction to OpenEmbedded and Yocto

18

Quickstart

● Git clone git://git.linaro.org/openembedded/jenkins-setup.git

● $ sudo bash pre-build-root-install-dependencies.sh

● $ init-and-build.sh linaro-image-minimal

● Have a nice cup

● of coffee!

Page 19: Introduction to OpenEmbedded and Yocto

19

Show me the code

● git.l.org/openembedded/jenkins-setup.git

● Setup and build script as used by integration

● git.l.org/openembedded/manifest.git

● Repo manifest, describes used git repositores

● git.l.org/openembedded/meta-linaro.git

● Contains Linaro, toolchain and aarch64 layers

● Branches for head and stable (dylan)

● Poky support being worked on

Page 20: Introduction to OpenEmbedded and Yocto

20

Continuous integration

● Jenkins: builds – LAVA runtime testing

● https://ci.linaro.org/jenkins/job/openembedded-armv8-rootfs/

● Building the minimal, lamp and Java Images

● https://git.linaro.org/gitweb?p=qa/test-

definitions.git;a=tree;f=openembedded

● Test definitions for LAVA

● http://validation.linaro.org/lava-server/dashboard/image-

reports/minimal-armv8

● Test results in LAVA

● Similar pages for LAMP and JAVA images

Page 21: Introduction to OpenEmbedded and Yocto

21

Future plans

● Switching to Poky/Yocto or stable OE

● Changes in OE head disruptive

● Repo manifest tagging for releases

● For reproducibility

● CI integration of ARMv7 and big endian

● Bitbake world -k for toolchain validation

● Try to keep things simple instead of supporting every possible

usecase.

Page 22: Introduction to OpenEmbedded and Yocto

22

Resources

● https://www.yoctoproject.org/

● http://openembedded.org/wiki/Main_Page

● http://www.slideshare.net/rossburton/the-yocto-project

● https://www.yoctoproject.org/documentation/current

● http://layers.openembedded.org/layerindex/

● http://www.linuxfoundation.org/news-media/blogs/browse/2013/05/new-paper-how-engineering-

leaders-can-use-yocto-project-solve

● http://www.linuxfoundation.org/news-media/announcements/2010/10/linux-foundation-and-

consumer-electronics-linux-forum-merge

● http://www.linuxfoundation.org/news-media/blogs/browse/2010/10/while-apple-debates-open-vs-

integrated-we-want-best-both-worlds

Page 23: Introduction to OpenEmbedded and Yocto

23

Thank you!

Page 24: Introduction to OpenEmbedded and Yocto

24

OpenEmbedded/Yocto 'lab'

Page 25: Introduction to OpenEmbedded and Yocto

25

Demystify OE/Yocto

build through a practical exercise

● Build a minimal console image for qemuarm

● Run the image in QEMU

● Explore and understand the OE build directory

structure

● Look at some basic OE developers tasks

● Build/run an application with SDK

Page 26: Introduction to OpenEmbedded and Yocto

26

Practical information

● Source and build cache

● “repo” tool

● Sample of recipe

● Lab instructions are here:

● Part1: https://collaborate.linaro.org/x/NYBm

● Part2: https://collaborate.linaro.org/x/q4Bm

● Part3: https://collaborate.linaro.org/x/zIBm

● Ask questions, we are here to answer them!

Page 27: Introduction to OpenEmbedded and Yocto

27

Interesting things to do...

● Explore configuration files

● Checkout some recipes

● Explore 'WORKDIR' and 'deploy' folders (image and package

feed)

● Customize your image

● Add a new recipe, create your own layer

● Exercise with .bbappend

● Create a patch, and apply in recipe

● Use/understand bitbake 'tasks' and experiment typical

developer workflow (build, debug, edit, build, debug, ...)

Page 28: Introduction to OpenEmbedded and Yocto

28

Sources mirror, build cache

● OpenEmbedded 'trees' contain no source code

● By design, everything is built from scratch.

● Source code for all recipes is fetched during the build

● 'fetchall' target let you download all source first

● PREMIRROR let you configure OE to use an alternative mirror before going to the Internet

(can be local/intranet)

● OE implements “shared state code” (aka sstate) to support incremental builds

● OE uses hash/signature on each 'task' input variables to decide if task needs to be rebuilt.

● Prebuilt components are stored in “sstate” cache, which can be local or http, and can be

shared across multiple users.

● Even after deleting the entire working folder, a rebuild is 'instantaneous'

● We prepared 'tarballs' for 'download' and 'sstate' to make this workshop more

efficient, hopefully you've downloaded everything already

● http://people.linaro.org/~trevor.woerner/LCE2013/

● Otherwise we have a couple of HDDs

Page 29: Introduction to OpenEmbedded and Yocto

29

“repo” tool

● Implemented initially by the Android team to manage Android source repositories

● Open source tool: https://code.google.com/p/git-repo/

● Wrapper on top of git

● Manage 'forest' of git trees

● Support multiple 'product' branches and easy switch from one checkout to another

● Trees metadata stored in 'XML manifest' file

https://gerrit.googlesource.com/git-repo/+/master/docs/manifest-format.txt

● Manifest can checkout:

● Latest commit on branch (development)

● Fix commit/tag (release)

● All Linaro OE projects are moving to “repo”

● Repo can (optionally) be used with Gerrit code review

Page 30: Introduction to OpenEmbedded and Yocto

30

Manifest sample

<?xml version="1.0" encoding="UTF-8"?> <manifest> <remote name="linaro" fetch="git://git.linaro.org" /> <remote name="oe" fetch="git://git.openembedded.org" /> <remote name="beagleboard" fetch="git://github.com/beagleboard" />

<default remote="oe" revision="master" sync-j="2" />

<project name="openembedded-core" /> <project name="meta-openembedded" /> <project path="openembedded-core/bitbake" name="bitbake" /> <project path="meta-linaro" name="openembedded/meta-linaro" remote="linaro" /> <project name="meta-beagleboard" remote="beagleboard"/>

</manifest>

Page 31: Introduction to OpenEmbedded and Yocto

31

How to use “repo”

# install repo wrapper (once on each machine) $ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > /tmp/repo $ chmod a+x /tmp/repo $ sudo mv /tmp/repo /usr/local/bin/ # initialize the repo, and download the manifest $ mkdir <mydir> && cd <mydir> $ repo init -u <manifest.git> -b <branch> # download and checkout all projects $ repo sync # build, edit, commit, debug, … # update my working copy $ repo sync # switch to another branch/product $ repo init -b <my other branch> $ repo sync

commands: list status info diff grep

Page 32: Introduction to OpenEmbedded and Yocto

32

Hello World! DESCRIPTION = "Simple helloworld application" SECTION = "examples" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" PR = "r0" SRC_URI = "file://helloworld.c" S = "${WORKDIR}" do_compile() { ${CC} helloworld.c -o helloworld } do_install() { install -d ${D}${bindir} install -m 0755 helloworld ${D}${bindir} }

Packages:

helloworld

helloworld-dev

helloworld-dbg

Page 33: Introduction to OpenEmbedded and Yocto

33

smartmontools

# meta-oe/recipes-extended/smartmontools/smartmontools_6.1.bb SECTION = "console/utils" DESCRIPTION = "Control and monitor storage systems using S.M.A.R.T." HOMEPAGE = "http://smartmontools.sourceforge.net/"

LICENSE = "GPLv2" LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263"

SRC_URI = "${SOURCEFORGE_MIRROR}/smartmontools/smartmontools-${PV}.tar.gz" SRC_URI[md5sum] = "83a3a681f8183ed858392d550ae1cca6" SRC_URI[sha256sum] = "a9003b8bccc82682f658ce76d70edb1842411e51dc56d4cd6b56618da1d9ce07"

inherit autotools

http://cgit.openembedded.org/meta-openembedded/commit/?id=8fec906a4584f9cbc467fb0e406bb6a705848b64

Page 34: Introduction to OpenEmbedded and Yocto

34

Using layer to alter recipes

$ more meta-linaro/recipes-core/busybox/busybox_1.20.2.bbappend SRC_URI += "file://linaro.cfg"

$ more meta-aarch64/recipes-sato/webkit/webkit-gtk_1.8.3.bbappend SRC_URI_append = "file://aarch64.patch”

● “<packagename>_<version>.bbappend” files can be used in layers

● Any variable from the original recipe can be modified

● Very neat for patching! Avoid duplication, fragmentation.

● “bitbake-layers show-appends”

Page 35: Introduction to OpenEmbedded and Yocto

35

Backup slides

Page 36: Introduction to OpenEmbedded and Yocto

36

Tuning compiler ● CPU compiler options, FPU and ABI can be fully tuned from the machine

configuration file

● Each 'architecture' gets a set of pre-defined 'tunes'

● For ARM : VFP vs neon, Thumb vs ARM instructions, Little vs big endian, Calling

conventions (hardfp vs softfp, …)

TUNEVALID[neon] = "Enable Neon SIMD accelerator unit." TUNE_CCARGS .= "${@bb.utils.contains("TUNE_FEATURES", "neon", " -mfpu=neon", "" ,d)}" ARMPKGSFX_FPU .= "${@bb.utils.contains("TUNE_FEATURES", "neon", "-neon", "" ,d)}"

TUNEVALID[vfp] = "Enable Vector Floating Point (vfp) unit." ARMPKGSFX_FPU .= "${@bb.utils.contains("TUNE_FEATURES", "vfp", "-vfp", "" ,d)}" TUNEVALID[callconvention-hard] = "Enable EABI hard float call convention, requires VFP." TUNE_CCARGS .= "${@bb.utils.contains("TUNE_FEATURES", "vfp", bb.utils.contains("TUNE_FEATURES", "callconvention-hard", " -mfloat-abi=hard", " -mfloat-abi=softfp", d), "" ,d)}" ARMPKGSFX_EABI .= "${@bb.utils.contains("TUNE_FEATURES", [ "callconvention-hard", "vfp" ], "hf", "", d)}"

Page 37: Introduction to OpenEmbedded and Yocto

37

Layer configuration file

# LAYER_CONF_VERSION is increased each time build/conf/bblayers.conf # changes incompatibly LCONF_VERSION = "5" BBPATH = "${TOPDIR}" BBFILES ?= "" BBLAYERS ?= " \ ${TOPDIR}/openembedded-core/meta \ ${TOPDIR}/meta-openembedded/toolchain-layer \ ${TOPDIR}/meta-openembedded/meta-multimedia \ ${TOPDIR}/meta-openembedded/meta-oe \ ${TOPDIR}/meta-linaro/meta-linaro \ ${TOPDIR}/meta-linaro/meta-linaro-toolchain \ ${TOPDIR}/meta-qt5 \ " BBLAYERS_NON_REMOVABLE ?= " \ ${TOPDIR}/openembedded-core/meta \ "

Page 38: Introduction to OpenEmbedded and Yocto

38

Machine configuration file #@TYPE: Machine #@NAME: common_pc #@DESCRIPTION: Machine configuration for running a common x86

PREFERRED_PROVIDER_virtual/xserver ?= "xserver-xorg" PREFERRED_PROVIDER_virtual/libgl ?= "mesa" PREFERRED_PROVIDER_virtual/libgles1 ?= "mesa" PREFERRED_PROVIDER_virtual/libgles2 ?= "mesa"

require conf/machine/include/qemu.inc require conf/machine/include/tune-i586.inc

KERNEL_IMAGETYPE = "bzImage"

SERIAL_CONSOLE = "115200 ttyS0"

XSERVER = "xserver-xorg \ mesa-driver-swrast \ xf86-input-vmmouse \ xf86-input-keyboard \ xf86-input-evdev \ xf86-video-vmware"

MACHINE_FEATURES += "x86"

MACHINE_ESSENTIAL_EXTRA_RDEPENDS += "v86d"

qemux86.conf

Page 39: Introduction to OpenEmbedded and Yocto

39

User local configuration file

# Parallelism Options #BB_NUMBER_THREADS = "4" #PARALLEL_MAKE = "-j 4" MACHINE = "qemuarm" DISTRO = “poky” PACKAGE_CLASSES ?= "package_ipk" # "dbg-pkgs" - add -dbg packages for all installed packages # (adds symbol information for debugging/profiling) # "tools-testapps" - add useful testing tools (ts_print, aplay, arecord etc.) # "debug-tweaks" - make an image suitable for development # e.g. ssh root access has a blank password EXTRA_IMAGE_FEATURES = "debug-tweaks" # - 'buildstats' collect build statistics # - 'image-prelink' in order to prelink the filesystem image USER_CLASSES ?= "buildstats image-prelink" #SSTATE_MIRRORS ?= "\ #file://.* http://someserver.tld/share/sstate/PATH;downloadfilename=PATH \n \ #file://.* file:///some/local/dir/sstate/PATH"

Page 40: Introduction to OpenEmbedded and Yocto

40

Yocto Project Branding/Compliance

● Compliance controls the usage of the Yocto project name, logo

and brand.

● Yocto Project Participants

● Open source project, non profit, small business

● Committed to promoting and contributing to Yocto Projects (oe-core,

bitbake, yocto layers)

● Yocto Project Compatible

● Products, BSP, layers maintained by an open source, non profit, or Yocto

Project member organisation

● Compatible with a specific release of Yocto

● Contribute all Yocto Projects patches upstream

● All Yocto recommendations/processes implemented