Skip to content

Tag 8 Hello World in Yocto

Roelof Berg edited this page Feb 12, 2017 · 1 revision

Bitbake

Yocto basiert auf Bitbake. Zur Erinnerung, in Bitbake sind alle Software-Tools der Firma als Layers vorhanden (auch 3d party libraries wie QT). Ein Projekt selektiert sich daraus die nötigen. Ein Layer enthält mehrere Rezepte (.bb files) und ein Rezept enthält mehrere Tasks.

Yocto macht einige Schritte in einem Rezept. Z.B. Quellen besorgen (z.B. aus GIT von extern oder auch von intern), Quellen patchen (das ist oft nötig für Embedded Target Anpassungen), Compillieren, installieren (in ein Target-Filesystem, unter einem Folder, der später als Root-Directory auf dem Target installiert werden wird).

Alle Schritte siehe hier: http://www.yoctoproject.org/docs/current/dev-manual/dev-manual.html#new-recipe-writing-a-new-recipe

Übung 1:

Add our own application. First create a layer (meta-package) 'meta-lunix' (a layer contains n recipes) and our first recipe 'hello'.

cd ~/lunix/yocto/sources/poky

mkdir meta-lunix

mkdir meta-lunix/conf

mkdir meta-lunix/recipes-lunix

mkdir meta-lunix/recipes-lunix/hello

Add layer to configuration:

nano meta-lunix/conf/layer.conf

Content: # We have a conf and classes directory, add to BBPATH

BBPATH := "${BBPATH}:${LAYERDIR}" 

# We have a packages directory, add to BBFILES 

BBFILES := "${BBFILES} ${LAYERDIR}/recipes-*/*/*.bb \ 
                 ${LAYERDIR}/recipes-*/*/*.bbappend" 
BBFILE_COLLECTIONS += "lunix" 

BBFILE_PATTERN_jfa := "^${LAYERDIR}/" 

BBFILE_PRIORITY_jfa := "5"

Download hello application:

cd ~/lunix/tmp

wget ftp://ftp.gnu.org/gnu/hello/hello-2.7.tar.gz

tyr -xfz hello-2.7.tar.gz

md5sum hello-2.7/COPYING

md5sum hello-2.7.tar.gz

Create a bitbake command file for the hello application in our meta-lunix recipe. Use the md5-sum from above in the md5=... section. From the file COPYING into LIC_FILEC_CHECKSUM and from the .tar.gz into SRC_URI[md5sum].

(Yocto will lateron also download the application and build from source - as with any other package too.)

nano ~/lunix/yocto/sources/poky/meta-lunix/recipes-lunix/hello/hello_2.7.bb
DESCRIPTION = "GNU Helloworld application" 
SECTION = "examples" 
LICENSE = "GPLv3+" 
LIC_FILES_CHKSUM = "file://COPYING;md5=d32239bcb673463ab874e80d47fae504" 
PR = "r0" 
SRC_URI = "${GNU_MIRROR}/hello/hello-${PV}.tar.gz" 
SRC_URI[md5sum] = "fc01b05c7f943d3c42124942a2a9bb3a"
inherit autotools gettext 

Build the source (only of our hello package):

cd ~/lunix/yocto/sources/poky

MACHINE=udooneo source oe-init-build-env build-hello

We're in the build-hello directory now and (as in the very beginning with udooneo) we need to make known our new layer to Yocto. Go back into the main conf directory

cd ~/lunix/yocto/build
nano conf/bblayers.conf

Add one line to BBLAYERS like here the last one:

# LAYER_CONF_VERSION is increased each time build/conf/bblayers.conf 

# changes incompatibly 

LCONF_VERSION = "4" 

BBFILES ?= "" 

BBLAYERS = " \ 

  /home/lunix/lunix/yocto/sources/poky/meta \ 

  /home/lunix/lunix/yocto/sources/poky/meta-yocto \ 

  /home/lunix/lunix/yocto/sources/poky/meta-lunix \

  "

And again to local.conf we need to add the installation target. (Here is chosen what will actually be installed. Above what is available for the build in theory.). By the way, uncommenting BB_NUMBER_THREADS for parallel builds speeds things up ;)

nano conf/local.conf

Content

IMAGE_INSTALL_append = " hello"

Now build the whole image again as written at the very beginning of the page.

(Informationen waren von https://wiki.yoctoproject.org/wiki/How_do_I#Q:_How_do_I_put_my_recipe_into_Yocto.3F )

Übung 2:

Mache ein Update von hello. Von V2.7 auf V2.9. Schritte: .bb-Datei umbenennen, die $(PV) Variable zeigt dann auf die neue Version (Product Version). Dann die Checksummen nochmal anpassen.

Übung 3:

Download vom Morseprogramm Installation in Yocto Advanced: Einfügen in Autostart, sodass das nach dem Booten ertönt (Recherche)

Übung 4:

Kernelparameter verändern. Ihr erinnert Euch bestimmt an die Konfiguration der Kerneloptionen. Sobald man einen passenden Kernel konfiguriert hat (mit den Methoden, die Ihr schon kennt, kernel downloaden, make config, make install, auf SD-Karte kopieren ...), kann man die so für gut befundenen Einstellungen nach Yocto übertragen. Z.B. einen Diff zwischen der Yocto-Config und der eigenen machen und dann die Änderungen wie folgt einpflegen (sie überschreiben vorhandene):

Beispiel, um eine 8250 UART zu aktivieren: Create a file named 8250.cfg in the files directory with the following content (without indentation):

CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_SERIAL_8250_PCI=y
CONFIG_SERIAL_8250_NR_UARTS=4
CONFIG_SERIAL_8250_RUNTIME_UARTS=4
CONFIG_SERIAL_CORE=y
CONFIG_SERIAL_CORE_CONSOLE=y

Next, include this configuration fragment and extend the FILESPATH variable in your .bbappend file:

FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
SRC_URI += "file://8250.cfg"

(Entnommen aus: http://www.yoctoproject.org/docs/1.6.1/kernel-dev/kernel-dev.html#changing-the-configuration )