KDevelop 5 erschienen
Die nachfolgende Beschreibung basiert auf der inzwischen veralteten Version 4.7.3 von KDevelop. Inzwischen ist die Version 5 erschienen, die viele Verbesserungen und Optimierungen bereitstellt. Der KDevelop-Mitentwickler Kevin Funk hat auf https://community.kde.org/KDevelop/HowToCompile_v5 eine Anleitung veröffentlicht, in der genau beschrieben wird, wie man KDevelop 5 selber kompiliert. Ich habe dies ausprobiert und dabei festgestellt, dass die Beschreibung einwandfrei funktioniert. Allerdings erfüllt das von mir verwendete Linux Mint 18.2 nicht alle Voraussetzungen, die selbst-kompilierte neue Version von KDevelop erfolgreich zu starten.
Dass es aufgrund der vielen verschiedenen Linux-Varianten zu Problemen beim Start von KDevelop 5 kommen kann, ist den Entwicklern offensichtlich selbst bewusst geworden. Aus diesem Grund haben sie sich dazu entschlossen, ein Image zu erzeugen, das sämtliche Abhängigkeiten erfüllt. Mit diesem Image arbeite ich nun selber bereits seit einigen Monaten und habe festgestellt, dass meine Anforderungen vollständig unterstützt werden.
Das Image lässt sich von der Website https://www.kdevelop.org/download
herunterladen und wird mit ./Kdevelop.AppImage
gestartet. Bisher ist mir noch kein Fehler aufgefallen. Auch die Geschwindigkeit, mit der KDevelop ausgeführt wird, ist sehr zufriedenstellend. Selbst komplexe Projekte, wie der Raspbian-Kernel, lässt sich hiermit problemlos kompilieren: Mit der früher von mir bevorzugten IDE Code::Blocks ist mir dies nie gelungen!
KDevelop
KDevelop ist eine sehr leistungsfähige integrierte Entwicklungsumgebung (IDE), mit deren Hilfe viele Programmierer in der ganzen (Linux-)Welt Software für das K Desktop Environment KDE entwickeln. Die aktuelle und stabile Version hat die Versionsnummer 4.7.3 (Stand Juli 2016). Obwohl ich selber nicht unter KDE, sondern mit dem Cinnamon-Desktop unter Linux Mint, arbeite, funktioniert KDevelop auch hier problemlos. Sie finden im weiteren Verlauf einen praxisorientierten Einstieg in die Nutzung dieser IDE.
Informationen zu meiner Arbeitsumgebung
Um Ihnen den Einstieg zu erleichtern, liefere ich zunächst eine Übersicht über die von mir verwendete Arbeitsumgebung. Vermutlich sieht diese bei Ihnen ganz verschieden aus: Ich gehe aber davon aus, dass meine Erkenntnisse übertragbar sind.
Wenn Sie mein Buch "Embedded Linux" kennen (erschienen im mitp-Verlag, ISBN: 978-3-95845-061-5), wissen Sie bereits, dass alle im Buch beschriebenen Projekte in einer virtuellen Maschine unter VirtualBox von Oracle entwickelt wurden. Diesen Ansatz habe ich weiter verfolgt, wobei die Hilfsmittel immer auf dem aktuellsten Stand gehalten werden.
Arbeitsumgebung
Host-Betriebssystem | Microsoft Windows 7 Home Premium 64 Bit (Aktualisierung am 21.07.2016) |
VirtualBox von Oracle | VirtualBox 5.1.2 r 108956 (letzte Aktualisierung am 22.07.2016) |
Arbeitsspeicher gesamt * | 16 GB (Aufteilung: 8 GB für den Host, 8 GB für die virtuelle Maschine) |
Mikroprozessor | AMD A10-7700K Radeon R7, 10 Compute Cores 4C + 6G, 3.40 GHz |
Aufteilung | 2 Kerne für das Host-OS / 2 Kerne für das Gast-OS |
Größe des VBox-Images | 150 GB (dynamisch alloziert) |
Video-RAM VBox | 128 MB |
Gast-Betriebssystem ** | Linux Mint 18 mit Cinnamon-Desktop mit KDevelop 4.7.3 als IDE |
Stand: Stand: 22.07.2016
Vorausgesetzt wird zudem, dass Ihnen bereits eine Cross-Toolchain zur Verfügung steht. Details zur Beschaffung und Installation einer Cross-Toolchain finden Sie hier: Toolchain auswählen und installieren.
* Als das Buch entstand, standen mir nur 8 GB Arbeitsspeicher zur Verfügung, die ich "gerecht" zwischen Host und Gast aufgeteilt hatte. Mit "nur" 4 GB Arbeitsspeicher in der virtuellen Maschine bereitet das Erzeugen eines Kernels mit einer IDE keine Freude: Wenn es überhaupt funktioniert (ich hatte hier vereinzelt einen Maschinenstillstand), so wird es zumindest quälend langsam. Mit 8 GB Arbeitsspeicher in der virtuellen Maschine hat es dann aber funktioniert.
** Die Beispiele zum Buch entstanden seinerzeit noch unter Linux Mint 17.1 und teilweise Linux Mint 17.3. Inzwischen habe ich ein Update auf Linux Mint 18 durchgeführt. Als IDE verwende ich jetzt zusätzlich zu Code::Blocks KDevelop. Mit Code::Blocks gelang es mir nicht, den Kernel zu kompilieren, mit KDevelop aber schon.
KDevelop beschaffen und installieren
Unter der vor wenigen Tagen erschienen Version 18 von Linux Mint wird in der Anwendungsverwaltung die aktuelle Version 4.7.3 von KDevelop bereits zur Installation angeboten. Verwenden Sie noch eine ältere Version von Linux Mint, so müssen Sie über die Anwendungsverwaltung zunächst noch zwei PPAs (PPA = Personal Package Archive) hinzufügen, die auf https://launchpad.net/ gehosted werden. Fügen Sie also zunächst die beiden PPAs
deb http://ppa.launchpad.net/marian.kadanka/kdevelop/ubuntu trusty main
deb-src http://ppa.launchpad.net/marian.kadanka/kdevelop/ubuntu trusty main
zu Ihrer Paketverwaltung hinzu und aktualisieren Sie anschließend die Datenbank der installierten Softwarepakete mit sudo apt-get update && sudo apt-get upgrade
.
Wenn Sie nun KDevelop installieren, so wird automatisch die aktuelle Version verwendet.
Raspbian-Kernel herunterladen
Am Beispiel der aktuellen Version des Raspbian-Kernels für den Raspberry Pi wird in den folgenden Abschnitten gezeigt, wie der Kernel mit KDevelop "gebaut" wird. Dies setzt natürlich voraus, dass Sie den Kernel bereits heruntergeladen haben. Falls nicht: Wenden Sie einfach in Ihrem Entwicklungsverzeichnis das Kommando
git clone https://github.com/raspberrypi/linux
an. Dies lädt das gesamte Quelltextarchiv des Raspbian-Kernels aus dem Internet.
Anmerkung:
Wenn Ihnen nur eine langsame Internetverbindung zur Verfügung steht, bietet sich für das Herunterladen der Einsatz der Alternative
git clone --depth 1 https://github.com/raspberrypi/linux
an. In diesem Fall wird nur die aktuellste Version des Kernel-Quelltextes heruntergeladen, was bedeutend schneller ist.
Anmerkung:
Sämtliche Softwareprojekte, an denen ich arbeite, "landen" bei mir in einem Unterverzeichnis von /home/ralf/Develop
. Für den Raspbian-Kernel existiert hierfür das Unterverzeichnis Raspbian
. Das oben gezeigte Kommando git clone ...
führe ich daher im Verzeichnis /home/ralf/Develop/Raspbian
aus.
KDevelop konfigurieren
Starten Sie nun KDevelop 4.7.3. Aber Halt: Bevor der Kernel-Sourcecode in KDevelop geladen wird, sollten Sie noch eine kleine Vorabeinstellung durchführen! KDevelop bietet mit dem Quelltext-Parser ein sehr interessantes Feature, das es Ihnen ermöglicht, an beliebige Stellen im Sourcecode zu springen: Wenn Sie den Mauszeiger auf einen beliebigen Eintrag richten und ihn dort eine kurze Zeit verweilen lassen, zeigt KDevelop an, an welchen anderen Stellen im Sourcecode dieser Eintrag verwendet wird und wo er definiert wurde. Der Kernel-Sourcecode umfasst aber mehrere Millionen Quelltextzeilen, die der Parser zunächst durchsuchen muss. Dieser Vorgang dauert auch auf einem modernen Mehrkern-PC sehr lange (durchaus eine Stunde oder mehr). Deshalb soll der Quelltext-Parser zunächst deaktiviert werden.
Quelltext-Parser deaktivieren
Klicken Sie in der Menüzeile den Eintrag Settings
und in dem Pulldown-Menü anschließend den Eintrag Configure KDevelop...
an.
Entfernen Sie hier - wie in der Abbildung durch die roten Rahmen hervorgehoben - im Untermenü Background Parser
den Haken in der Checkbox Enable Background Parser
.
Wir werden die Checkbox später wieder aktivieren, jetzt ist es aber noch zu früh hierfür.
Kernel-Sourcecode + KDevelop
Starten Sie nun die Entwicklungsumgebung KDevelop. Nach einer frischen Installation von KDevelop ist das Fenster, das für die Anzeige von Projekten reserviert ist, noch leer.
Einschub:
Ich werde an dieser Stelle nicht auf KDevelop-Interna eingehen, da diese an anderer Stelle hervorragend und zudem ausführlicher behandelt werden. Ein besonders gelungenes Beispiel hierfür ist das KDE UserBase Wiki, das Sie unter https://userbase.kde.org/Kdevelop4/Manual/Meet_KDevelop/de finden. Auf einige Details möchte ich aber dennoch eingehen:
- KDevelop ist eine sitzungsorientierte Entwicklungsumgebung (session-oriented IDE). Eine Session (Sitzung) enthält ein oder mehrere Projekte. Das Besondere an diesen Projekten besteht darin, dass die verschiedenen Projekte in irgendeiner Form miteinander verbunden sind. Wenn Sie beispielsweise Gerätetreiber entwickeln, so gilt als Voraussetzung hierfür, dass die Header-Dateien des Kernel-Sourcecodes vorhanden sind. Eines der Projekte, das eine Session/Sitzung enthält ist also der Kernel-Sourcecode (dies gilt auch dann, wenn Sie gar nicht vorhaben, den Kernel zu modifizieren!).
- Nach dem ersten Start hat die Standardsession den Namen
default:linux
. - Standardmäßig steuert KDevelop die Entwicklung von Softwareprojekten mit
cmake
. Es ist aber ebenfalls in der Lage, für die Softwareentwicklung das ebenfalls sehr weit verbreitete Programmmake
zu verwenden.
Öffnen/Erstellen eines neuen Projekts
Wir beginnen nun damit, den bereits heruntergeladenen Quelltext des Raspbian-Kernels in KDevelop als neues KDevelop-Projekt zu starten. Klicken Sie hierzu, wie in der folgenden Abbildung gezeigt, in der Menüleiste auf den Eintrag Project
und in dem hierauf erscheinenden Pulldown-Menü auf den Eintrag Open / Import Project...
.
Es öffnet sich der nachfolgend gezeigte Dialog:
Sie erkennen in der Abbildung die von mir gewählte Verzeichnisstruktur. Da ich das Kommando git clone ...
im Verzeichnis /home/ralf/Develop/Raspbian
ausgeführt habe, wird für den Kernel-Quelltext automatisch das Verzeichnis linux
erzeugt. Dieses Verzeichnis müssen Sie nun in der Dialogbox auswählen.
Klicken Sie hier nun auf den Eintrag Makefile
(einfacher Mausklick) und anschließend auf die mit > Next
beschriftete Schaltfläche.
Es öffnet sich ein weiteres Fenster, in dem Sie den Projekttyp festlegen können. Da der Linux-Kernel (und somit auch der Raspbian-Kernel) mit make
(und nicht mit cmake
) erzeugt wird, wählen Sie in der Auswahlliste Build System:
den Eintrag Custom Makefile Project Manager
. Sie können nun die Schaltfläche > Finish
anklicken.
Obwohl der Quelltext des Linux-Kernels inzwischen mehr als 20 Millionen Zeilen umfasst, erfolgt das Importieren des Projekts recht schnell: Auf meinem PC dauert dies weniger als eine Minute! Im Projects-Fenster von KDevelop erkennen Sie die Verzeichnisse und Dateien, die Sie nun mit KDevelop verarbeiten können.
Konfiguration des Projekts
Weiter oben haben Sie bereits eine Grundkonfiguration von KDevelop durchgeführt. Als nächstes muss aber nun das Projekt konfiguriert werden. Laden Sie also nun die Datei main.c
in den Editor. Sie finden main.c
im Unterverzeichnis init
.
Sie erkennen sofort, dass etwas nicht in Ordnung ist: Ohne besonderen Grund wären die meisten der Header-Dateien nicht mit roten Linien markiert. Der Grund hierfür ist recht einfach: KDevelop weiß (noch) nicht, wo sich die markierten Header-Dateien befinden. Dieses Problem muss nun zunächst gelöst werden.
Klicken Sie im Projects
-Fenster mit der rechten Maustaste auf den Projektnamen (hier: linux
). In dem sich nun öffnenden Pulldown-Menü klicken Sie dann mit der linken Maustaste auf den Eintrag Open Configuration...
.
Hierauf wird der Konfigurationsdialog für das Projekt angezeigt.
Im Fenster Configure Project ...
erkennen Sie, dass in dem Feld unterhalb des Tabs Includes/Imports
noch keine Einträge vorhanden sind: Diese müssen aber vorhanden sein, da KDevelop aus diesen Angaben sämtliche fehlenden Informationen bezieht. Sie haben nun zwei Möglichkeiten, die fehlenden Abhängigkeiten aufzulösen:
- Sie können jede einzelne der rot unterlegten Header-Dateien mit der Maus "berühren". Nach kurzer Zeit bietet Ihnen der Editor die Möglichkeit, die Abhängigkeit manuell aufzulösen.
- Die zweite (und einfachere) Möglichkeit besteht darin, die Verzeichnisse aus der folgenden Abbildung zu übernehmen. Beachten Sie hierbei nur, dass Sie den Kernel-Sourcecode (aus ihm werden die meisten Header-Dateien bezogen) möglicherweise in einem anderen Verzeichnis gespeichert haben.
Anmerkung:
Ebenfalls wichtig ist der Installationsort der Cross-Toolchain: Auch sie enthält Header-Dateien, die benötigt werden. Standardmäßig werden die meisten Header-Dateien bei der Installation eines Linux im Verzeichnis /usr/include
hinterlegt. Doch Vorsicht! Zunächst ist nicht garantiert, dass wirklich alle Header-Dateien dort zu finden sind. Wichtiger ist aber, dass die Header-Dateien nicht zum Target (also dem Embedded System) passen: Sie gehören zum Host-Linux!
Eine erste Orientierung liefert Ihnen die folgende Abbildung:
In meiner Arbeitsumgebung haben sich durch diese Einträge die roten Linien "wie von Zauberhand" aufgelöst: Alle Abhängigkeiten sind hierdurch erfüllt (aufgelöst).
Background Parser wieder einschalten
Wenn bei Ihnen alles genauso funktioniert wie bei mir, können Sie nun den Background Parser wieder aktivieren. Sie erinnern sich:
- Klicken Sie im Hauptmenü von KDevelop auf den Eintrag
Settings
. - In dem nun angezeigten Pulldown-Menü klicken Sie auf den Eintrag
Configure KDevelop...
. - In dem nun angezeigten Dialog klicken Sie auf den Eintrag
Background Parser
. - Aktivieren Sie nun wieder die Checkbox
Enable Background Parser
und klicken Sie anschließend auf die SchaltflächeOK
.
In Abhängigkeit vom Umfang des Projekts kann es durchaus mehrere Stunden dauern, bis der Background Parser seine Arbeit beendet. Bei einem derart großen Projekt wie dem Linux-Kernel empfehle ich Ihnen, diesen Vorgang nachts durchzuführen.
Tipp:
Ich empfehle Ihnen sehr, den Background Parser zu verwenden. Einfaches "Berühren" eines Funktionsnamens, einer Variablen, einer Struktur usw. mit der Maus liefert Ihnen Informationen, die sehr hilfreich bei der Arbeit sind. Sie erhalten beispielsweise Informationen darüber, wo die Funktion definiert ist, von welchen anderen Stellen sie ebenfalls aufgerufen wird, und Sie können sich durch einen einfachen Klick mit der linken Maustaste den zugehörigen Quelltext in einem separaten Editorfenster genauer ansehen.
Toolchain einbinden
Zum Abschluss muss KDevelop noch erfahren, welche Toolchain (Compiler, Linker, Debugger, etc.) es verwenden soll, um das Projekt zu erzeugen. Hierzu ist es erforderlich, noch einmal in die Projekt-Konfiguration zu wechseln (Klick mit der rechten Maustaste auf das Projekt --> Eintrag Open Configuration...
).
Klicken Sie nun aber auf den Eintrag Make
(siehe folgende Abbildung):
Ich sehe keinen Sinn darin, einen langwierigen Prozess "durchzuziehen", wenn an einer beliebigen Stelle der Compiler bereits einen Fehler "anmeckert". Daher habe ich die Checkbox Abort on first error:
aktiviert. In Abhängigkeit von der Leistungsfähigkeit Ihres Host-PCs tragen Sie unter Number of simultaneous jobs:
die Anzahl der parallel durchzuführenden Arbeiten durch. Da der Linux-Kernel (Raspbian-Kernel) auf make
basiert, tragen Sie unter Make executable: make
ein.
Hier wird das Default-Target aus dem Makefile eingetragen, das Sie erzeugen möchten: Standardmäßig handelt es sich hierbei um das Ziel all
. Grundsätzlich können Sie hier aber auch andere Ziele eintragen, z.B. clean
oder mrproper
. Ich rate Ihnen aber hiervon ab, da die beiden letztgenannten Ziele alle bereits erzeugten Zwischendateien (Objekt-Dateien) und mrproper
sogar die Konfigurationsdatei .config
löschen.
Unter Additional make options:
habe ich den Eintrag CROSS_COMPILE=/opt/toolchain/bin/arm-linux-gnueabihf-
eingetragen. Hierdurch wird Kdevelop über den Installationsort der Cross-Toolchain informiert.
Den Eintrag Active environment profile:
habe ich nicht verändert.
Buildprozess starten
Nun sind alle Einstellungen durchgeführt. Es ist also an der Zeit zu überprüfen, ob auch alles so funktioniert, wie geplant. Klicken Sie hierzu einfach auf den Eintrag Build
in der Menüleiste. Auch hier gilt: Der Kernel ist ziemlich umfangreich! Bis der Kernel fertig ist, kann eine ziemlich lange Zeit vergehen (auf meinem System dauert das Kompilieren zwischen 30 und 60 Minuten).
Fehler:
Normalerweise sollte der Build-Vorgang von Erfolg gekrönt sein. Sollten Sie aber Fehlermeldungen erhalten, die Sie sich nicht erklären können, prüfen Sie bitte, ob Sie möglicherweise vergessen haben, den Kernel-Sourcecode zu konfigurieren. Wenn Sie den Kernel-Sourcecode "einfach nur so" heruntergeladen haben, fehlt mit großer Sicherheit die versteckte Datei .config
. Für den Raspberry Pi können Sie die Standardkonfiguration sehr einfach mit dem folgenden Kommando erzeugen:
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make bcmrpi-defconfig
Diese Zeile funktioniert für den Raspberry Pi 1 B+, für die aktuelleren Modelle Raspberry Pi 2 und 3 stehen im bereits heruntergeladenen Sourcecode unter linux/arch/arm/configs
die Alternativen zur Verfügung. Entsprechend gilt dies natürlich auch für andere Systeme, wie den BeagleBone Black oder die Cubieboards.