Dieser Post ist Teil der Serie über mein
privates BeagleBone-Black-Projekt.
Der Yocto-Tutorial
zeigt unter "Weiterführende Themen" bereits, wie man mit
bitbake-layers create-layer ein eigenes Layer anlegt, eine eigene Recipe
schreibt und den Kernel per .bbappend samt Device-Tree-Anpassung erweitert.
Das reicht für ein Bastelprojekt völlig aus — sobald aber ein echtes Produkt
mit mehreren Hardware-Revisionen, mehreren Software-Varianten und einem Team
dahinter steht, stößt der Ein-Layer-Ansatz an Grenzen. Dieser Post zeigt die
Themen, die dabei typischerweise dazukommen.
Warum ein einzelnes Layer nicht reicht
Ein einzelnes meta-mybbb-Layer vermischt drei Dinge, die eigentlich
unabhängig voneinander variieren:
Hardware-spezifisches — Pinmux, Device-Tree-Anpassungen, welche Kernel-Treiber gebraucht werden (ändert sich pro Board-Revision)
Distributions-Policy — welche Init-Manager, welche C-Bibliothek, welche Sicherheits-Härtung (ändert sich pro Produktlinie, nicht pro Board)
Anwendungslogik — die eigentliche Applikation und ihre Abhängigkeiten (ändert sich am häufigsten, unabhängig von Hardware und Distribution)
Die etablierte Yocto-Konvention trennt das in drei Layer-Typen:
| Layer-Typ | Inhalt |
|---|---|
| Board-Support: Machine-Definitionen, Kernel-`.bbappend`s, Device-Tree |
| Distro-Policy-Datei ( |
| Anwendungs-Recipes, Image-Definitionen |
Diese Dreiteilung lohnt sich nicht für jedes Projekt — für ein einzelnes Board mit einer Firmware-Variante ist das Einzel-Layer aus dem Haupt-Yocto-Tutorial oft die pragmatischere Wahl. Die Trennung zahlt sich aus, sobald mindestens zwei der drei Dimensionen (Hardware, Distro, Anwendung) unabhängig voneinander variieren. |
Layer-Prioritäten und -Abhängigkeiten im Detail
conf/layer.conf jedes Layers definiert mehr als nur den Layer-Namen:
BBPATH .= ":${LAYERDIR}"
BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \
${LAYERDIR}/recipes-*/*/*.bbappend"
BBFILE_COLLECTIONS += "mybbb-bsp"
BBFILE_PATTERN_mybbb-bsp = "^${LAYERDIR}/"
BBFILE_PRIORITY_mybbb-bsp = "8"
LAYERDEPENDS_mybbb-bsp = "core ti-bsp"
LAYERSERIES_COMPAT_mybbb-bsp = "scarthgap"| Parameter | Bedeutung |
|---|---|
| Entscheidet, welches Layer bei kollidierenden |
| Welche anderen Layer vorhanden sein müssen — |
| Für welche Yocto-Release-Codenamen (hier |
Ein häufiger Fehler: Zwei eigene Layer (z. B. |
PACKAGECONFIG: Recipe-Features an-/abschalten ohne Fork
Viele komplexere Recipes (z. B. für Bibliotheken mit optionalen
Abhängigkeiten) definieren PACKAGECONFIG-Flags, über die sich einzelne
Build-Features gezielt an- oder abschalten lassen, ohne die Recipe selbst
zu verändern:
# in einem eigenen .bbappend, z. B. für eine Bibliothek mit optionalem
# SSL-Support
PACKAGECONFIG:append = " ssl"
PACKAGECONFIG[ssl] = "--with-ssl,--without-ssl,openssl"Die drei Kommaseparierten Werte in PACKAGECONFIG[<feature>] bedeuten:
Konfigurationsflag wenn aktiviert, Konfigurationsflag wenn deaktiviert,
zusätzliche Build-Abhängigkeit wenn aktiviert.
|
bblayers.conf: Reihenfolge-Fallstricke
bblayers.conf listet alle aktiven Layer in BBLAYERS. Zwei Punkte, die
in der Praxis regelmäßig für Verwirrung sorgen:
Die Reihenfolge in
BBLAYERSselbst hat keinen Einfluss auf Recipe-Priorität — das steuert ausschließlichBBFILE_PRIORITYinlayer.conf(siehe oben). Viele Entwickler versuchen zuerst, Probleme über die Reihenfolge inbblayers.confzu lösen — das führt nirgendwohinEin Layer, das in
bblayers.confsteht, aber dessenLAYERDEPENDSnicht erfüllt sind, lässt den Bitbake-Start mit einer klaren Fehlermeldung abbrechen — im Gegensatz zu stillen Priority-Konflikten ein eher harmloser Fehlerfall
Rebuild-Zeiten im Griff behalten
Yocto-Builds sind lang — welcher Clean-Befehl wie viel verwirft, entscheidet über Minuten oder Stunden:
| Befehl | Wirkung |
|---|---|
| Löscht nur die Arbeitsverzeichnisse dieser Recipe, shared state bleibt erhalten — schnellster Rebuild |
| Löscht zusätzlich die Shared-State-Cache-Einträge dieser Recipe — nötig, wenn sich am Task-Hash nichts ändert, aber z. B. eine lokale Patch-Datei außerhalb des Hash-Systems verändert wurde |
| Löscht zusätzlich heruntergeladene Quellen — nur nötig, wenn der Source-Download selbst korrupt war |
|
Zusammenfassung
| Aspekt | Kernaussage |
|---|---|
Mehrschichtige BSP-Struktur | Lohnt sich, sobald Hardware, Distro-Policy und Anwendung unabhängig voneinander variieren — sonst reicht ein Layer |
Layer-Priorität | Steuert |
PACKAGECONFIG | Erlaubt Feature-Umschaltung ohne Recipe-Fork |
Rebuild-Zeit |
|