Zusammen mit dem Internet Tablet 770 veröffentlichte Nokia Mitte 2005 eine komplette Open-Source-Entwicklungsumgebung, die Maemo Development Platform. Wie Sie Maemo richtig einsetzen und welche Vorteile sie gegenüber herkömmlichen Crosscompilern bietet, erklärt dieser Artikel.
Die Überraschung auf der Linux World Expo & Conference Ende Mai 2005 in New York war groß, als ausgerechnet der Mobilfunk-Riese Nokia ein Handheld-Gerät vorstellte, das kein Telefon oder Smartphone ist und noch dazu ein Embedded-Linux als Betriebssystem einsetzt. Zeitgleich veröffentlichte Nokia die freie Entwicklungsumgebung Maemo Development Platform. Maemo [1] ist eine universelle Entwicklungsumgebung für Embedded-Systeme aller Art, nicht nur für das seit November käufliche Nokia 770 Internet Tablet.
Die Anwendungs-Entwicklung unterscheidet sich auf der Maemo-Plattform kaum von der Programmierung herkömmlicher Desktop-Applikationen, da die grafische Oberfläche auf X11 und GTK+ 2.6 basiert. So genannte Hildon-Funktionen aus den Bibliotheken »hildon-libs« und die »libosso« vereinfachen die Bedienung von Handhelds wie dem Nokia 770. Die Interaktion zwischen Applikation und Desktop ist sehr an Gnome angelehnt, einige Funktionen verwenden zum Beispiel intensiv »gconv« und »dbus«, Windowmanager ist die aus GPE [2] bekannte Matchbox [3].
Grundstein der Maemo-Entwicklungsumgebung ist Scratchbox [4], mit der Sie mehrere Entwicklungssysteme für unterschiedliche Prozessor-Plattformen verwalten. Die passenden Scratchbox-Toolchains, die die richtigen Binärdateien für die jeweilige Prozessor-Plattform erzeugen, bekommen Sie ebenfalls auf der Scratchbox-Homepage.
Prozessor-Transparenz
Die GNU Compiler Toolchain unterstützt es schon seit vielen Jahren, Programme für eine andere Prozessorarchitektur als die des Hostsystems zu übersetzen. Diese Methode stößt aber schnell an Grenzen, wenn Werkzeuge wie die GNU Autotools zum Einsatz kommen – sie erzeugen meist Testprogramme für die Zielplattform und führen sie aus, etwa um bestimmte Prozessorfunktionen zu prüfen. Die GNU Compiler Toolchain erzeugt zwar die Testprogramme für die Zielplattform problemlos, sie funktionieren jedoch nicht auf der inkompatiblen CPU des Hostsystems – der Build-Prozess bricht hier ab.
Die Scratchbox bietet für diese Fälle die Funktion der CPU-Transparenz: Wann immer innerhalb der Scratchbox Code der Zielplattform ausgeführt werden soll, leitet Scratchbox den Code an eine Instanz weiter, die ihn auch ausführen kann – zum Beispiel an den Software-Emulator Q-Emu oder an »sbrsh«, das den Code über eine SSH-Variante direkt auf dem Zielgerät laufen lässt, in diesem Fall dem Nokia 770. Alle x86-Binaries hingegen benutzen weiterhin die CPU des Entwicklungsrechners.
Die Maemo-SDKs [5] enthalten alle für die Entwicklung auf der jeweiligen Plattform notwendigen Programme und Bibliotheken in genau der Version, die Sie für die Programmierung benötigen. Es handelt sich um virtuelle Linux-Systeme, Rootstraps genannt, die von den Bibliotheken des Wirtsystems vollkommen unabhängig sind. Mit dem virtuellen X-Server Xephyr können Sie sogar eine grafische Oberfläche benutzen, die vom Wirtsystem unabhängig ist.
Scratchbox vorbereiten
Die komplette Maemo-Entwicklungsumgebung besteht aus etlichen sehr großen Paketen. Da das Maemo-System selbst auf Debian aufbaut, ist die Installation auf einem herkömmlichen Debian-System oder einer Debian-basierten Distribution wie Ubuntu am leichtesten und zudem am besten getestet.
Zuerst installieren Sie Scratchbox [4], Maemo unterstützt zurzeit jedoch nur die Version 0.9.8.5. Insgesamt ist das ein halbes Dutzend Pakete mit ungefähr 200 MByte Umfang: »scratchbox-core«, »scratchbox-devkit-debian« für die Erstellung von Debian-Paketen, »scratchbox-doctools«, »scratchbox-libs«, die Toolchain für den Arm-Prozessor »scratchbox-toolchain-arm-glibc« und die Toolchain für den x86-Prozessor Ihres Wirtsystems, also die »scratchbox-toolchain-i686-glibc«.
Während der Einrichtung fragt Scratchbox die Benutzer ab, die später mit dem System arbeiten sollen, und legt für sie neue Homeverzeichnisse unterhalb des Scratchbox-Verzeichnisses »/scratchbox« an. Diese Benutzer werden automatisch Mitglieder der neuen Benutzergruppe »sbox«, die Scratchbox ebenfalls während der Installation hinzufügt. Wichtig ist, dass Sie vor dem ersten Start von Scratchbox auch effektiv Mitglied dieser Gruppe sind, sich also eventuell noch einmal aus- und wieder einloggen.
Maemo Rootstraps
Die Maemo-SDK-Pakete von [5] umfassen noch einmal 125 MByte für i386 und 117 MByte für die Arm-Plattform und müssen nach der Scratchbox-Einrichtung unter »/scratchbox/packages« gespeichert sein. Die aktuelle stabile Version ist Release 1.0, für Experimentierfreudige gibt es noch den Release Candidate 5 der Version 1.1. Der Speicherort für die Maemo-Pakete ist wichtig, weil jeder Scratchbox-Entwickler seine eigene Maemo Development Platform in seinem Scratchbox-Homeverzeichnis unterhalb von »/scratchbox/users« installiert, sodass mehrere Entwickler unabhängig voneinander arbeiten können.
Für die Maemo-Einrichtung ruft der jeweilige Benutzer den Befehl »scratchbox« auf. Innerhalb der Scratchbox sollten Sie zwei Umgebungsvariablen definieren:
export LANGUAGE=en_GB export PAGER=less
Am besten schreiben Sie die beiden Zeilen in die Datei ».bash_profile«, damit die Variablen bei jedem Neustart der Scratchbox wieder gesetzt werden.
Zwei Maemo-Targets
Scratchbox kann Programme für verschiedene Zielplattformen übersetzen, für jede gibt es ein eigenes so genanntes Target, das sind virtuelle Linux-Systeme. Für die Maemo-Entwicklung benötigen Sie ein Target für den Prozessor Ihres PC und eins für den Arm-Prozessor des Nokia 770 – die Toolchains haben Sie bereits zusammen mit der Scratchbox installiert. Zunächst legen Sie in der Scratchbox ein Target für Ihren PC an:
sbox-config -ct SDK_PC
Der Name des Target muss nicht wie hier im Beispiel »SDK_PC« lauten, er sollte lediglich keine Leer- und Sonderzeichen enthalten. Das Konfigurationsprogramm fragt die zu benutzende Scratchbox-Toolchain ab, für die Zielplattform PC ist dies »i686«. Bei der Frage nach der CPU-Transparenz wählen Sie »none«, da der von dieser Toolchain erzeugte Code ohne Emulation auf dem Prozessor Ihres Hostsystems läuft und keine Emulation benötigt. Als Development Kit, das der Paketerzeugung dient, wählen Sie Debian aus.
Ist die Konfiguration abgeschlossen, wählen Sie das PC-Target mit dem Befehl »sbox-config -st SDK_PC« als Standard-Target aus und aktivieren es. Zu diesem Zeitpunkt ist die Scratchbox vergleichbar mit einem virtuellen PC, auf dem Sie noch das Betriebssystem installieren müssen – Rootstrap genannt.
Bei dem Maemo-Paket für die i386-Plattform von [5] handelt es sich genau um ein solches Rootstrap-Paket, das jeder Scratchbox-Benutzer einzeln mit folgendem Befehl einrichtet:
sbox-config -er /scratchbox/packages/Maemo_Dev_Platform_RS_v1.0_i386.tgz
Abschließend initialisieren Sie noch den Compiler und die Fakeroot-Umgebung mit den Befehlen »sbox-config -cc« und »sbox-config -cf«. Nun sind Sie in der Lage, in der Scratchbox Programme für die Zielplattform i686 zu entwickeln, unter Verwendung aller Bibliotheken und Einschränkungen, die das Maemo-SDK mitbringt.
Die Einrichtung des Arm-Target unterscheidet sich kaum von jener der x86-Umgebung:
sbox-config -ct SDK_ARM sbox-config -st SDK_ARM sbox-config -er /scratchbox/packages/Maemo_Dev_Platform_RS_v1.1rc5_arm.tgz sbox-config -cc sbox-config -cf
Für das Arm-Target wählen Sie aus der Liste den Arm-Compiler und als CPU-Transparenz-Modus »qemu-arm« – damit führt Q-Emu Arm-Binärprogramme aus, während x86-Binaries nativ auf der CPU des Entwicklungsrechners laufen. Mit den Befehlen »sbox-config -st SDK_PC« und »sbox-config -st SDK_ARM« schalten Sie bei laufender Scratchbox zwischen den beiden Targets um.
Für den Test der selbst übersetzten Programme benötigen Sie noch einen separaten X-Server, der eine vereinfachte grafische Hildon-Oberfläche des Nokia 770 enthält. Am besten eignet sich hierfür Xephyr von [6], der im Gegensatz zu Xnest einen virtuellen X-Server mit anderen Farbtiefen und Erweiterungen als der X-Server des Hostsystems emulieren kann. Im Release Candidate 5 der Maemo Development Platform 1.1 ist Xephyr bereits enthalten.
Für den Aufruf von Xephyr verwenden Sie am besten das Skript aus Listing 1, es startet Xephyr mit der Auflösung und Farbtiefe des Nokia 770. Läuft Xephyr, müssen Sie die grafische Oberfläche (Abbildung 1) noch von Hand starten:
export DISPLAY=:2 af-sb-init.sh start

Abbildung 1: Zum Erproben eigener Programme eignet sich der virtuelle X-Server Xephyr besonders gut, da er eine andere Farbtiefe darstellen kann als der X-Server des Hostsystems. Die Abbildung zeigt den Hildon-Desktop des Nokia 770.
|
Listing 1: |
|---|
01 #!/bin/sh -e
02 prefix=/scratchbox/users/${LOGNAME}/targets/SDK_PC/usr
03 export LD_LIBRARY_PATH=${prefix}/lib; export LD_LIBRARY_PATH
04 exec ${prefix}/bin/Xephyr :2 -host-cursor -screen 800x480x16 -dpi 96 -ac
|
Als Beispiel für die Programmentwicklung dient der Notizblock »maemopad«. Dazu laden Sie die Quellen innerhalb der Scratchbox per »wget« von [7] herunter, nachdem Sie auf das x86-Target umgeschaltet haben. Alternativ können Sie auf dem Wirtsystem das Archiv ins Verzeichnis »/scratchbox/users/Benutzer/home/Benutzer« kopieren – das Homeverzeichnis der Scratchbox.
Wenn Sie die Quellen ausgepackt haben, rufen Sie das Skript »autogen.sh« im Quellenverzeichnis auf, das mit Hilfe der Autotools das »configure«-Skript und das Makefile anlegt. Da Sie im i686-Target arbeiten, meldet »configure« beim Aufruf:
checking build system type... i686-pc-linux-gnu checking host system type... i686-pc-linux-gnu
Wenn Sie hingegen auf das Arm-Target umschalten, meldet der gleiche »configure«-Aufruf:
checking build system type... arm-unknown-linux-gnu checking host system type... arm-unknown-linux-gnu
Die Autotools haben die virtuelle Arm-Umgebung erkannt und gehen davon aus, dass auf einem nativen Arm-System ein Arm-Binärprogramm erzeugt wird, ohne Crosscompiling. Die CPU-Transparenz von Scratchbox führt allerdings nur »configure« hinters Licht, alle x86-Binaries des Arm-Build-Systems laufen nach wie vor ohne Emulation direkt auf der Wirts-CPU. Ein abschließender Aufruf von »make« übersetzt das Programm auf dem jeweiligen Target.
Mit »file src/maemopad« überprüfen Sie im Arm-Target, dass tatsächlich ein Arm-Programm entstanden ist und kein x86-Binary. Allerdings können Sie den Notizblock nicht einfach aufrufen und ausprobieren, denn Nokia hat in die Oberfläche einige Sicherungsmechanismen eingebaut. So muss sich jede Applikation nach erfolgreichem Start bei der Oberfläche registrieren, andernfalls werden sie nach gewisser Zeit von einer Überwachungsinstanz zwangsweise beendet.
Zur vollständigen Anmeldung benötigt das Programm noch einige Dateien aus dem »data«-Verzeichnis, die Sie erst installieren müssten. Einen Ausweg bietet der Befehl »run-standalone.sh Programm«, das die Zwangsregistrierung überflüssig macht und »maemopad«, wie in Abbildung 2 zu sehen ist, im virtuellen X-Server startet.

Abbildung 2: Die Anwendung direkt auf dem Entwicklungssystem starten zu können erleichtert die Entwicklung. Bei herkömmlichen Crosscompiler-Umgebungen muss das Programm erst auf der Zielplattform installiert werden.
Paketdienst
Auch bei der Paketherstellung sorgt Scratchbox dafür, dass »dpkg-buildpackage« die dem Target entsprechende Prozessor-Plattform erkennt. So liefert »dpkg-buildpackage -rfakeroot -b« auf dem x86-Target die Datei »maemopad_1.1_i386.deb«, während der gleiche Aufruf auf dem Arm-System die Datei »maemopad_1.1_arm.deb« erzeugt.
Im Vergleich zu einem herkömmlichen Crosscompiler-System, bei dem Sie meist das Makefile und auch das »configure«-Skript von Hand anpassen müssen, ist die Maemo Development Platform in der Scratchbox eine große Erleichterung. Auch das Testen der Programme ist komfortabel: Statt die Programme ständig vom Entwicklungsrechner auf das Zielsystem zu übertragen probieren Sie mit Xephyr die Applikationen gleich auf dem virtuellen Desktop aus. Selbst der Platzbedarf von über einem halben GByte schreckt kaum – bei heutigen Festplatten mit 80 bis 200 GByte findet Maemo bestimmt noch ein Plätzchen.

Abbildung 3: Die Maemo Development Platform eignet sich nicht nur für das Nokia 770 Internet Tablet, sondern für Embedded-Linux-Systeme allgemein.
|
Infos |
|---|
|
[1] Maemo-Projekt: [http://www.maemo.org] [2] GPE-Projekt: [http://gpe-handhelds.org] [3] Matchbox Window Manager: [http://projects.o-hand.com/matchbox/] [4] Scratchbox 0.9.8: [http://www.scratchbox.org/download/scratchbox-0.9.8/] [5] Maemo Development Platform (SDK): [http://www.maemo.org/downloads/download-sdk.html] [6] Xephyr, virtueller X-Server: [http://www.freedesktop.org/Software/Xephyr] [7] Notizblock Maemopad: [http://repository.maemo.org/stable/1.0/applications/maemopad/] |





