Listing 2
$ export CCPREFIX="/home/pi/src/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-"
Eine letzte Hürde kann die notwendige Version der Standard-C-Systembibliothek darstellen. Als Test rufen Sie folgenden Befehl auf:
$ ${CCPREFIX}gcc -v
Meckert er das Fehlen der Libc6 an, liegt diese in einer veralteten Version vor. Das kommt zum Beispiel unter Debian “Wheezy” vor, aktuellere Distributionen betrifft es nicht. Der Kasten “Aktuelle Libc6 nachrüsten” zeigt die notwendigen Schritte für den Umstieg auf eine neuere Version.
Aktuelle Libc6 nachrüsten
Die bei Debian “Wheezy” ausgelieferte Libc6 ist für den hier verwendeten Cross-Compiler etwas zu alt. Hier hilft die Nachinstallation aus dem “Testing”-Zweig. Dazu aktivieren Sie diesen in der /etc/apt/sources.list, indem Sie das Hash (#) vor dem entsprechenden Eintrag entfernen:
deb http://ftp.de.debian.org/debian/ testing main
Anschließend installieren Sie die aktuelle Version mit den Aufrufen aus Listing 3.
Listing 3
$ sudo apt-get update $ sudo apt-get -t testing install libc6-dev
Klein anfangen
Bevor es an den Kernel-Bau geht, prüfen Sie die Installation mit dem Klassiker Linpack-Benchmark. Im Gegensatz zum Kernel, der ohne Fließkomma-Arithmetik auskommt, spielt diese bei Linpack die zentrale Rolle. Die Kommandos aus Listing 4 laden die Quelle herunter und übersetzen das Programm für den RasPi.
Listing 4
$ mkdir -p src/linpack
$ cd src/linpack
$ wget -O linpack.c http://www.netlib.org/benchmark/linpackc.new
$ ${CCPREFIX}gcc -O3 -mfloat-abi=hard -mfpu=vfp -o linpack linpack.c
Die erzeugte Datei linpack übertragen Sie auf den RasPi und starten sie mit dem Kommando ./linpack. Das Programm fragt dann die Matrixgröße ab und gibt nach einigen Sekunden das Ergebnis aus, das im Bereich von 40 Mflops liegt. Mit diesem Test wissen Sie, dass der Cross-Compile einen korrekten Code erzeugt.
Kernfragen
Die Quellen des Kernels liegen verteilt in einem großen Verzeichnisbaum. Die Kommandos aus Listing 5 laden die etwa 740 MByte großen, für den RasPi vorbereiteten Quellen von Github herunter. Für einen deutlich aktuelleren Kernel lauten die Kommandos mit entsprechend angepassten Versionsnummern dagegen wie in Listing 6 gezeigt.
Listing 5
$ cd $HOME/src $ git clone -depth 1 git://github.com/raspberrypi/linux.git
Listing 6
$ cd $HOME/src $ mkdir -p linux-3.12.y $ cd linux-3.12.y $ git init $ git fetch git://github.com/raspberrypi/linux.git rpi-3.12.y:refs/remotes/origin/rpi-3.12.y $ git checkout rpi-3.12.y
Der Kernel-Build läuft unabhängig von der Zielplattform prinzipiell in mehreren Schritten ab. Der erste Schritt bereinigt, der nächste konfiguriert den Kernel und der letzte kompiliert ihn. Konfigurieren bedeutet in diesem Zusammenhang, festzulegen, welche Eigenschaften und Treiber Sie direkt in den Kernel einkompilieren möchten, welche Sie als dynamisch nachladbare Module erzeugen und welche Teile der Build einfach ignoriert. Raspbian verwendet naturgemäß einen generischen Kernel mit vielen Modulen – Spezialanwendungen optimieren dagegen die Größe des Kernels genau auf den Einsatzzweck.
Eine Unzahl miteinander verknüpfter Makefiles steuern den Build; dabei handelt es sich um die Bauanleitungen mit ihren Abhängigkeiten. Diese Makefiles verarbeitet das Kommando make und hangelt sich dabei von Verzeichnis zu Verzeichnis. Selbst gestandene Software-Entwickler verstehen nicht alle Details davon, aber zum Glück verstecken die Kernel-Maintainer alle Komplexitäten.
Neben Make benötigen Sie noch die sogenannte Ncurses-Bibliothek für die bequeme menügesteuerte Konfiguration des Kernels. Unter Debian beziehungsweise Ubuntu finden Sie diese Pakete als make und ncurses-dev.





