Externes BUILD-Tool für Arduino

Das Arduino Projekt liefert als IDE einen in Java geschriebenen Editor mit. Dieser kann zwar Syntax Highlighting, ist aber ansonsten recht sparsam ausgestattet. Da Arduino auf ein eigenes Build System setzt, ist man eigentlich auf diese IDE angewiesen. Eigentlich. Aber es gibt da ein unermüdliches Heer an Entwicklern mit zu viel Zeit...

Ich bin mehr aus Zufall über das Projekt ST2-Arduino gestolpert. Dieses bietet Arduino-Integration für den Editor Sublime Text 2 an. Die eigentlich Arbeit übernimmt hierbei das in Python geschriebene inotool. Mit "inotool" erhält man ein Kommadozeilen-Werkzeug, mit dem man

  • schnell neue Projekte anlegen,
  • ein Firmware aus mehreren Dateien und Libraries erstellen,
  • die Firmware in das Gerät hochladen,
  • und über die serielle Schnittstelle mit dem Gerät kommunizieren kann.

Soweit die Theorie. ;-)

Warum der ganze Aufwand?

Das ist wieder mal ein ganz persönliches Ding. Ich mag meinen Editor, und wenn man jeden Tag mit einem Programm arbeitet, dann möchte man ungern wechseln. Das kennt ihr? Gut. ;-)

Mit "inotool" kann man das Bauen von Arduino-Projekten in fast jeden Editor integrieren. In meinen Augen ist allein das den Aufwand wert.

Ein weiteres "Problem" ist die Abkehr von der sonst bei Open Source Projekten üblichen Verzeichnisstruktur. Die Arduino-IDE erwartet innerhalb des "Sketch-Verzeichnisses" ein Projekt, dessen Hauptdatei mit .ino endet und den gleichen Namen wie das Projektverzeichnis tragen muss. Die Unterteilung des Projektes in Unterverzeichnisse ist so nicht möglich. Der Einsatz von "inotool" ändert das.

Die Installation

"inotool" ist in Python geschrieben. Die Debian Repositories kennen das Paket leider noch nicht. Jetzt hat man zwei Möglichkeiten. Entweder man installiert es als "Fremdpaket" unter /usr/local, oder man nutzt die virtualenv Umgebung und bekommt eine "isolierte" Installation. Ich wollte den ersten Weg nicht gehen und habe mit für die Installation mittels pip und virtualenv entschieden. Diesen Weg kann man übrigens auch dann gehen, wenn man keinen Root-Zugang zum System hat.

Alles was mit virtualenv gebaut werden muss, habe ich auf meinem System im Arbeitsverzeichnis ~/work/vWorkspace gespeichert. Für die Arbeit mit "inotool" will ich eine eigene virtuelle Umgebung namens arduino anlegen.

$ cd ~/work/vWorkspace
$ mkproject arduino
...
(arduino)$ pip install ino
Downloading/unpacking ino
  Downloading ino-0.3.6.tar.gz
  Running setup.py egg_info for package ino
Successfully installed ino jinja2 pyserial configobj ordereddict markupsafe six
Cleaning up...

Nach dem ersten Einrichten der virtualenv Umgebung und der Installation von pip ist man "einsatzbereit". Das sieht man an dem Shell-Prompt, der nun den Namen der Umgebung in runden Klammern vorangestellt hat. Hier wäre das (arduino).

Will man die Umgebung später betreten oder verlassen, dann macht man das mit den folgenden Befehlen:

$ workon arduino
(arduino) $ ...
(arduino) $ deactivate
$ ...

Will man mit "inotool" auch die Funktion des seriellen Monitors ersetzen, dann muss man zusätzlich das Paket picocom installieren. Dieses ist bei Debian unter gleichem Namen als Paket verfügbar.

Die ersten Gehversuche

Mit "inotool" kann man nicht nur Anwendungen bauen, es hilft auch beim Erstellen eines neuen Projektes. Die Vorgehensweise erinnert an git. Das Projektverzeichnis muss man von Hand anlegen, hinein wechseln und dann mit ino init initialisieren.

(arduino)$ mkdir test-sketch
(arduino)$ cd test-sketch
(arduino)$ ino init

Und schon hat man ein leeres Arduino Projekt erstellt. Der erzeugte Code ist minimal. Aber "inotool" kennt auch Templates! Zum aktuellen Zeitpunkt sind diese zwar auf ein "Blink"-Beispiel (-t blink) begrenzt, aber immerhin. Hier ließe sich noch einiges unterbringen.

Will man das Projekt bauen und dann in das System übertragen, dann sind die folgenden zwei Befehle notwendig. Ich gebe beim Bauen explizit den Controllertyp (hier mega2560) mit an.

(arduino)$ ino build -m mega2560
(arduino)$ ino upload

So, das erzeugt schöne bunte Ausgaben und am Ende liegt im temporären Verzeichnis .build die HEX-Datei. Wer neugierig ist, der kann sich hier auch das generierte Makefile ansehen.

Probleme mit bestehenden Projekten

Ich habe versucht mein Projekt Quiz-Board mit "inotool" zu Erstellen. Dazu habe ich die Sourcen in das zentrale Arbeitsverzeichnis der zuvor erstellten virtuellen Umgebung kopiert. Mit git clone geht ja das recht schnell.

Ich verwende in diesem Projekt einen etwas eigenen Mechanismus um auf zusätzliche .cpp Dateien zu verzichten. Der Grund dafür ist, dass Ich nicht so viele offene Tabs in der Arduino-IDE haben wollte. Damit dieser Mechanismus greift, muss aber ein spezieller #define __ALLOC_STATICS_HERE__ vor allen lokalen Headern angelegt sein. Im originalen .ino File ist das auch der Fall. Aber "inotool" erzeugt aus dieser Datei eine temporäre .cpp Datei, bei der alle #include nach oben rutschen. Und das geht so nicht!

Wenn ich auf diese Besonderheit verzichte und die Implementation der Methoden und die statischen Konstanten in eigene .cpp Dateien auslagere, dann klappt der Build aber.

Fazit

Mit "inotool" liegt ein interessantes Projekt vor, das sicherlich für sinnvolle Integration in Editoren sorgen kann. Es hat noch einige raue Ecken, aber prinzipiell kann man damit arbeiten. Wenn man später die Metadaten wie Controllertyp und serieller Port mittels Editor-Plugin verwalten kann, dann hat man einen vollwertigen Ersatz für die Arduino-IDE. Werden die Templates richtig in den Editor integriert, dann bekommt man ein wirklich nettes Paket.

Ich werde auf jeden Fall das Projekt im Blick behalten.

Comments