Aus Raspberry Pi Geek 06/2015

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

Abbildung 1: Das Hauptmenü von »ct-ng menuconfig«.

Abbildung 1: Das Hauptmenü von »ct-ng menuconfig«.

Nach der Installation [4] rufen Sie mit ct-ng menuconfig das Konfigurationswerkzeug auf (Abbildung 1). Das textbasierte Menü erinnert erfahrene Linux-Anwender an das Kommando make menuconfig, das beim Kompilieren des Linux-Kernels dazu dient, die unterschiedlichen Kernel-Optionen zu setzen. Sie navigieren mit den Pfeiltasten im Menü, per [Eingabe] wählen Sie die gewünschte Option aus. Mit Exit beenden Sie nicht nur die Anwendung, sondern bewegen sich in den Menüs auch immer eine Ebene zurück. Zum Bauen des Crosscompilers für ARM-CPUs aktivieren Sie die folgenden Einstellungen:

  • Unter Paths and misc options schalten Sie die Option Try features marked as EXPERIMENTAL ein. Erst dann zeigt Crosstool-NG weniger gebräuchliche CPUs wie ARM-Prozessoren an.
  • Bei Bedarf passen Sie weiter unter Paths and misc options mithilfe der Option Prefix directory an, wohin Crosstool-NG die Tools installieren soll (Standard: $HOME/x-tools).
  • Aktivieren Sie Target options | Target architecture | arm.
  • Aktivieren Sie Target options | Endianness | Little Endian.
  • Aktivieren Sie Target options | Bitness | 32 Bit.
  • Aktivieren Sie Operating system | Target OS | Linux.

Neben diesen Pflichtpunkten ließen sich hier noch zahlreiche andere Optionen wählen. Wichtig wäre etwa die Möglichkeit, die Versionsnummer der zum Einsatz kommenden Bibliotheken oder die Version der Binutils sowie Compiler zu bestimmen oder unter C Compiler den Compiler zu wählen: Da GCC eben nicht für “Gnu C Compiler” steht, sondern für “Gnu Compiler Collection”, lassen sich hier Compiler für Fortran, Objective C, Ada und einige andere Programmiersprachen auswählen.

Nach Auswahl der gewünschten Optionen beenden Sie das Konfigurationstool über Exit; dabei speichert es die gewünschte Konfiguration automatisch ab. Anschließend starten Sie mit ct-ng build den Build-Prozess (Abbildung 2). Er lädt in einem ersten Schritt die nötigen Software-Pakete aus dem Netz, extrahiert diese und spielt eventuell benötigte Patches automatisch ein. Danach beginnt Crosstool-NG mit dem Bauen der Compiler. Das nimmt selbst auf einem schnellen System geraume Zeit in Anspruch – bringen Sie also eine gehörige Portion Zeit und Geduld mit.

Abbildung 2: Der Build-Prozess für Crosstool-NG braucht eine geraume Weile.

Abbildung 2: Der Build-Prozess für Crosstool-NG braucht eine geraume Weile.

RasPi- Crosscompiler

Die Raspberry-Pi-Entwickler greifen für den vorkompilierten Crosscompiler ebenfalls zu Crosstool-NG. Ein Blick auf die letzte Zeile der Versionsinfo (Option -v) verrät die Herkunft (Listing 10).

Listing 10

 

$ arm-linux-gnueabihf-gcc -v 2>&1 | tail -1
gcc version 4.8.3 20140303 (prerelease) (crosstool-NG linaro-1.13.1+bzr2650 -- Linaro GCC 2014.03)

Entwicklungsumgebungen

Nicht jeder schreibt nun seine Programme im Texteditor und kompiliert das Ergebnis dann am Shell-Prompt von Hand. Als wesentlich komfortabler erweisen sich die auf Programmierung spezialisierten integrierten Entwicklungsumgebungen, kurz IDEs, wie zum Beispiel CodeLite [5] oder Oracle Solaris Studio [6]. CodeLite beherrscht den Umgang mit Crosscompilern problemlos. In den Build Settings legen Sie dazu ein neues Profil an und tragen die gewünschten Compiler und Tools ein (Abbildung 3). Beim Übersetzen eines RasPi-Projekts am PC greift CodeLite dann auf die entsprechenden Compiler zurück (Abbildung 4).

Abbildung 3: So fügen Sie den RasPi-Compiler zu CodeLite hinzu …

Abbildung 3: So fügen Sie den RasPi-Compiler zu CodeLite hinzu …

Abbildung 4: … und erstellen dann ein RasPi-Projekt in der IDE.

Abbildung 4: … und erstellen dann ein RasPi-Projekt in der IDE.

Entsprechend funktioniert es mit der in Oracle Solaris Studio integrierten IDE. Obwohl Oracle eigene C-, C++- und Fortran-Compiler mitliefert, erlaubt die Entwicklungsumgebung, den zu verwendenden Compiler als neues Profil anzulegen (Abbildung 5) und dann in einem Projekt als Vorgabe zu verwenden (Abbildung 6). Andere Entwicklungsumgebungen bieten in der Regel ähnliche Möglichkeiten, Sie müssen beim Crosskompilieren daher nicht zwingend auf Ihre Lieblings-IDE verzichten.

Abbildung 5: So fügen Sie den RasPi-Compiler zu Solaris Studio hinzu …

Abbildung 5: So fügen Sie den RasPi-Compiler zu Solaris Studio hinzu …

Abbildung 6: … und erstellen dann ein RasPi-Projekt in der Oracle-IDE.

Abbildung 6: … und erstellen dann ein RasPi-Projekt in der Oracle-IDE.

Google Go

Die von Google entwickelte Programmiersprache Go [7] besitzt ebenfalls eingebaute Funktionen zum Crosskompilieren. Go beschreibt die Fähigkeit in den Installationshinweisen mit: “In effect, you are always cross-compiling”. In der Regel stimmt das Build-System mit dem Zielsystem überein, die Fähigkeit kommt RasPi-Entwicklern allerdings entgegen. Die meisten Linux-Distributionen führen Go in ihren Paketquellen, zum Crosskompilieren müssen Sie Go jedoch von Hand installieren (Listing 11).

Listing 11

 

$ tar xvzf go1.4.2.src.tar.gz
$ cd go/src
$ GOOS=linux GOARCH=arm ./make.bash
# Building C bootstrap tool.
[....]
# Building compilers and Go bootstrap tool for host, linux/amd64.
[...]
# Building packages and commands for host, linux/amd64.
[...]
# Building packages and commands for linux/arm.
[...]
---
Installed Go for linux/arm in /home/benutzername/go
Installed commands in /home/benutzername/go/bin

Nach Abschluss der Installation findet sich der Go-Compiler unter ~/go. Damit er funktioniert, setzen Sie noch die Umgebungsvariable $GOROOT und erweitern den Pfad um das Verzeichnis. So führt das System den selbstkompilierten Go-Compiler vor einem möglicherweise systemweit installierten Exemplar ohne Crosskompilierungsfähigkeiten aus (Listing 12).

Findet Go beim Aufruf die Umgebungsvariablen GOOS=linux GOARCH=arm, dann spuckt der Compiler bei Bedarf ein RasPi-kompatibles Binary aus. Listing 13 demonstriert das Vorgehen am Beispiel einer einfachen “Hello World”-Demo helloworld.go (Listing 14).

Listing 12

 

$ export GOROOT=$HOME/go
$ export PATH=$GOROOT/bin:$PATH

Listing 13

 

$ go run helloworld.go
hello world
$ go build helloworld.go                          # Programm normal übersetzen
$ file helloworld                                 # Ergebnis: ein Binary für x86-64
helloworld: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped
$ GOOS=linux GOARCH=arm go build helloworld.go    # Programm für den RasPi übersetzen
$ file helloworld                                 # Ergebnis: ein Binary für den RasPi
helloworld: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, not stripped

Listing 14

 

package main
import "fmt"
func main() {
  fmt.Println("hello world")
}
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