Open Source im professionellen Einsatz

Software-Entwicklung für den Sharp Zaurus und andere Linux-PDAs

Futter für kleine Saurier

,

Wer sich ein wenig mit dem Qt-Toolkit beschäftigt hat, stellt überrascht fest, wie wenig Zusatzwissen erforderlich ist, um Software für die freie PDA-Oberfläche OPIE zu schreiben. Selbst für Programmiereinsteiger bietet das Projekt ein dankbares Betätigungsfeld.

Ob der PDA von Haus aus mit Linux und der Benutzeroberfläche Qtopia ausgestattet ist oder man Open Zaurus[2] mit dem Open Palmtop Integrated Environment (OPIE[1]) installiert - in beiden Fällen sieht es zunächst so aus, als ob an Software für den Handheld kein Mangel herrschen dürfte: Schließlich benutzen viele grafische Programme für den Linux-Desktop ebenfalls die Qt-Bibliothek der Firma Trolltech. Die könnte man gegen Qt/e, die Qt-Ausgabe für Embedded Devices, linken und für den ARM-Prozessor des Zaurus-PDA crosskompilieren - fertig.

Doch so einfach ist das leider nicht: Zum einen verfügt der PDA bei weitem nicht über die Rechenpower und den Speicherplatz eines PCs oder Macs. Zum anderen lassen sich die meisten GUI-Programme für den Linux-Desktop nur dann sinnvoll bedienen, wenn man sie auf einem PC-Monitor anzeigt. Eins zu eins auf das Bildschirmchen des PDA verlegt, nerven sie den User mit Scroll-Orgien und schlimmeren Verstößen gegen den Grundsatz der Usability. So manche Anwendung ist sogar nur auf einem PDA sinnvoll und sollte deshalb direkt mit Blick auf diese Zielplattform programmiert werden.

Anwendungsentwicklung für den PDA kann also nicht einfach nur ein Abfallprodukt der Software-Entwicklung für den Desktop sein. Doch auch wenn das Ausgabegerät andere Ansprüche ans Softwaredesign stellt als ein PC oder Mac, muss man bei der Einarbeitung ins Entwicklungswerkzeug nicht alles doppelt lernen.

Arbeitsplatz einrichten

Aufgrund der begrenzten Ressourcen eines PDA findet die Programmierarbeit auf einem Desktop-Rechner (PC oder Mac) statt. Dort gilt es zunächst, sich eine passende Arbeitsumgebung zu schaffen: Damit man das PDA-Programm während des Entwicklungsprozesses testen kann, ist ein Emulator nötig. Einer mit dem Namen »qvfb« (Qt Virtual Framebuffer) liegt dem Qt/e-Paket[3] bei (Abbildung 1).

Sobald ein neu entwickeltes Programm stabil läuft und die wichtigsten Funktionen aufweist, kann man es für den PDA crosskompilieren und das dabei erzeugte Binary auf dem Handheld installieren. Dieses Vorgehen erlaubt es, die gewohnten C++-Entwicklungstools wie »gcc«, »gdb« und »valgrind« (zum Aufspüren von Speicherlecks und anderen Programmfehlern)[4] zu benutzen und die Software erst im letzten Schritt zum Testen auf den PDA zu kopieren.

Beim Verfassen des Quellcodes können natürlich Editoren wie »vi« oder »emacs« zum Einsatz kommen. Mit KDevelop 3 ([5],[6]), das vermutlich zeitgleich mit KDE 3.2 veröffentlicht wird, doch schon jetzt sehr stabil ist, steht aber eine integrierte Entwicklungsumgebung bereit, die OPIE direkt unterstützt.

Wie bei vielen anderen Projekten bekommt man auch die neueste OPIE-Version aus dem CVS (siehe Kasten "OPIE aktuell"). Sie enthält Patches für Qt/e, sodass hier noch etwas Arbeit anfällt. Wer nur mal schnell in OPIE hineinschnuppern will oder sich die Frustration einer nicht kompilierenden CVS-Version ersparen möchte, greift auf den Tarball »opie-devel-g++3_x86_0.9.1-ml2 .tar.gz« von[7] zurück.

Er enthält ein für OPIE angepasstes Qt/e sowie die OPIE-Bibliotheken, beides jedoch in nicht mehr ganz taufrischen Versionen. Ganz ohne Nacharbeit geht es aber auch hier nicht: Ist kein »distcc«[11] zur verteilten Kompilation von C/C++-Code installiert, muss man in der Datei »qt-2.3.4-beta2/configs/linux-x86-g++-shared« beim Setzen von »SYSCONF_CXX«, »SYSCONF_CC«, »SYS-CONF_LINK« und »SYSCONF_LINK_ SHLIB« jeweils das Wort »distcc« entfernen. Der Pfad zum »qt-2.3.4-beta2«-Verzeichnis gehört dann noch in die Umgebungsvariable »QTDIR« - dann startet die Übersetzung in diesem Ordner mit:

./configure -qconfig qpe -depths 8,16,24 U -qvfb -vnc -system-jpeg -system-libpng U -system-zlib -gif -no-xft
make


Mit »uic-qt2« von[7] verlinkt nach »$QTDIR/bin/uic« (wer einmal dabei ist, kann auch »qvfb-qt2« von[7] mit »$QTDIR/bin/qvfb« verknüpfen) geht es ans Erstellen der OPIE-Bibliotheken. Zunächst ist die Variable »LD_LIBRARY _PATH« auf »$QTDIR/lib« zu setzen, damit das neukompilierte Qt/e-Binary auch gefunden wird. Das weitere Vorgehen wird in der Datei »opie/README .NEWBUILD« im Einzelnen beschrieben. Da die von »opie/def-configs/opie« nach »opie/.config« kopierte Grundkonfiguration für den Anfang ausreicht, kann man den letzten, im Readme aufgeführten Schritt (»make menuconfig«) weglassen und sofort »make« starten.

Damit stehen nun zwar die Bibliotheken und die entsprechenden Werkzeuge für den PC bereit. Da der PDA jedoch keinen Intel-kompatiblen, sondern einen ARM-Prozessor enthält, darf dafür gedachte Software nicht gegen PC-Libraries gelinkt werden. Die Qt/e- und OPIE-Bibliotheken sind daher noch einmal für den PDA zu kompilieren - mit einem Crosscompiler[10]. Dazu kopiert man am besten das gesamte »qt-2.3.4-beta2«-Verzeichnis etwa nach »qt-2.3.4-beta2_pda«.

Abbildung 1: Ohne zu testendes Programm sieht »qvbf« einfach nur schwarz.

Abbildung 1: Ohne zu testendes Programm sieht »qvbf« einfach nur schwarz.

OPIE
aktuell

Wer sich ernsthaft dafür entscheidet, für OPIE zu programmieren, dürfte daran interessiert sein, sowohl OPIE als auch Qt/e in den jeweils aktuellen Versionen zu verwenden:

cvs -d:pserver:anoncvs@cvs.handhelds.org:U /cvs login


(Passwort: »anoncvs«) und

cvs -d:pserver:anoncvs@cvs.handhelds.org:U /cvs co opie
export OPIEDIR=/Pfad/zu/opie/


erstellen eine lokale Kopie des OPIE-CVS-Repository, die mit »cd $OPIEDIR; cvs up« aktualisierbar ist. »$OPIEDIR« enthält im Unterverzeichnis »/qt« eine Reihe von Patches für Qt 2.3.x, die man nach dem Entpacken des »qt-embedded-2.3.5.tar.gz«-Archivs nach dem Muster

cd qt-2.3.5; export QTDIR=`pwd`
cat $OPIEDIR/qt/qte234-for-opie091-U gfxraster.patch | patch -p0


einspielt. Ist die OPIE-spezifische Konfigurationsdatei mit

cp $OPIEDIR/qt/qconfig-qpe.h $QTDIR/src/U tools


in den Qt-Baum kopiert, lässt sich die Bibliothek (nach einem »configure«-Lauf wie im Lauftext angegeben) kompilieren.

Sobald der User Interface Compiler »uic« seinen Platz in »$QTDIR/bin« gefunden hat (siehe Fließtext), geht es ans Übersetzen der neuesten OPIE-Version:

export PATH=$PATH:$QTDIR/bin
cd $OPIEDIR
make clean
make


Vor dem »make«-Lauf gibt es die Möglichkeit, den OPIE-Umfang, die Zielplattform und anderes mit »make menuconfig« anzupassen (Abbildung 2). Das ist oft sogar notwendig, denn leider kompilieren nicht immer alle Bestandteile. Diese entfernt man mit »make menuconfig« aus dem zu übersetzenden Pool.

Kurz vor Drucklegung des Linux-Magazins reagierten die OPIE-Entwickler darauf, dass sich selbst der OPIE-Core im CVS tagelang in unkompilierbaren Zustand befand, und richteten mit Blick auf die bald zu erwartende Version 1.0 einen Branch ein, in dem sowohl Feature- als auch Stringfreeze herrscht. Zum Auschecken und Kompilieren dieser Version dienen die Befehle:

cvs -d:pserver:anoncvs@cvs.handhelds.org: /cvs co -r OPIE_BRANCH_0_99 opie
export OPIEDIR=/Pfad/zu/opie/
cd $OPIEDIR
mkdir bin libsql development
cp opie-release-1.0.config .config
make oldconfig
make


Es ist zu erwarten, dass das gegenwärtig noch erforderliche Anlegen der drei Unterverzeichnisse »bin«, »libsql« und »development« in Zukunft entfallen kann. Diese OPIE-Version lässt sich mit dem Befehl »cvs up -rOPIE_BRANCH_0_99« auf dem aktuellen Stand halten.

Qmake statt Tmake

Zum Erzeugen der Makefiles aus den Projektdateien (siehe Text) bevorzugen die OPIE-Entwickler mittlerweile das (gegenüber dem Perl-Skript »tmake«) leistungsfähigere Tool »qmake«. Da Trolltech dies erst ab der Qt-Version 3.0 mitliefert, ist es im OPIE-CVS-Baum enthalten. Wer »qmake« benutzt, setzt in Listing 1 die Variable »QMAKESPEC« statt »TMAKEPATH«:

export QMAKESPEC=$OPIEDIR/mkspecs/U linux-g++/


Die erweiterte Syntax von »qmake« erlaubt es zudem, an Listing 2 die Zeile

include ( $(OPIEDIR)/include.pro )


anzuhängen. Die hier eingebundene Projektdatei legt generelle Settings für OPIE-Projekte fest und ist erst in der CVS-Version von OPIE enthalten.

Zielplattform PDA oder PC?

Je nachdem, ob die auf dem PC auszuführende Testversion eines OPIE-Programms übersetzt oder eine Ausgabe für den PDA crosskompiliert werden soll, sind diverse Umgebungsvariablen - insbesondere »QTDIR« - anzupassen. Um dabei nicht durcheinander zu kommen, überlässt man das am besten einem Skript wie in Listing 1: Ohne Argument aufgerufen setzt es die Variablen für eine PC-Kompilation. Erhält es ein beliebiges Argument, richtet es die Umgebung für einen Crosscompiler-Lauf ein. Ganz nebenbei setzt das Skript auch die Variablen »OPIEDIR«, die das Oberverzeichnis von OPIE enthält, und »TMAKEPATH«, die auf das zum Compiler passende Konfigurationsverzeichnis des ebenfalls in »opie-devel-g++3_x86_0.9.1-ml2.tar.gz« enthaltenen Hilfsprogramms »tmake« zeigt.

Listing 1:
Kompilieren oder Crosskompilieren?

01 #!/bin/bash
02 export OPIEDIR=$HOME/opie/opie
03 if [ "x${1}x" = "xx" ]; then
04     export QTDIR=$HOME/qt-2.3.4-beta2
05     export TMAKEPATH=$HOME/tmake/1.8/lib/qws/linux-generic-g++
06 else
07     export QTDIR=$HOME/qt-2.3.4-beta2_pda
08     export TMAKEPATH=$HOME/tmake/1.8/lib/qws/linux-sharp-g++
09 fi
10 export PATH=$QTDIR/bin:$HOME/tmake/1.8/bin:$PATH
11 export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

Diesen Artikel als PDF kaufen

Als digitales Abo

Als PDF im Abo bestellen

comments powered by Disqus

Ausgabe 07/2013

Preis € 6,40

Insecurity Bulletin

Insecurity Bulletin

Im Insecurity Bulletin widmet sich Mark Vogelsberger aktuellen Sicherheitslücken sowie Hintergründen und Security-Grundlagen. mehr...

Linux-Magazin auf Facebook