Falls du nicht (mehr) weißt, worum es sich bei „Yocto“ handelt, was ein Layer, Rezept oder bitbake
sind, empfehle ich dir unseren Blogbeitrag zum Thema.
Mal wieder ein Yocto-Setup
Vor kurzem hatten wir mit unserem Team einen Workshop-Tag, an dem wir mit Flutter auf dem Raspberry Pi experimentieren wollten. Einen Flutter Yocto-Layer gibt es bereits und Support für den verwendeten Raspberry Pi 4 mit Touchdisplay sowieso.
Cool! Also „nur mal eben schnell“ ein neues Yocto-Projekt aufsetzen. Was brauche ich nochmal? Erstmal die üblichen Pakete installieren (oder noch besser: „dockerisieren“). Die benötigten Layer (Flutter, RPi, …) muss ich jetzt wieder mit Google Repo in ein XML-Manifest stecken. Und meinen eigenen Layer mit eigenen Rezepten für unsere Flutter-Beispielanwendung muss ich auch noch irgendwie integrieren! Wie rufe ich nochmal bitbake
auf und welche Datei muss ich davor immer source
en?
Ein neues Yocto-Projekt auf der grünen Wiese aufsetzen klingt mühsam und viele Teile davon irgendwie auch automatisierbar, oder?
Wir benötigen mehr YAML
Das dachten sich Entwickler bei Siemens offensichtlich auch und veröffentlichten ein Tool namens kas. Mit Python, Docker und YAML nimmt es uns viele von den oben genannten Aufgaben ab. Die dazugehörige Doku ist schnell gelesen und die von uns benötigten Layer sind in einer .config.yaml
definiert:
--- header: version: 11 machine: raspberrypi4-64 distro: poky target: core-image-minimal repos: poky: url: "https://git.yoctoproject.org/git/poky" refspec: "dunfell" layers: meta: meta-poky: meta-yocto-bsp: meta-flutter: url: "https://github.com/meta-flutter/meta-flutter" refspec: "dunfell" meta-clang: url: "https://github.com/kraj/meta-clang" refspec: "dunfell" meta-raspberrypi: url: "https://git.yoctoproject.org/git/meta-raspberrypi" refspec: "dunfell"
kas lädt die Layer in der entsprechenden Revision herunter und fügt sie anschließend der bblayers.conf
hinzu.
Dann mal los!
Um kas auszuführen, gibt es diverse Wege. Wir haben den des geringsten Widerstands gewählt: kas-container. kas-container
ist ein Wrapper um einen Docker-Container, der alles bereitstellt für einen erfolgreichen Yocto-Build mit kas
.
Am Ende besteht unsere Projekt-README nur aus einer Zeile:
./kas-container build
Dieser Befehl lädt das benötigte Docker-Image und führt darin kas
mit unserer YAML-Konfiguration aus.
Das wiederum bedeutet, dass kas
die konfigurierten Layer klont, auscheckt und anschließend bitbake
mit den entsprechenden Parametern für das konfigurierte Image (core-image-minimal
) und die Zielplattform (raspberrypi4-64
) ausführt.
Nach einer guten Stunde (der performanten Build-Maschine sei Dank) lag unter build/tmp/deploy/images/raspberrypi4-64
ein flash-bares .wic-Image!
Selbst gemacht schmeckt am besten
Abschließend fehlte uns nur noch das eigene Rezept in unserem eigenen Layer. Unser Layer und unsere kas-Konfiguration sind Teil eines Repositories namens meta-workshop
. So fügen wir dieses Repo der Liste von Repos in der .config.yaml hinzu:
# ... repos: # Fügt das Repository, in dem diese YAML-Config liegt, als Layer hinzu: # (kein refspec oder url noetig) meta-workshop: poky: # ... siehe oben
Damit bitbake
unser eigenes Rezept auch findet, benötigen wir eine Layer-Konfigurationsdatei unter conf/layer.conf
:
BBPATH .= ":${LAYERDIR}" BBFILES += "${LAYERDIR}/*/*/*.bb ${LAYERDIR}/*/*/*.bbappend" BBFILE_COLLECTIONS += "workshop" BBFILE_PATTERN_workshop := "^${LAYERDIR}/" BBFILE_PRIORITY_workshop = "6"
Unser eigenes Rezept haben wir unter recipes-flutter/workshop/workshop-app.bb
abgelegt (nicht in diesem Blogartikel enthalten, aber stark angelehnt an dem flutter-gallery Rezept) und dieses dem Image hinzugefügt, indem wir die .config.yaml ein weiteres Mal erweitern:
local_conf_header: flutter-stuff: | IMAGE_INSTALL:append = " workshop-app"
Nach einem weiteren kas-container build
-Aufruf hielten wir ein Image inkl. unserer Beispielanwendung in den Händen.
Fazit
Dank kas war das sonst recht mühselige initiale Aufsetzen eines neuen Yocto-Projekts innerhalb kürzester Zeit abgeschlossen und wir konnten uns auf das eigentliche Thema unseres Workshops konzentrieren. Alle Parameter, die es braucht (Layer, local.conf, usw.), in einer zentralen Konfigurationsdatei zu haben und ein Tool, das sich um fast alles kümmert (Docker-Image, bitbake-Aufrufe), waren auf jeden Fall eine angenehme Erfahrung. kas werde ich definitiv auch in Zukunft verstärkt einsetzen.
Mehr Informationen zum Thema Medical Devices findest du hier in unserem Kompetenzfeld.
- Lebende BDD-Testspezifikation mit Gherkin - 14. Juli 2022
- kas: Mal eben schnell ein Yocto-Projekt aufsetzen - 9. Juni 2022
- Certified Method Park Engineer: Code Review mit Gerrit - 12. April 2018