• Keine Ergebnisse gefunden

Erstellung eigener OpenWrt-Module

OpenWrt auf dem WLAN-Router WL-500g Premium

3.5 Erstellung eigener OpenWrt-Module

$ scp r e c e i v e r root@ < wl500 - ip >:

- > W e c h s e l auf WL - 5 0 0

$ ./ r e c e i v e r 6 4 0 0 0

Der Zusatz 64 000 gibt den Port an, auf welchem die UDP-Daten empfangen werden sollen. U. U. f¨uhrt nun die fehlende C++-Standardbibliothek zu einer Fehlermeldung beim Starten vonreceiverauf dem WL-500:

$ ./ r e c e i v e r : can ’ t l o a d l i b r a r y ’ l i b s t d c ++. so .6 ’

Die Bibliothek kann dann mitipkg einfach nachinstalliert werden:

$ i p k g i n s t a l l l i b s t d c p p

Nun sollte sich die Anwendungreceivermit Angabe der Portnummer starten lassen. Im Anschluss kann vom Host-Rechner aus eine Zeichenkette eingegeben und gesendet werden, die auf dem WL-500 empfangen und ausgegeben wird:

$ ./ s e n d e r < wl500 - ip > 6 4 0 0 0

Die Cross Compiler k¨onnen nat¨urlich auch in einer integrierten Entwicklungs-umgebung wie beispielsweise Eclipse verwendet werden [Eclipse 08]. Hierzu wird in den Projekteinstellungen unter C/C++ Build eine weitere Konfigu-ration angelegt, und es werden bei den dortigen Einstellungen Settings die Eintr¨age f¨ur Compiler, Linker und Assembler in Aufrufe des Cross Compilers ge¨andert.

3.5 Erstellung eigener OpenWrt-Module

Die im vorigen Abschnitt beschriebene Methode der Software-Entwicklung f¨ur einen OpenWrt-basierten Router ist f¨ur das schnelle Testen einer Anwendung v¨ollig ausreichend. Ist das Projekt aber schon weiter gediehen, so sollte u. U. ein eigenes OpenWrt-Paket erstellt werden. Hiermit lassen sich dann alle Vorteile der ipkg-Paketverwaltung wie z. B. Versionsverwaltung und Funktionen zur Instandhaltung nutzen.

Einmal l¨asst sich damit Ordnung in das System bringen. Weiterhin k¨onnen so mehrere OpenWrt-Ger¨ate leicht auf einem einheitlichen Stand gehalten werden. Und abschließend k¨onnen damit auch im Sinne des Open-Source-Gedankens die eigenen Entwicklungen anderen OpenWrt-Benutzern einfach zug¨anglich gemacht werden.

Dreh- und Angelpunkt bei der Integration in das OpenWrt-Build-System ist die Beschreibung des eigenen Paketes in Form einer Datei

<openwrt-dir>/package/<pack name>/Makefile. Falsche Eintr¨age an dieser

Stelle k¨onnen zu schwer nachvollziehbaren Fehlern f¨uhren. Anhand des Quell-textes in<embedded-linux-dir>/src/openwrt/helloworld pck/soll mithil-fe eines Hello-World-Beispiels der Aufbau einer solchen Paketbeschreibung er-kl¨art werden.

F¨ur die Erstellung eines neuen Paketes muss zun¨achst ein Paketverzeichnis angelegt werden:

$ m k d i r < openwrt - dir >/ p a c k a g e / h e l l o w o r l d

Dort wird die ProjektbeschreibungMakefile7platziert. Diese Datei enth¨alt ei-ne Beschreibung des Paketes, die Angabe der Quelltext-Dateien, Informatioei-nen zum Build-Verzeichnis und ein Installationsziel f¨ur fertige Pakete. Besondere Aufmerksamkeit ist hinsichtlich des korrekten Setzens von Leerzeichen und Tabstopps notwendig: Zum einen sind f¨ur Einr¨uckungen statt Leerzeichen nur Tabstopps erlaubt, zum anderen d¨urfen auch an Zeilenenden keine Leerzeichen vorkommen.

Neben der Datei Makefile werden im Paketverzeichnis auch die Quellen ben¨otigt und entsprechend an diesen Ort kopiert:

$ cp < e m b e d d e d linux dir >/ src / o p e n w r t / h e l l o w o r l d \ _ p c k / M a k e f i l e < openwrt -dir >/ p a c k a g e / h e l l o w o r l d /

$ cp - r < e m b e d d e d - linux - dir >/ src / o p e n w r t / h e l l o w o r l d \ _ p c k / h e l l o w o r l d - 1 . 0 . 0

< openwrt - dir >/ p a c k a g e / h e l l o w o r l d /

Die zeilenweise Betrachtung von Makefile zeigt, dass nach dem Setzen OpenWrt-interner Variablen inrules.mkdie Angabe von Paket, Versionsnum-mer und Release erfolgt. Aus dieser Beschreibung werden sp¨ater Dateinamen f¨ur die Quellen nach der Konvention $(PKG NAME)-$(PKG VERSION) zusam-mengesetzt.

i n c l u d e $( T O P D I R ) / r u l e s . mk

# N a m e a n d r e l e a s e n u m b e r of t h i s p a c k a g e P K G _ N A M E := h e l l o w o r l d

P K G _ V E R S I O N : = 1 . 0 . 0 P K G _ R E L E A S E :=1

Durch den folgenden Ausdruck wird angegeben, wo das Paket erstellt wird:

# Build - D i r e c t o r y

P K G _ B U I L D _ D I R :=$( B U I L D _ D I R ) /$( P K G _ N A M E ) -$( P K G _ V E R S I O N )

Die Variable $(BUILD DIR) ist standardm¨aßig auf das Verzeichnis

<openwrt-dir>/build mipsel gesetzt. Die darauf folgenden Zeilen dienen der Paketbeschreibung und der Einordnung in die OpenWrt-Paketstruktur.

Unter der angegebenen Kategorie taucht das Paket in der Konfigurationsliste (make menuconfig) auf und kann entsprechend dort eingebunden werden.

7<embedded-linux-dir>/src/openwrt/helloworld pck/Makefile.

3.5 Erstellung eigener OpenWrt-Module 69

Die Angabe der f¨ur die Vorbereitung auf den eigentlichen Build-Prozess er-forderlichen Aktionen wird ¨uberBuild/Prepare spezifiziert. Im vorliegenden Fall wird das Build-Verzeichnis erstellt (das zu diesem Zeitpunkt noch nicht vorhanden ist) und die im Paketverzeichnis liegenden Quellen werden dorthin kopiert:

Diese Vorgehensweise ist weniger ¨ublich, normalerweise werden die Quellen f¨ur die Pakete nicht mitgeliefert, sondern in Form einer Datei name.tar.gz aus dem Internet geladen.

Im vorliegenden Fall soll aber die Variante mit lokalen Quellen verwendet wer-den, um auf den sonst notwendigen Webserver verzichten zu k¨onnen. Eine Pa-ketbeschreibung des gleichen Beispieles, aber mit Bezug der Quelltext-Dateien von einem HTTP-Server, befindet sich als Datei Makefile.http im mitge-lieferten Quellverzeichnis des Paketes und kann alternativ verwendet werden (nach einer Umbenennung inMakefile).

¨Uber die Pr¨amissePackage/helloworld/installwird festgelegt, was bei ei-ner Installation des Paketes genau geschehen soll.$(INSTALL BIN)enth¨alt die Anweisung, um die Bin¨ardateien aus dem Build-Verzeichnis nach$(1)/bin/

zu kopieren. $(1) stellt dabei das Wurzelverzeichnis / auf dem Router dar.

Mit $(INSTALL DIR) wird zuvor sichergestellt, dass dieses Verzeichnis exis-tiert. Ansonsten wird es angelegt:

Die folgende Zeile f¨uhrt die notwendigen Befehle aus, um das Paket mit den vorgenommenen Einstellungen zu ¨ubersetzen. Der Name muss mit dem Ver-zeichnisnamen des Paketes ¨ubereinstimmen:

# C o m p i l e p a c k a g e

$( e v a l $( c a l l B u i l d P a c k a g e , h e l l o w o r l d ) )

Wird die Variante mit Quellenbezug aus dem Internet gew¨ahlt, wie in Makefile.http hinterlegt (umbenennen nicht vergessen), so sind in der Pa-ketbeschreibung weitere Zeilen hinsichtlich der notwendigen Informationen zu Quelle und Pr¨ufsumme anzugeben:

P K G _ S O U R C E _ U R L := h t t p :// www . p r a x i s b u c h . net / e m b e d d e d - l i n u x / P K G _ S O U R C E :=$( P K G _ N A M E ) -$( P K G _ V E R S I O N ) . tar . gz

P K G _ C A T := z c a t

P K G _ M D 5 S U M := a 5 3 e 1 5 c f b 4 e 0 9 5 5 a 3 c 4 b 6 4 4 2 9 f c 5 d 1 d 9

Die Angabe der MD5-Pr¨ufsumme ist optional. Ist aber die Pr¨ufsumme vor-handen, so muss sie ¨ubereinstimmen, sonst wird die Archivdatei nach dem Download verworfen8. Die Quellen werden nach dem Download im Verzeich-nis<openwrt-dir>/dl/abgelegt. Das OpenWrt BS entpackt die Quellen auto-matisch in das Verzeichnis$(PKG BUILD DIR). Auf die Definition von weiteren Anweisungen inBuild/Preparekann in diesem Fall verzichtet werden.

Wird nun die Konfigurationsumgebung mit dem folgenden Aufruf gestartet, so sollte in der Kategorie MyPackagesdas Pakethelloworld mitsamt Beschrei-bung erscheinen:

$ m a k e m e n u c o n f i g

Das Paket kann nun wahlweise in den Kernel ¨ubernommen oder nur als Modul

¨ubersetzt werden. Die zweite M¨oglichkeit reicht aus, sodass nach Abspeichern und ¨Ubersetzen mit make im Verzeichnis <openwrt-dir>/bin/packages/

eine neue Paketdatei helloworld 1.0.0-1 mipsel.ipk liegen soll-te. Ein einzelnes Paket l¨asst sich ¨ubrigens auch direkt mit make package/<pack name>-compile bauen. Wird diese Datei auf den Rou-ter kopiert, so kann das Paket dort folgendermaßen installiert werden:

$ i p k g i n s t a l l h e l l o w o r l d _ 1 .0.0 -1 _ m i p s e l . ipk

Anschließend liegt die ausf¨uhrbare Anwendung global verf¨ugbar im Verzeichnis /bin/und der WL-500 schickt nach einem Aufruf Gr¨uße in die Welt:

$ ./ h e l l o w o r l d

$ H e l l o W o r l d !

Weitere Tipps zur Erstellung eigener Pakete sind in der Einf¨uhrung in das OpenWrt BS im Forum verf¨ugbar [OpenWrt BS Intro 08].

8Die MD5-Pr¨ufsumme einer Datei kann in der Kommandozeile durch den Aufruf von md5sum <dateiname>angezeigt werden.

3.6 IO-Warrior-Erweiterung und Kernelmodule unter OpenWrt 71

3.6 IO-Warrior-Erweiterung und Kernelmodule unter