kas: Mal eben schnell ein Yocto-Projekt aufsetzen

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 sourceen?

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

Foto unseres SetupsAbschließ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.