Lazarus & Freepascal auf dem Raspberry Pi

Vorstellung

Wer nach einem Werkzeug zur Softwareentwicklung in Pascal sucht, wird unweigerlich auf das Lazarus-Projekt stoßen. Das Team beschäftigt sich mit der Programmierung einer Entwicklungsumgebung, die vom Codeeditor bis zum Debugger alles unter einer übersichtlichen Oberfläche vereint. Im Gespann mit dem Free-Pascal-Compiler (FPC) ergibt dies ein leistungsstarkes Tool zur objektorientierten Programmierung in Pascal. Als freies Pendant zum weitaus bekannteren, aber kommerziellen Delphi ermöglicht Lazarus jedem Anwender die kostenfreie Nutzung. Delphi wäre für Raspian ohnehin keine Alternative, da es schon seit längerem keine Linux-Unterstützung mehr bietet.

Lazarus spielt seine Stärken bei der Programmierung grafischer Oberflächen aus. Im Paket ist eine umfangreiche Klassenbibliothek, die Lazarus Component Library (LCL), zur visuellen Konstruktion enthalten. Darin finden sich quasi alle Standardkomponenten, die von grafischen Programmoberflächen her bekannt sind und vieles mehr. Entsprechen mal die Komponenten nicht den eigenen Vorstellungen, baut man dank Vererbung eigene Klassen.

Auch wenn Pascal als Programmiersprache vielleicht nicht der letzte Schrei ist, so ist die Entwicklergemeinde doch sehr umfangreich. Für die meisten Probleme ist bei Google eine Antwort zu finden. Und wird man nicht beim Stichwort Lazarus fündig, wurde das Problem vielleicht unter Delphi schon gelöst. Hier ist die nahe Verwandtschaft von Vorteil, da Sprache und Klassen einander sehr ähneln.

Ein Ziel des Lazarus-Projektes ist die plattformübergreifende Softwareentwicklung. Motto ist: „Write once, compile anywere“. Einmal geschriebener Quelltext kann unter verschiedenen Betriebssystemen (Linux, Mac-OS oder Windows) und für unterschiedliche Prozessorarchitekturen übersetzt werden. Bei Verzicht auf plattformabhängige Schnittstellen ist es möglich, aus dem selben Quelltext lauffähigen Maschinencode für Linux, Windows und vermutlich sogar für Ei-Dinger zu erzeugen.

Der FPC wurde unter anderem auch auf die ARM-Architektur portiert. Da sowohl der Compiler selbst als auch die Lazarus IDE samt Klassenbibliotheken in Pascal geschrieben sind, kann das gesamte System für den Raspberry Pi übersetzt und hier als autonomes Entwicklungssystem betrieben werden. Es soll allerdings nicht verschwiegen werden, dass die Ressourcen des Pi den Arbeitsfluss deutlich bremsen. Ein RPi2 muss es schon sein. Dem Ur-Pi sollte man die Lazarus-IDE nicht zumuten.

Aber auch hier kommt die Multiplattformfähigkeit zu Hilfe. Schreibt und debuggt man das Programm soweit wie möglich auf einem PC, günstigenfalls mit Debian-ähnlichem OS und zieht mit dem Quelltext auf den Pi um, wenn es an die Entwicklung der Hardwareschnittstellen geht, lässt sich viel Zeit sparen. Während die Bedienung der Lazarus-Oberfläche noch flüssig läuft, fordert ein Compilerlauf schon Geduld. Im Ergebnis wird man aber mit flottem Maschinencode belohnt.

Für die Ansteuerung der Pi-Hardwareschnittstellen gibt es verschiedene Lösungen. Ohne Anspruch an Geschwindigkeit kann auf das Shell-Interface aufgesetzt werden. Soll es schneller vorangehen, bietet sich das WiringPi-Projekt an. Die in C entwickelten Bibliotheken lassen sich ohne großen Aufwand unter Pascal in den eigenen Code einbinden.


Installation

Grundsätzlich ist der FPC und die Lazarus-IDE im Raspian-Repository vertreten. Die Aktualität lässt aber i.A. zu wünschen übrig. Auskunft erhält man auf der Kommandozeile des RPi:

apt-cache show lazarus

Neben der Installation über die Paketquellen bieten sich zwei andere Wege an.




Komplett-Installation per Script

Einen schnellen Weg zum Ziel bieten die Installationsscripts von getlazarus.org Das Team stellt dort einige Installationsscripts für verschiedene Plattformen bereit, unter anderem auch für den Raspberry Pi. Die Installation bis zum fertigen Ergebnis lässt sich damit in wenigen Arbeitsschritten erledigen.

Ausgehend von einem frisch installierten und konfigurierten Raspian „Stretch“ mit graphischer Oberfläche müssen zuerst einige Abhängigkeiten installiert werden.

sudo apt-get install libgtk2.0-dev libcairo2-dev libpango1.0-dev libgdk-pixbuf2.0-dev libatk1.0-dev libghc-x11-dev

Anschließend holt man sich das Setup-Script, macht es lauffähig und startet es als user pi.
Troubleshooting lesen !!!
Die Rückfragen können bestätigt werden. Das Script lädt die benötigten Dateien aus dem Internet und startet die Installation. Nach wenigen Minuten steht eine fertig eingerichtete Entwicklungsumgebung bereit.

cd ~/Downloads
wget http://www.getlazarus.org/download/?platform=raspberry -O setup.sh
chmod +x setup.sh
./setup.sh

Etwas ungewöhnlich ist vielleicht die Installation im Home-Verzeichnis des users pi /home/pi/Development/FreePascal, aber warum nicht. Auf dem Raspberry wird es nur einen aktiven User geben, der die IDE benutzt.

Fertig !


Gestartet wird das Ganze über:

Menü → Entwicklung → Lazarus



Selbst gebaut

Aktualität gewährleistet auf jeden Fall der direkte Bezug von den Homepages der Entwicklergemeinden. Hier ist zwar etwas Handarbeit gefordert, aber der Weg ist auch relativ simpel und lässt sich auf jede Plattform anwenden. Folgende Schritte sind erforderlich:

  • FP-Compiler downloaden und installieren
  • Lazarus-Quellen downloaden
  • Lazarus-IDE bauen (optional)

Beispiel:  FreePascal Version: 3.0.4 /  Lazarus Version: 2.0.4

Free-Pascal-Compiler installieren

Der Compiler selbst benötigt keine graphische Oberfläche. Eine Voll-Installation von Raspbian ist nur erforderlich, wenn auch die Lazarus-IDE installiert werden soll. Sämtliche Abhängigkeiten werden mit der Basisinstallation geliefert, sodass keine weiteren Vorbereitungen erforderlich sind. Auf der Downloadseite clickt man sich über die Auswahlmöglichkeiten bis zum passenden Archiv. Verfügbar ist eine Version für den ARMv6, die sich auf allen RPi-Versionen installieren lässt.
Link-Adresse kopieren:
-> ARM	-> Linux -> Hungary -> fpc-3.0.4.arm-linux-eabihf-raspberry.tar

Ausgangspunkt ist ein beliebiges Verzeichnis
mkdir ~/FreePascal

Die weiteren Schritte: downloaden, entpacken, installieren. Fragen mit den Vorgaben beantworten.
cd ~/FreePascal
wget ftp://ftp.hu.freepascal.org/pub/fpc/dist/3.0.4/arm-linux/fpc-3.0.4.arm-linux-eabihf-raspberry.tar
tar -xf fpc*
rm *.tar
cd fpc-*
sudo ./install.sh
Informationen zum installierten FPC sollten jetzt abrufbar sein:
fpc -i
Der Compiler verfügt über eine Terminal-IDE im Textmodus. Hier kommt richtiges 80er-Jahre-Feeling auf.
fp

Lazarus-Quellen downloaden

Unabhängig, ob die Lazarus-IDE installiert wird, sollten noch die Lazarus-Quellen geholt werden. Darin enthalten sind einige Bibliotheken, die auch für die Erstellung von Kommandozeilenprogrammen oft unverzichtbar sind. Das aktuelle Zip-Paket suchen und die Link-Adresse kopieren:
-> Sources -> Lazarus Zip-GZip -> Lazarus 2.0.4 -> Lazarus-2.0.4.zip

cd ~/FreePascal
wget https://sourceforge.net/projects/lazarus/files/Lazarus%20Zip%20_%20GZip/Lazarus%202.0.4/lazarus-2.0.4.zip/download -O lazarus.zip
unzip lazarus.zip
rm lazarus.zip
Die einzubindenden Bibliotheken sind zu finden unter: ./lazarus/components/lazutils

An dieser Stelle verfügt man über einen lauffähigen Compiler. Quellcode, der am PC geschrieben und vorgetestet wurde, lässt sich damit übersetzen.


Lazarus bauen (optional)

Die IDE lässt sich grundsätzlich auf jedem RPi bauen und benutzen. Das funktioniert selbst auf einem RPi Zero. Spaß macht das aber nicht. Ein RPi3 sollte es schon sein.
Lazarus erfordert ein Raspbian mit graphischer Oberfläche und die Installation einiger Abhängigkeiten:
sudo apt install libgtk2.0-dev libcairo2-dev libpango1.0-dev libgdk-pixbuf2.0-dev libatk1.0-dev libghc-x11-dev

Die Quellen wurden schon im Schritt 2 installiert. In das Lazarus-Verzeichnis wechseln und bauen.
cd ~/FreePascal/lazarus
make clean all
Dauer ca. 10min !!! Der make-Prozes geizt nicht mit Hinweisen und Warnungen. Aus der Ruhe bringen sollte man sich allerdings nur von Fehlermeldungen.

Lazarus benötigt noch die FPC-Sources, die in ein beliebiges Verzeichnis geladen und entpackt werden, bspw:

cd ~/FreePascal
wget https://sourceforge.net/projects/freepascal/files/Source/3.0.4/fpc-3.0.4.source.zip/download -O fpc-3.0.4.source.zip
unzip fpc*.zip
rm fpc*.zip

Beim ersten Start prüft Lazarus, ob die FPC-Quellen auffindbar sind.
/home/$USER/FreePascal/lazarus/startlazarus
Der Bequemlichkeit halber kann man noch einen Menu-Eintrag hinzufügen.




Finetuning

Die Lazarus-IDE startet mit vagabundierenden Fenstern. Um hier Ordnung zu schaffen:
Lazarus-IDE -> Package -> Package-Datei(.lpk) öffnen
~/Freepascal/lazarus/components/anchordocking/design/anchordockingdsgn.lpk
-> Verwenden -> Installieren




Troubleshooting


Laden der Installationsdateien im Setup-Script

Probleme kann der Download der Installationsdateien bereiten. Das Setup-Script nutzt dazu vorrangig das Kommandozeilentool curl. Sollte der Dowloadlink weitergeleitet werden, empfängt curl den Status 302 und bricht ab. In diesem Fall ist im Script der Parameter -L zu ergänzen.
nano setup.sh

[...]
# function download(url, output)
function download() {
	if type "curl" > /dev/null; then
		curl -L -o "$1" "$2"
	elif type "wget" > /dev/null; then
		wget -O "$1" "$2"
	fi	
}
[...]





Warnmeldung des Compilers

Der Compiler generiert zwei hartnäckige Fehlermeldungen:

Warning: (9034) "crtbegin.o" not found, this will probably cause a linking failure
Warning: (9034) "crtend.o" not found, this will probably cause a linking failure

Bibliotheken suchen

sudo find / -name crtbegin.o
Ausgabe bspw
/usr/lib/gcc/arm-linux-gnueabihf/6/crtbegin.o

Den gefundenen Pfad zu den Bibliotheken hinzufügen:

IDE → Projekt → Projekteinstellungen → Pfade → Bibliotheken(Fl):

/usr/lib/gcc/arm-linux-gnueabihf/6




Dateigröße der Anwendung

Um die Größe der resultierenden Dateien zu verringern, bieten sich einige Optionen an. Bereits in der Entwicklungsphase sollten per Smart Linking nur die Programmteile eingebunden werden, die tatsächlich benötigt werden. Hierzu sind die Compiler-Optionen -XX und -CX zu setzen. Entsprechende Felder gibt es in den Projekteinstellungen (Kompilieren und Linken) von Lazarus.
Grundsätzlich ist darauf zu achten, dass keine überflüssigen Units eingebunden werden.

Debug-Informationen sollten aus den fertigen Releases entfernt werden. Diese können entweder über die Compilereinstellungen erst gar nicht erzeugt oder auf der Kommandozeile nachträglich entfernt werden.

strip --strip-all Anwendung




Fehlende Sonderzeichen im IDE-Editor

Anders als andere Editoren wertet der Lazarus-IDE-Editor das Key-Release-Event aus. In Verbindung mit einer VNC-Fernsteuerung kann es zu fehlerhaften Übertragungen kommen, wenn ein falsches Tastatur-Layout im RPi eingestellt ist.

Abhilfe: Tastaturlayout über die graphische Oberfläche einstellen

Menü→ Einstellungen→ Tastatur und Maus→ Tastatur→ Keyboard Layout→ Deutschland/Deutsch
Die Änderung des Layouts über das Kommandozeilentool raspi-config funktioniert nicht.
Sollten die Einstellungen schon richtig sein und die Eingabe von Sonderzeichen trotzdem nicht funktionieren:
Einstellungen ändern -> speichern -> wieder zurück und speichern

Das allerding nach jedem Systemstart. Auch nicht befriedigend !




Doppelte Zeichen bei Eingaben in Editorfenstern

Zeicheneingaben erscheinen in manchen Konstellationen im Quelltexteditor oder in den Anwendungen doppelt. Im aktuellen Fall: Linux Mint 18.2 / 18.3 / Lazarus 1.8.0. Das Problem hängt mit der Eingabemethode für Sprachunterstützung im GTK_IM_MODULE zusammen. Lösung: Entweder über
Systemeinstellungen -> Sprachen -> Eingabemethode => "keine"
global abschalten oder die Variable vor dem Start von Lazarus oder der Anwendung explizit setzen.
export GTK_IM_MODULE=""
startlazarus
nach oben