Aus Raspberry Pi Geek 06/2015

Raspberry-Pi-Programme per Crosscompiling auf dem PC bauen (Seite 2)

Listing 4

 

tools/arm-bcm2708/arm-bcm2708-linux-gnueabi/bin/
tools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/
tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/

Am besten nehmen Sie das Verzeichnis mit den gewünschten Compilern in den Pfad auf, bei Bedarf auch alle. Je nach Linux-Distribution und eingesetzter Shell bearbeiten Sie dazu ~/.profile oder ~/.bashrc und erweitern die PATH-Variable über entsprechende export-Anweisungen. Das Beispiel aus Listing 5 beschränkt sich auf die jeweils unter /opt/ abgespeicherten Hard-Float-Compiler und den Crosscompiler für 64-Bit-Systeme.

Listing 5

 

[...]
export PATH=$PATH:/opt/tools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/
export PATH=$PATH:/opt/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/
[...]

Die Compiler und sonstigen Tools unterscheiden sich durch ein Präfix voneinander und somit auch von der Toolchain des Host-Systems: arm-linux-gnueabihf- für die Linaro-Toolchain, arm-bcm2708-linux-gnueabi- für die Soft-Float-Toolchain und arm-bcm2708hardfp-linux-gnueabi- für die Hard-Float-Toolchain. Das ist ein übliches Verfahren bei Crosscompilern; Windows-Crosscompiler nutzen beispielsweise die Nomenklatur i686-w64-mingw32-. Der erste Teil vor dem ersten Bindestrich spezifiziert die CPU, danach folgen das Betriebssystem und bei Bedarf noch genauere Spezifikationen (hardfp, softfp, mingw32 oder cygwin). Erst am Ende folgt dann der eigentliche Befehlsname (gcc, g++, gfortran, strip oder beispielsweise objdump) zum Kompilieren.

Beinhaltet die Pfadvariable der Shell den Crosscompiler, übersetzen Sie nun entsprechend Listing 6 ein kurzes C-Programm wie das übliche helloworld.c (Listing 7) auf Ihrem PC. Das Ergebnis kopieren Sie anschließend auf den Raspberry Pi und führen es dort aus. Auch hier erweist sich der Laptop beim Übersetzen um den Faktor 10 schneller als der RasPi, selbst bei einem so kleinen Programm.

Listing 6

 

$ arm-linux-gnueabihf-gcc -o helloworld helloworld.c

Listing 7

 

#include<stdio.h>
int main() {
  printf("Hello World\n");
  return 0;
}

Umfangreichere Programme

Größere Anwendungen, die Sie meist mit dem Linux-Dreisprung aus ./configure; make; make install installieren, bekommen Sie auf einem Fremdsystem kompiliert, indem Sie ./configure die Option --host=arm-linux-gnueabihf beziehungsweise arm-bcm2708-linux-gnueabi oder arm-bcm2708hardfp-linux-gnueabi mitgeben. Der Übersetzungsvorgang sucht daraufhin die entsprechenden Crosscompiler und Tools – sofern im Pfad enthalten. Das zeitaufwendige Make führen Sie dann auf einem leistungsfähigen Rechner aus, kopieren das komplette Ergebnis nach dem erfolgreich durchlaufenen Build auf einen RasPi und installieren das Programm dann nur noch über make install.

Nun benötigen größere Anwendungen in der Regel diverse Abhängigkeiten in Form von Bibliotheken oder anderen Programmen. Für das Übersetzen müssen diese auch auf dem Host-System vorhanden sein. Dazu bieten sich zwei Wege an: Entweder Sie crosskompilieren die benötigten Abhängigkeiten, oder Sie installieren auf dem RasPi die Pakete (inklusive deren Development-Versionen, zu erkennen am Präfix dev- im Paketnamen) und kopieren die Installation dann auf den Host-Rechner. Alternativ nehmen Sie gleich die Speicherkarte aus dem Raspberry Pi und mounten das komplette RasPi-System am PC. Anschließend teilen Sie dem Build-Prozess in ./configure über eine Reihe von Optionen mit, wo die diversen Compiler und Header-Dateien zu finden sind. Diese Optionen lauten in der in der Regel auf --with-Paketname=[...].

Größere Software-Projekte bieten zur Vereinfachung dafür auch häufig ein Paketname-config genanntes Shellskript. Das aktivieren Sie üblicherweise auch in den ./configure-Optionen (etwa --with-wx-config bei wxMaxima). wx-config --libs --cflags gibt dann zum Beispiel vor, wo die Bibliotheken und Header-Dateien liegen. Beim Crosskompilieren geben Sie dann das Crosscompile-Shellskript an. Das nativ vorhandene verweist auf die nicht crosskompilierten Bibliotheken, das eigene wx-config auf die eigenen Bibliotheken und Header.

Bei Programmen, die nur ein einfaches Makefile zum Bau verwenden, bietet es sich an, in diesem die Compiler und sonstigen Tools zu ändern. Häufig finden sich hier Definitionen für Variablen wie CC (C-Compiler) und CXX (C++-Compiler), die Sie lediglich für die entsprechenden Raspberry- Crosscompiler anpassen müssen. Bei auf Cmake basierenden Build-Systemen geben Toolchain-Dateien an (ein einfaches Beispiel zeigt Listing 8), welche Compiler der Build-Prozess nutzen soll und für welches Target-System gebaut wird. Der Aufruf erfolgt entsprechend Listing 9 aus dem Build-Verzeichnis heraus, indem Sie die für den Raspberry Pi angepasste Datei Toolchain-raspi.cmake als Toolchain-Datei referenzieren.

Listing 8

 

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_VERSION 1)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)
# where is the target environment
set(CMAKE_FIND_ROOT_PATH "/opt/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/")
# search for programs in the build host directories
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# search for libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

Listing 9

 

$ cmake -DCMAKE_TOOLCHAIN_FILE=Pfad/zum/Toolchain/File/Toolchain-raspi.cmake Pfad/zum/Quellcode

Neben den hier angesprochenen Build-Systemen gibt es in der freien Wildbahn zahlreiche andere Tools; in aller Regel bieten auch diese eine Crosscompile-Option. Am Ende ist es dann nicht wichtig, welches Linux-System auf dem Raspberry Pi läuft: Egal ob Ubuntu, Raspbian oder Pidora, nur die benötigten Bibliotheken und Abhängigkeiten dürfen nicht fehlen.

Eigenbau

Alternativ bauen Sie sich Ihren Crosscompiler in Eigenregie. Dies birgt den Vorteil, dass sich sämtliche Optionen optimieren lassen. So einfach fällt das Vorhaben jedoch nicht: Die Compiler besitzen häufig zahlreiche Abhängigkeiten, die Sie in der richtigen Reihenfolge bauen müssten. Zudem braucht es in der Regel diverse Hilfsprogramme wie etwa binutils oder besonders angepasste C-Bibliotheken – Letztere jetzt nicht für den Raspberry Pi, sondern für andere Embedded-Systeme, die weniger Ressourcen benötigen. Daher gibt es Werkzeuge wie Crosstool-NG [3], die Ihnen diese Arbeit abnehmen.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 8 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben