Yocto:SDK:HD51

Aus TuxBoxWIKI
Version vom 23. August 2018, 20:02 Uhr von Dbt (Diskussion | Beiträge) (Einleitung präzisiert)
Wechseln zu: Navigation, Suche

Wie Neutrino-Images auf der Basis von Yocto OpenEmbedded erstellt werden, wurde bereits für Stlinux-basiernde Geräte beschrieben. Damit ist es generell möglich, mit bestimmten Linux-Grundkenntnissen, sein eigenes Image zu erzeugen, bzw. gibt Distributoren ein solides Werkzeug in die Hand, um Releases mit einer zuverlässigen Paktierung für Updates bereitzustellen und zu warten. Das Yocto-Build ist dafür quasi ein Standard und besitzt hierfür eine recht ausgereifte, gewartete und nachhaltig durchdachte Struktur. Für Entwickler ist es allerdings notwendig einen flexiblen Arbeitsbereich zu haben, um Applikationen zu entwickeln, zu warten und zu testen. Auch hierfür bietet Yocto passende Mittel. Dieser Artikel soll erklären, wie man eine solche Umgebung (SDK) aufsetzt und benutzt.

Vorbereitungen

Diese Anleitung wurde getestet mit OpenSuse 42.3. Für Debian basierende Distributionen sollten im wesentlichen die bereits hier genannten Schritte zur Vorbereitung zutreffend sein.

Stop hand.png HINWEIS:

Die hier verwendete Basis für die Erstellung einer Arbeitsumgebung basiert auf der Arbeit von Community-Mitgliedern. Auf Vollständigkeit, inhaltliche und rechtliche Korrektheit sowie Funktionsfähigkeit kann daher keine Garantie gegeben werden. Fehlerberichte, Meinungen und Vorschläge sollten daher an die Betreuer der jeweiligen Buildsysteme bzw. Layer gerichtet werden.

Pakete installieren

Für Debian basierte Systeme (getestet mit Wheezy und Jessie in 32/64bit).

$ sudo apt-get update
$ sudo apt-get install libsdl1.2-dev chrpath git build-essential automake texinfo

Für OpenSuse (getestet mit OpenSuse 42.3/15.0 64bit)

$ sudo zypper install git make gcc-g++ diffstat texinfo chrpath libSDL-devel python3-curses zip glew-devel freeglut-devel libid3tag-devel libmad-devel libogg-devel libsigc++2-devel flac-devel 
libvorbis-devel yasm

Bei Bedarf kann man weitere benötigte Pakete auch mit Hilfe der Suse Downloadsuche direkt nachinstallieren:

https://software.opensuse.org/search

Des Weiteren benötigt man ein extra Verzeichnis im $HOME in dem man alle nötigen Verzeichnisse samt zusätzlicher Unterverzeichnisse anlegen kann. Im folgenden wird $HOME/yocto verwendet, das kann natürlich jeder seinen Gepflogenheiten anpassen. Achtung, ein späteres Verschieben ist nicht einfach möglich da innerhalb der erzeugten Toolchain mit absoluten Pfaden gearbeitet wird!

$ mkdir ~/yocto && cd ~/yocto

Innerhalb dieses Verzeichnisses sollte man direkt auch einen gemeinsamen Downloadordner für die möglichen verschiedenen Systeme anlegen, dies erspart später mehrfaches Herunterladen der diversen Source Pakete. Wer ein entsprechendes Verzeichnis für derartige Downloads schon besitzt kann natürlich dieses auch per Symlink einbinden (oder in der späteren Konfiguration den entsprechenden Pfad angeben).

$ mkdir download

SDK erzeugen

Option 1 Download SDK

Hierbei wird nur ein von der Größe her moderates Installationsskript für das SDK heruntergeladen und nachfolgend beim Bauen alles nachgeladen, was benötigt wird. Diese Variante ist recht simpel und mit einer geeigneten Internetverbindung relativ schnell erledigt. Wer lieber selbst bauen will, sollte mit der Option 2 fortfahren. Das Ergebnis ist im Wesentlichen gleich.

 $ cd Downloads
 $ wget https://tuxbox-images.de/images/hd51/sdk/oecore-x86_64-cortexa15hf-neon-vfpv4-toolchain-ext-nodistro.0.sh
 --2017-11-10 17:08:08--  https://tuxbox-images.de/images/hd51/sdk/oecore-x86_64-cortexa15hf-neon-vfpv4-toolchain-ext-nodistro.0.sh
 Auflösen des Hostnamen »tuxbox-images.de (tuxbox-images.de)«... 217.160.11.114
 Verbindungsaufbau zu tuxbox-images.de (tuxbox-images.de)|217.160.11.114|:443... verbunden.
 HTTP-Anforderung gesendet, warte auf Antwort... 200 OK
 Länge: 28509099 (27M) [text/x-sh]
 In »»oecore-x86_64-cortexa15hf-neon-vfpv4-toolchain-ext-nodistro.0.sh«« speichern.
 
 100%[============================================================================================================================>] 28.509.099  1,53MB/s   in 18s
 
 2017-11-10 17:08:27 (1,49 MB/s) - »»oecore-x86_64-cortexa15hf-neon-vfpv4-toolchain-ext-nodistro.0.sh«« gespeichert [28509099/28509099]
 $

Installationsscript ausführbar machen:

 $ chmod 755 oecore-x86_64-cortexa15hf-neon-vfpv4-toolchain-ext-nodistro.0.sh

Anschließend installieren! Siehe hier!

Option 2 Eigenbau SDK

Hierbei wird quasi das komplette SDK mit Bitbake selbst erzeugt und anschließend das erzeugte SDK installiert. Im Gegensatz zur oben genannten Downloadmethode sind hier mehrere Schritte notwendig. Dies nimmnt natürlich mehr Zeit in Anspruch.

Schritt 1: Benötigte Repos klonen

Klonen des Yocto Poky Projektes in den Buildsystemordner

 $ git clone git://git.yoctoproject.org/poky.git poky
 Klone nach 'poky' ...
 remote: Counting objects: 412580, done.
 remote: Compressing objects: 100% (97765/97765), done.
 remote: Total 412580 (delta 308026), reused 412408 (delta 307854)
 Empfange Objekte: 100% (412580/412580), 149.51 MiB | 316.00 KiB/s, Fertig.
 Löse Unterschiede auf: 100% (308026/308026), Fertig.

Wir benötigen den sumo branch... dafür holen wir uns diesen noch ab und wechseln auf sumo:

 $ git checkout -b sumo  origin/sumo
 Branch sumo konfiguriert zum Folgen von Remote-Branch sumo von origin.
 Zu neuem Branch 'sumo' gewechselt
Stop hand.png Bemerkung zu den Yocto Projektnamen und Image-Versionierung:

Im Yocto-Projekt haben die verschiedenen Entwicklungstände wechselnde Projektnamen. Zum Beispiel der Sumo-Branch. Diese Stände definieren quasi den Releasestand. Parallel dazu sind auch intern die herkömmliche Revisionen vergeben. Sumo entspräche zB. 2.5.x. Diese Stände werden so auch in unser Image übertragen. Unter Neutrino kann man das auch über die Ausgabe der Informationen anzeigen lassen. In der Vergangenheit wurden Image- u. Neutrinoversionen bei den Community-Buildsystemen mehr oder weniger gleichgesetzt, weil zB. Updates oft über Release-Zyklen mit einem komplettem Imagewechsel einher gingen. Das war nachvollziebar und damals auch noch ausreichend. Angesichts des modularen Aufbaues in Form von revisionierter Paketierung sämtlicher Teile eines Flash-Images und weil die herkömmliche Aktualsierung über Flashprogrammierung sogesehen nur eine Versorgung mit einer Basisversion darstellt, wäre diese veraltete Vorgehensweise unpassend.

Klonen der Meta-Layer-Repos für Neutrino und der jeweiligen Plattform in den poky-Ordner

In diesem Fall wird als Beispiel die AX/Mut@nt HD51 Plattform verwendet.

 $ cd poky
 $ git clone https://github.com/neutrino-hd/meta-hd51.git
 $ git checkout -b sumo  origin/sumo
 Branch sumo konfiguriert zum Folgen von Remote-Branch sumo von origin.
 Zu neuem Branch 'sumo' gewechselt
 $ git clone https://github.com/neutrino-hd/meta-neutrino.git
 $ git checkout -b sumo  origin/sumo
 Branch sumo konfiguriert zum Folgen von Remote-Branch sumo von origin.
 Zu neuem Branch 'sumo' gewechselt

Schritt 2: Umgebung einrichten

Zuweisen der Vorlage für die Beispielkonfiguration

 $ export TEMPLATECONF=meta-hd51/example_neutrino

Umgebung für "build-hd51" mittels dem "Environment Skript" erzeugen

Es werden dabei automatisch die benötigten Umgebungsvariablen und ein Buildordner erzeugt und in diesen gewechselt

 $ . ./oe-init-build-env build-sdk-hd51

Schritt 3: Anpassen der Konfiguartion

  • mit einem Editor deiner Wahl, die Konfiguration bearbeiten
 $ kate conf/local.conf

Falls gewünscht, einen Downloadordner bestimmen. Dieser wird standardmäßig im Yocto-Ordner als yocto/download angelegt. Man kann auch einen Link auf einen bereits vorhandenen Ordner setzen, was durchaus Sinn macht, denn die Downloads dürften sehr umfangreich sein. Ein vorhandenes Archiv kann sich daher als vorteilhaft erweisen.

   DL_DIR = "/path/to/your/archiv"
  • Hosttyp zuweisen, auf dem dieses SDK lokal verwendet werden soll. Hier als Beispiel x86_64:
   #SDKMACHINE ?= "i686"
   SDKMACHINE ?= "x86_64"
   #SDK_LOCAL_CONF_WHITELIST = "SSTATE_MIRRORS"
   SDK_INCLUDE_PKGDATA = "0"
   #SSTATE_MIRRORS = "file://.* http://my.server.com/path/to/sstate-cache/PATH"
   
  • Entwicklung am Tuxbox-Neutrino erfordert diesen Eintrag, dies ist auch der Standard:
   FLAVOUR ="mp"
  • Je nachdem was die Hostmaschine verträgt, kann man hier die Anzahl der Threads und Parallel-Makes angeben.
   # Determine how many tasks bitbake should run in parallel:
   BB_NUMBER_THREADS ?= "4"
   # Determine how many processes make should run in parallel when running compile tasks:
   PARALLEL_MAKE ?= "-j 4"

DIESE EINSTELLUNG MUSS BLEIBEN!

  # What image to build ?
  IMAGENAME = "neutrino-image"
  • um mögliche Prüfsummenfehler zu vermeiden kann es erforderlich sein, diese Einträge auszukommentieren:
#UNINATIVE_CHECKSUM[x86_64]
#SSTATE_MIRRORS += " file://universal/(.*) file://universal-4.9/\1 file://universal-4.9/(.*) file://universal-4.8/\1"

Die anderen Einstellungen sollten sich von selbst ergeben.

Schritt 4: SDK bauen

 $ bitbake -c populate_sdk_ext neutrino-image

Dabei werden jede Menge Tasks ausgeführt wobei das Subkommando populate_sdk_ext bewirkt, dass die für das SDK zusätzlich nötigen Pakete erzeugt werden. Wenn alles glatt geht, sind neben den Standardpaketen, Images usw. die ohnehin unter tmp/deploy abgelegt werden nun auch die SDK-Pakete abgelegt. Das gewünschte Installationsskript für das SDK ist somit hier zu finden:

tmp/deploy/sdk/oecore-x86_64-cortexa15hf-neon-vfpv4-toolchain-nodistro.0.sh

Falls notwendig, das Installationsscript noch ausführbar machen:

  $ chmod 755 oecore-x86_64-cortexa15hf-neon-vfpv4-toolchain-nodistro.0.sh

SDK installieren

Je nachdem ob das Installationsskript frisch erzeugt wurde oder wie hier beschrieben heruntergeladen wurde, jetzt in das Verzeichnis wechseln, in dem sich das Skript befindet.

Installationsscript ausführen und den Anweisungen folgen.

Einige Eingaben können leer bleiben, um Standardwerte setzen zu lassen. Falls nötig, ist sudo erforderlich. Das Zielverzeichnis sollte man aber an einer für sich günstigen Stelle setzen, also möglichst schon etwas voraus planen.

 $ cd <Pfad/zum/Installations-Skript-Ordner>
 $ ./oecore-x86_64-cortexa15hf-neon-vfpv4-toolchain-nodistro.0.sh
    OpenEmbedded SDK installer version nodistro.0
    =============================================
    Enter target directory for SDK (default: /home/<USER<>/sdk):
    You are about to install the SDK to "/home/<USER<>/sdk". Proceed[Y/n]? y
    Extracting SDK......................................................................................done
    Setting it up...done
    SDK has been successfully set up and is ready to be used.
    Each time you wish to use the SDK in a new shell session, you need to source the environment setup script e.g.
    ...

Nach der Installation, sollte in etwa diese Struktur vorhanden sein:

 $ your@hostname:~/yocto/poky/build-sdk-hd51/tmp/deploy/sdk$ tree -L 4 /home/<USER<>/sdk
   /home/<USER>/sdk
   ├── environment-setup-cortexa15hf-neon-vfpv4-oe-linux-gnueabi  <- Das ist das SDK environment script 
   ├── site-config-cortexa15hf-neon-vfpv4-oe-linux-gnueabi
   ├── sysroots
   │   ├── cortexa15hf-neon-vfpv4-oe-linux-gnueabi
   .
   .
   .
   └── version-cortexa15hf-neon-vfpv4-oe-linux-gnueabi

SDK Umgebung erzeugen

In das frisch erzeugte SDK-Verzeichnis wechseln

 $ /home/<USER>/sdk

Environment Script ausführbar machen (falls erfordelich)

$ chmod 755 environment-setup-cortexa15hf-neon-vfpv4-oe-linux-gnueabi 

Um zu testen, wie die aktuelle Umgebung eingerichtet ist, kann man die $PATH Variable ausgeben lassen. Ohne das ausgeführte Skript würde das etwa so aussehen:

 $ echo $PATH
 $ /home/<USER>/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games:/usr/lib/mit/bin:/usr/lib/mit/sbin

Environment Script ausführen

 $ . ./environment-setup-cortexa15hf-neon-vfpv4-oe-linux-gnueabi

Was ist passiert? Das Skript sollte nun die Umgebung angepasst haben und man kann erahnen, worauf das Ganze hinausläuft.

 $ echo $PATH
 $ /home/<USER>/devel/sdk/hd51/sysroots/x86_64-oesdk-linux/usr/bin:/home/<USER>/devel/sdk/hd51/buildtools/sysroots/x86_64-oesdk-linux/usr/bin:/home/<USER>/devel/sdk/hd51/tmp/sysroots/x86_64/usr/bin:/home/<USER>/devel/sdk/hd51/tmp/sysroots/x86_64/usr/sbin:/home/<USER>/devel/sdk/hd51/tmp/sysroots/x86_64/bin:/home/<USER>/devel/sdk/hd51/tmp/sysroots/x86_64/sbin:/home/<USER>/devel/sdk/hd51/tmp/sysroots/x86_64/usr/bin/../x86_64-oesdk-linux/bin:/home/<USER>/devel/sdk/hd51/tmp/sysroots/x86_64/usr/bin/arm-oe-linux-gnueabi:/home/<USER>/devel/sdk/hd51/tmp/sysroots/x86_64/usr/bin/arm-oe-linux-musl:/home/<USER>/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games:/usr/lib/mit/bin:/usr/lib/mit/sbin
Stop hand.png HINWEIS:

Immer wenn man das SDK nutzen möchte und dafür eine neue Shell-Sitzung geöffnet hat, muss dieses Environment-Skript ausgeführt werden. Die Umgebung bleibt dann solange erhalten, bis diese Sitzung geschlossen wird!

Umgebungsvariablen

Neben der bereits angepassten $PATH-Umgebung, sind nun auch einige weitere Umgebungsvariablen verfügbar:

SDKTARGETSYSROOT - The path to the sysroot used for cross-compilation
PKG_CONFIG_PATH - The path to the target pkg-config files
CONFIG_SITE - A GNU autoconf site file preconfigured for the target
CC - The minimal command and arguments to run the C compiler
CXX - The minimal command and arguments to run the C++ compiler
CPP - The minimal command and arguments to run the C preprocessor
AS - The minimal command and arguments to run the assembler
LD - The minimal command and arguments to run the linker
GDB - The minimal command and arguments to run the GNU Debugger
STRIP - The minimal command and arguments to run 'strip', which strips symbols
RANLIB - The minimal command and arguments to run 'ranlib
OBJCOPY - The minimal command and arguments to run 'objcopy
OBJDUMP - The minimal command and arguments to run 'objdump
AR - The minimal command and arguments to run 'ar
NM - The minimal command and arguments to run 'nm
TARGET_PREFIX - The toolchain binary prefix for the target tools
CROSS_COMPILE - The toolchain binary prefix for the target tools
CONFIGURE_FLAGS - The minimal arguments for GNU configure
CFLAGS - Suggested C flags
CXXFLAGS - Suggested C++ flags
LDFLAGS - Suggested linker flags when you use CC to link
CPPFLAGS - Suggested preprocessor flags

SDK verwenden

Umgebung direkt nutzen

Quellcodedateien könnten praktisch damit bereits direkt kompiliert werden. Auch IDE's könnten damit eingerichtet werden. Befände man sich in dieser Umgebung, würde z.B. dieses Kommando ein Programm für die gewünschte Plattform erzeugen:

$ $CC main.cpp -o test

Auf Basis dieser angepassten Umgebung könnten bereits vorhandene Makfiles oder ganze Buildsysteme angepasst werden. Dabei müssten diese Umgebungsvariablen an das Buildsystem durchgereicht werden. Dies kann je nach Aufbau der Makefiles oder der Buildsystemstruktur sogar bereits funktionieren. Gut durchdachte Systeme sollten das durchaus ermöglichen, andernfalls kann es auch einen gewissen Aufwand bedeuten.

Arbeiten mit devtool

Wie bereits erwähnt wurde, bietet das Yocto-SDK Lösungen an, um gezielt an (fast) jeder beliebigen Applikation, die im Buildsystem übersetzt wird, zu arbeiten. Im SDK wird dafür zwar auch Bitbake genutzt, jedoch wird ein dafür speziell zugeschnittenes Script namens devtool verwendet. Dieses Script setzt zwar in gewissem Umfang auf Bitbake auf, stellt aber speziell für das SDK verwendbare Kommandos bereit. Die direkten Bitbake-Kommandos stehen daher in der SDK Umgebung nicht mehr zur Verfügung.

Vorbereitung

Konfiguration anpassen

Die Konfiguration des SDK befindet sich nun im SDK-Ordner unter:

sdk-hd51/conf/local.conf

Im Wesentlichen wurde die ursprüngliche Konfiguration des Buildsystems in die SDK-Konfiguration übernommen, jedoch sollte man dies zumindest nachprüfen und wenn nötig einige Anpassungen vornehmen, die den lokalen Gegebenheiten entsprechen. Wurde das SDK mit dem heruntergeladenen Installationsskript erzeugt, sollte man dies auf jeden Fall tun, da hier bestimmmte Einstellungen des Verteilers noch vorhanden sind und mit Sicherheit nicht zutreffen. Wenn alles passt, weiter mit dem nächsten Schritt.

Image bauen

$ devtool build-image

Das dauert eine Weile. Der Befehl vermittelt zwar nur, das ein lauffähiges Image erstellt wird, aber dieses Kommando sorgt auch dafür, dass alle zugehörigen Pakete erstellt werden und eine abgewandelte Version des Buildsystems samt benötigter Entwicklungsumgebung erzeugt wird. Dieser Vorgang ist daher zu Begin zwingend notwendig, damit die Arbeitsgrundlage für das weitere Arbeiten an den Sourcen überhaupt erst hergestellt wird.

Nachdem der Vorgang abgeschlossen ist, sollte ein fertig gebautes Image hier zu finden sein:

/home/<USER>/<PATH/TO/YOUR/SDK>/
|...
.
.
├── tmp
│   ├── deploy
│   │   ├── images
           └── ...

Dort werden mehrere Typen von Images abgelegt, die je nach Bedarf bzw. Hardwarevoraussetzung mit bestimmten Vorgehensweisen geflasht werden können.

Image flashen

Nachdem erfolgreich Images und Pakete erzeugt wurden, möchte man nun das Ganze auch benutzen. Dafür muss natürlich das Ergebnis auf die Zielhardware gebracht werden, indem man das erzeugte Image flasht. Anschließend ist die Hardware damit nutzbar und auch die deploy-target Methoden können zum Entwickeln zusammen mit Devtool verwendet werden.


Methode: E2

Für diese Methode wird die E2 Benutzeroberfläche verwendet, sofern diese (noch) installiert ist. In fabrikneuem Zustand sollte dies immer der Fall sein. E2 bietet dann auch die Möglichkeit, die gewünschte Start-Partition zu setzen.

Statt ein E2-Image muss logischerweise ein frisch erzeugtes Neutrino-Image genommen werden. Dafür ein Image aus ../tmp/deploy/images/hd51 holen! Neutrino-Images sind unter https://update.tuxbox-neutrino.org/dist/hd51/3.0.3/images zu finden. Die benötige Imagedatei hat die Kennung: ..._ofgwrite.zip.

Für diese Vorgehensweise sei auf die Anleitungen bei OpenATV verwiesen.


Methode: USB-Stick

Eine fabrikneue AX HD51/Mut@nt wird in der Regel mit E2 ausgeliefert und ist zudem multibootfähig. Der Flashspeicher ist daher recht üppig ausgestattet und bietet die Möglichkeit insgesamt 4 Partitionen mit jeweils einem Image zu bestücken, welches je nach Einstellung verwendet werden kann.

Flashen mit Hilfe eines USB-Sticks ist die gebräuchlichste Methode. Arbeitsschritte über GUI, serieller oder Shell-Zugang zur Box sind nicht notwendig.

Stop hand.png HINWEIS:

Diese Methode hat den Nachteil, dass zuvor bereits installierte Systeme nicht mehr verwendet werden können. Wer sich nicht daran stört, alle Informationen im emmc Speicher zu verlieren und eventuelle Multiboot Images unbrauchbar werden, kann diese Methode getrost verwenden.

Vor dem Flashen andere USB-Geräte wie Sticks oder Festplatten vom Gerät trennen!

  1. USB Stick mit mindestens 2 GB Speicher und formatiert mit FAT32 am PC vorbereiten.
  2. Image aus ../tmp/deploy/images/hd51 holen! Das Zip-File hat die Kennung: ..._usb.zip wobei das aktuellste immer ohne Zeitstempel beschriftet ist. Die restlichen ohne USB-Kennung werden für andere Methoden benötigt.
  3. Zip File entpacken und Ordner hd51 vollständig auf den USB Stick kopieren.
  4. Box vom Strom trennen
  5. USB-Stick an den Front-USB-Port einstecken.
  6. Power-Taste an der Frontseite gedrückt halten und Box unter Strom setzen.
  7. Sobald Flashing im Display erscheint, die Power-Taste loslassen.
  8. Nach erfolgreichem Flashen startet die Box automatisch.


Methode: Terminal

Diese Methode funktioniert nur, wenn bereits ein Neutrino-Image installiert wurde.

Benötigt wird ein Image aus ../tmp/deploy/images/hd51 mit der Bezeichnung:

neutrino-image-flash.zip

Image entpacken und den entpackten Ordner hd51 vollständig an einen Ort hochladen, wo genug Platz ist. Das Image ist gepackt ca. 100 MB bzw. entpackt ca. 800 MB groß. Ein USB-Stick würde sich beispielsweise anbieten.

Angenommen diese Datei wurde hier hin hochgeladen:

/media/USB/hd51

Auf die Box einloggen:

ssh root@hd51
.
.
.
 __  __         __         ___       __
 \ \/ /__  ____/ /____    / _ \___  / /____ __
  \  / _ \/ __/ __/ _ \  / ___/ _ \/  ´_/ // /
  /_/\___/\__/\__/\___/ /_/   \___/_/\_\\_, /
                                       /___/

Neutrino-HD image (based on Yocto tuxbox sumo)hd51 ttyS0

hd51 login: root
➜  ~


Kommando zum Flashen eingeben. Zu beachten wären die Parameter.

  • 2 bedeuted, dass das Image in die 2. Partition geschrieben wird.
  • /media/USB/hd51 gibt den Ordner an, in dem sich das Image befindet.


➜  ~ flash 2 /media/USB/hd51

Das dauert jetzt einen Moment:

Writing image into partition 2

Writing kernel into /dev/mmcblk0p4
4.55MiB 0:00:00 [11.9MiB/s] [================================>] 100%

Writing rootfs into /dev/mmcblk0p5
800MiB 0:01:28 [9.08MiB/s] [================================>] 100%

Flash successful

Dieser Vorgang dauert etwas. Nachdem dieser Vorgang erfolgreich abgeschlossen wurde, bootet die Box automatisch neu. Sollte vor dem Flashen bereits ein USB-Stick (hinten USB2-Port) oder eine Festplatte verbaut oder angeschlossen gewesen sein, sollten auch die alten Einstellungen wieder vorhanden sein.

Arbeitsbereich einrichten

Devtool hat nun quasi ein modifiziertes Duplikat des Buildsystems erstellt. Wie oben schon bemerkt wurde, ist das "normale" Yocto-Buildsystem, mehr für den Bedarf von Distributoren vorgesehen. Man kann damit zwar auch entwicklen, aber die Arbeit am Quellcode dürfte im Vergleich zu gewohnten Buildsystemen teilweise recht träge verlaufen.

Mit dem SDK werden flexiblere Möglichkeiten angeboten. Es können z.B. erzeugte Pakete sofort auf die Zielhardware geladen und getestet werden. Weiterhin wird nicht immer generell ein Paket bei jedem angestoßenem Buildvorgang komplett neu gebaut, sondern mit bestimmten Kommandos nur das, was notwendig ist. Auch bei Abbrüchen wird immer dort fortgesetzt, wo dieser Abbruch statt fand. Das ist wesentlich handlicher und entspricht etwa dem Ablauf, den man von bisherigen Buildsystemen oder beim Ausführen von Make her kennt.

Eine Echtzeitverfolgung der Makevorgänge wird standardmäßig zwar nicht angezeigt, aber dafür werden bei Build-Abbrüchen standesgemäß sofort entsprechende Ausgaben angezeigt, die mögliche Fehler sofort erkennen lassen. Ein dauerhaftes und ausführliches Logging mit Anzeige wo diese Logs im Falle von Build-Fehlern zu finden sind, ermöglicht zudem eine genaue Durchsicht aller gemachten Vorgänge und zwar getrennt nach Konfigurierung, Kompilierung, Paketierung usw.

Die Imageerstellung erfolgt konform zum normalem Bauen mit Bitbake. Änderungen an Quellcodes werden normalerweise direkt übernommen. Der dafür notwendige Befehl

devtool build-image

wurde ja schon erwähnt.

Das Erzeugen von neuen Receipes, wird durch Nutzung durch Templates, welche man mit Devtool erzeugen kann, vereinfacht. Auch die Layer befinden sich in der neu erstellten Struktur und können dort gewartet werden. Diese befinden sich allerdings quasi in reinem Quellzustand, also ohne Anbindung an eine Versionsverwaltung. Dies kann man aber selbst nachholen, indem man die betreffenden Layer nur durch die GIT-Repositories ersetzt. Man klont nur einfach die Git-Repositories an deren Stelle.

├── hd51
│   ├── bitbake-cookerdaemon.log
│   ├── buildtools
...

│   ├── cache
...
│   ├── conf
...
│   ├── downloads
...
│   ├── environment-setup-cortexa15hf-neon-vfpv4-oe-linux-gnueabi
│   ├── layers
│   ├── site-config-cortexa15hf-neon-vfpv4-oe-linux-gnueabi
│   ├── sstate-cache
...
│   └── 'workspace'
│       ├── appends
│       ├── conf
│       ├── README
│       └── 'sources'
└── oecore-x86_64-cortexa15hf-neon-vfpv4-toolchain-ext-nodistro.0.sh
...

Quelldaten importieren

Wie man sieht, gibt es nun ein "workspace"-Verzeichnis, welches einen Unterordner namens "sources" beinhaltet. Darin befinden sich normalerweise die Quelldaten der Applikationen an denen gearbeitet wird. Dieser Bereich ist noch leer und muss noch befüllt werden. Wenn man z.B. an Neutrino arbeiten möchte, folgendes eingeben:

$ devtool modify neutrino-mp-ax51
$ devtool modify libstb-hal

Devtool wird den zugehörigen Quellcode, der in der Regel als GIT-Repository vorliegt, in den Workspace-Ordner "umsiedeln".

Den Status des Arbeitsbereiches, also welche Applikationen derzeit in Verwendung sind, kann man so abfragen:

$ devtool status  

Entwickeln

Quelldaten ändern

In den jeweiligen Git-Repos, kann man jetzt seine Änderungen am Quellcode wie gewohnt vornehmen und neu kompileren.

...
│   └── workspace
...
│       └── sources
│           └── 'neutrino-mp-ax51'
...

Neutrino kompilieren

$ devtool build neutrino-mp-ax51

Wie dieser Befehl schon vom Namen her sagt, wird damit Neutrino einschließlich aller Abhängigkeiten gebaut bzw. die dazugehörigen Pakete erzeugt. Das Ergebnis muss aber erst noch zum Testen auf die Zielhardware geladen werden.

Neutrino auf Ziel-Hardware laden

$ devtool deploy-target -s neutrino-mp-ax51 root@<BOX-IP>

oder auch kombiniert:

$ devtool build neutrino-mp-ax51 && devtool deploy-target -s neutrino-mp-ax51 root@<BOX-IP> 

Alle benötigten Daten, welche in entsprechenden Paketen enthalten sind, werden damit via SSH auf die Zielhardware geladen. Die Option -s bewirkt, dass man verfolgen kann, welche Daten gerade hochgeladen werden. Anschließend kann man direkt auf der Hardware testen.

Stop hand.png HINWEIS:

Für Binaries sei noch zu beachten, dass diese standardmäßig ungestrippt hochgeladen werden. Das bedeutet, das man unter Umständen längere Ladezeiten in Kauf nehmen muss und genügend Speicherplatz auf der Zielhardware einplanen sollte. Vorausgesetzt, man benötigt keine ungestrippten Daten, hilft die Option -S, um nur gestrippt Binaries hochzuladen:

$ devtool deploy-target -s -S neutrino-mp-ax51 root@<BOX-IP>

Die Option -S gibt es aber unglücklicherweise erst in neueren Yocto-Versionen. Derzeit werden für die CST- und Fulan-Geräte (Spark etc.) aber eben keine aktuellen Versionen (z.Z. nur krogoth) verwendet und eine Portierung ist auch nicht in Aussicht, da die neueren Versionen unter anderem keinen Support mehr für die veralteten Kernel und uclibc-Support leisten. Zudem stellen die closed-Source Treiber ein Problem dar, die mit den neuen Yocto-Images nicht kompatibel sein dürften.

Für Geräte wie die AX51 sind die Ladezeiten allerdings zu vernachlässigen und Speicher ist normalerweise auch großzügig vorhanden. Bei CST Hardware sollte man daher wegen des knappen Speichers nur mit einem möglichst schnellem USB-Stick arbeiten und nicht den Flash nutzen. Bei den CST-HD2 Serien ist die Ladezeit zwar noch moderat, aber wegen unterschiedlicher Flashbestückung der einzelenen HD2 Modelle, sollte man auch hier genau auf die Speichergrößen achten!


Stop hand.png TIP: devtool deploy-target nutzt Zugriff via SSH auf die Box und es wäre daher recht unpraktisch, immer wieder nach einem Passwort gefragt zu werden. Um dies abzustellen kann man sich auf der Zielhardware via SSH einloggen und das Passwort entfernen:

 ~$ passwd -d root

Neutrino von Ziel-Hardware entfernen

$ devtool undeploy-target neutrino-mp-ax51 root@<BOX-IP>

Dies entfernt die devtool-Modifikationen auf der Zielhardware und stellt den ursprünglichen Zustand auf der Zielhardware wieder her.

Aktuelles Image erzeugen

$ devtool build-image

An einem beliebigem Paket entwickeln

Man kann quasi jedes Paket aus dem Buildsystem separat bearbeiten, debuggen und selbst daran entwickeln. Wie weiter oben schon wie für Neutrino angedeutet wurde, wird dafür der gewünschte Quellcode des jeweiligen Recipes mittels modify in den eigenen Arbeitsbereich unter ../workspace/sources umgesiedelt.

$ devtool modify [Recipe]

Dies ist allerdings auch notwendig, um gezielt nur ein bestimmtes Recipe bauen zu wollen. Das Recipe selbst wird dabei nicht in den Workspace übertragen, sondern nur der Quellcode. Sollten Abhängigkeiten bestehen, werden diese aus den dafür bereits vorgesehenen Recipes weiterhin eingebunden. Es sei denn, es sind auch dort Anpassungen notwendig oder gewollt, dann muss man diese natürlich ebenso in den Arbeitsbereich holen.

Um ein Solches Recipe wieder aus dem Arbeitsbereich abzukoppeln, wird reset verwendet.

$ devtool reset [Recipe]

Dabei wird das übertragene Recipe allerdings nicht gelöscht, was unter Umständen fatal wäre, sondern es wird im Buildsystem nur ein Verweis entfernt, der auf das Recipe im Workspace verweist. Man kann also bei Bedarf wieder darauf zurückgreifen. Außerdem werden die gemachten Änderungen nicht zurückgeführt. Diese bleiben im Workspace.

Um Änderungen zu übertragen wird update-recipe verwendet.

Auf der Ziel-Hardware debuggen

Um direkt auf der Zielhardware debuggen zu können, gibt es natürlich den GDB. Falls GDB sich noch nicht auf der Zielhardware befindet, kann man GDB über die Paketverwaltung (opkg) auf der Zielhardware installieren, oder man holt sich GDB in den Workspace, baut es separat und überträgt es auf die Zielhardware:

$ devtool build gdb && devtool deploy-target gdb root@<BOX-IP>

Danach kann man GDB direkt auf der Zielhardware nutzen.

Zu beachten wäre noch, dass unter Umständen bestimmte Abhängikeiten, die evtl. parallel über die Layer-Repos angepasst wurden oder neu dazu gekommen sind, falls es notwendig ist in den Workspace geladen werden sollten. Natürlich müssen diese, falls es erforderlich ist, auch auf die Zielhardware geladen werden. Die Notwendigkeit dafür ergibt sich normalerweise immer dann, wenn bestimmte Libs fehlen oder sich geändert haben und dadurch beim Kompilieren Buildfehler auftreten oder Fehlfunktionen während der Ausführung auf der Zielhardware passieren. Alternativ wäre auch eine entprechende Anpassung der Paketverwaltung auf der Zielhardware möglich, die auf die Pakete der Entwicklungsumgebung Zugriff hat und damit aktuell gehalten werden kann.


Pakete erzeugen

$ devtool package [Paketname]

Devtool hat noch weitere Möglickeiten auf Lager. Eine Übersicht gibt

$ devtool -h

bzw. für die Unterkommandos

$ devtool <Unterkommando> -h


Die Vorgehensweise, um neue oder bestehende Receipes oder Layer zu erstellen oder zu warten, ist teilweise ähnlich. Weitere Informationen dazu findet man in der Devtool-Dokumentation.

SDK aktuell halten

Diese Funktion ist derzeit noch nicht verfügbar.

Weblinks