Firmware Subversion
Weil das alte SVN einen Datenbank-Fehler hatte und mit der Zeit auch ein wenig die Ordnung verloren gegangen ist, war das ein guter Anlass aufzuräumen. Leider sind aber alle bisherigen Revisionsänderungen verloren gegangen.
Die aktuelle Leipziger Freifunk-Firmware finder sich jetzt unter:
https://dev.leipzig.freifunk.net/trac/browser/firmware
Inhaltsverzeichnis |
Aufbau des Repositories
Verzeichnislayout
- firmware/ - Das Wurzelverzeichnis
- trunk/ - Der Entwicklerzeig in dem an der Firmware gebaut wird
- branches/ - Dieses Verzeichnis enthält die jeweiligen Versionen der Firmware
- packages/ - Der Quelltext aller Leipziger Add-Ons
- contrib/ - Hier befinden sich Erweiterungen und Tools für den Umgang mit dem Repository
- repoman/ - Repository Manager, damit lassen sich die einzelnen Branches verwalten und Images bauen
- packages/ - Die gepackten Add-On Pakete für die jeweiligen Versionen (Branches)
- patches/ - Modifikation an einzelner Software
- source/ - Quellcode für zusätzliche Programme
- orig/ - Beinhaltet die jeweiligen Berliner Originalversionen auf denen der Trunk aufbaut
Anmerkungen
./branches/
Speicherort der verschiedenen Versionen. Die Version mit der höchsten Nummer ist i.d.R. der aktuelle
"testing" Branch, die vorletzte Version das aktuelle root-Dateisystem wie es auch unter http://firmware.leipzig.freifunk.net/firmware zu finden ist.
./trunk/
In diesem Verzeichnis wird hauptsächlich entwickelt.
./contrib/
Hier befinden sich build-tools mit denen aus den Quellen ein funktionierendes Firmware-Image gebaut werden kann.
Infos zur Verwendung von Subversion gibts hier
Images bauen
Es gibt 2 Varianten sich Firmware-Images zu bauen. Die manuelle Variante ist nachfolgend beschrieben:
Manuelle Variante
# auschecken (der Unterordner ./firmware wird beim checkout angelegt) # (später dann nur mit "svn up" updaten) cd /[lokalerpfad] svn co https://dev.leipzig.freifunk.net/svn/firmware
# eine stabile Version nach z.B. tmp exportieren svn export ./firmware/branches/1.4.5-m/ /tmp/root-current
# bzw. eine Testversion... svn export ./firmware/branches/1.4.5-n/ /tmp/root-testing
# Tipp: Den Versionsstatus eines Branches kannst du mit "svn propget" herausfinden: svn propget ffl:branch ./firmware/branches/[branch]
# dort evtl. das spätere root-Dateisystem nach eigenen Wünschen # anpassen/hinzufügen/verändern/löschen # (wenn du weißt was du tust) cd /tmp/root-current
# nach root.tgz packen und gleich tar -czvf /tmp/root.tgz .
# in den ff-kit-ordner kopieren cp /tmp/root.tgz /[lokalerpfad]/firmware/contrib/freifunk-openwrt-kit-1.4.5-de/ .
# in den freifunk-openwrt-kit-Ordner wechseln cd /[lokalerpfad]/firmware/contrib/freifunk-openwrt-kit-1.4.5-de/
# Firmwareimage erzeugen # (./gen-openwrt ohne parameter aufgerufen zeigt die Optionen) ./gen-openwrt trx -v 1.4.5-custom > /tmp/firmware.trx
# Firmware auf Router kopieren scp /tmp/firmware.trx root@192.168.1.1:/tmp/
# einloggen ssh root@192.168.1.1
# flashen ;) firmware-burn /tmp/firmware.trx
Mit dem "releases" Tool als Wizzard
Zusätzlich gibt es noch ein Firmware-Tool in /contrib/repoman/releases mit dem man bequem Images bauen kann. Wenn du nur sporadisch Images baust und keine Verwendung für eine lokale Arbeitskopie des kompletten Firmware-Repositories hast dann kannst du dir mit dem Tool die Quellen automatisch aus dem Netz laden und ein Image erstellen lassen.
Das Programm auschecken...
svn export https://dev.leipzig.freifunk.net/svn/firmware/contrib/repoman/releases
... und eine stabile Firmware bauen ...
./releases --branch stable
... oder die "testing" Version nutzen:
./releases --branch testing
... brandneu aus dem Trunk geht auch (auf eigene Gefahr!):
./releases --branch unstable
Anschließend fragt das Programm nach dem Image-Typ, gebe hier das passende an, z.B. 7 für "trx". Das fertige Image kannst du dann in /tmp finden.
Lokale Arbeitskopie statt Online-Repository nutzen
Die obere Methode hat den Nachteil das du jedesmal die aktuellen Quellen aus dem Online-Repository herunterladen musst um ein Firmware-Image zu bauen. Deshalb gibt es noch eine Offline-Variante die eine bereits ausgecheckte Arbeitskopie auf der Festplatte nutzt um die Images zu generieren.
Beim ersten Mal brauchst du einen kompletten checkout des Firmware-Repositories, später reicht ein "svn up" um den neuesten Stand zu erhalten:
svn co https://dev.leipzig.freifunk.net/svn/firmware cd firmware/contrib/repoman/
Nun kann man mit dem "releases" Tool und dem "--local" Parameter Images aus der Arbeitskopie bauen lassen. Der "--type" Parameter ist optional. Beispiel für die stabile Version:
./releases --local ../../ --branch stable --type trx
... oder wenn man ein Testing-Image möchte:
./releases --local ../../ --branch testing --type trx
Danach findest du ein neues Image in /tmp welches ungefähr so heißt:
ffl-firmware-1.4.5-m123.trx
Dieses Image kann man dann wie gehabt auf sein Gerät flashen.
Das Tool kennt noch weitere Optionen die du dir mit
./releases --help
anzeigen lassen kannst.
Konventionen im Umgang mit dem Repository
Solltest du vor haben eigene Änderungen in das Repository einzuchecken so gilt es einige Dinge zu beachten:
- Alle Änderungen nur im Trunk vornehmen!
- Bitte nur funktionierende Änderungen übertragen, also keine "halben Sachen"
- Bitte kommentiere deine Änderungen ausreichend
Wie kann ich denn nun was einchecken?
Nachdem du dir das komplette Firmware Repository ausgecheckt hast solltest du den Ordner "trunk" im "firmware" Verzeichnis finden. Um Änderungen vorzunehmen wechselst du in den Trunk:
cd /dein/lokaler/pfad/firmware/trunk/
Hier befindest du dich jetzt im Root-Verzeichnis der Firmware. Dort kannst du einfach lokal deine Änderungen vornehmen. Wenn du fertig bist überträgst du deine Änderungen mittels
svn commit
an das Repository. Bitte vergiss nicht deine Änderungen ausreichend zu kommentieren.
Sonstiges
Wie kann ich ein Diff zwischen zwei Versionen in /firmware/orig/ (oder einem beliebigem anderen Ordner) machen?
Das funktioniert mittels "svn diff url_alt@rev_alt url_neu@rev_neu". Zunächst muss man die beiden Revisionen finden, das geht z.B. hier (in der Spalte "Rev") oder mit dem "svn info" Befehl (wobei die "Letzte geänderte Rev" zu beachten ist):
jow@wws-lt3:~$ svn info https://dev.leipzig.freifunk.net/svn/firmware/orig/1.6.9 Pfad: 1.6.9 URL: https://dev.leipzig.freifunk.net/svn/firmware/orig/1.6.9 Basis des Projektarchivs: https://dev.leipzig.freifunk.net/svn UUID des Projektarchivs: ab181a69-ba2e-0410-a84d-ff88ab4c47bc Revision: 716 Knotentyp: Verzeichnis Letzter Autor: ufo Letzte geänderte Rev: 671 Letztes Änderungsdatum: 2007-10-16 01:52:30 +0200 (Di, 16 Okt 2007)
In unserem Beispiel hat der Ordner /firmware/orig/1.6.9 die Revision 671 und der Ordner /firmware/orig/1.6.10 die Revision 714. Ausgestattet mit diesen beiden Revisionsnummern kann man sich jetzt die Differenzen zwischen den beiden Ordnern zeigen lassen:
svn diff https://dev.leipzig.freifunk.net/svn/firmware/orig/1.6.9@671 https://dev.leipzig.freifunk.net/svn/firmware/orig/1.6.10@714
Hier ist ein kleines Beispielscript was die drei o.g. Schritte zusammenfasst:
#!/bin/sh # delta.sh - Finde die Unterschieder zweier Versionen in /firmware/orig/ baseurl=https://dev.leipzig.freifunk.net/svn/firmware/orig if [ -z "$1" -o -z "$2" ]; then echo "Aufruf: $0 <alte Version> <neue Version>"; exit 1 fi oldrev=$(LC_ALL=C svn info $baseurl/$1 | grep 'Last Changed Rev' | cut -d' ' -f4) newrev=$(LC_ALL=C svn info $baseurl/$2 | grep 'Last Changed Rev' | cut -d' ' -f4) svn diff $baseurl/$1@$oldrev $baseurl/$2@$newrev
Damit reduziert sich der oben beschriebene Weg auf folgenden Befehl:
./delta.sh 1.6.9 1.6.10
Wenn man nur eine Liste der geänderten Dateien möchte (ohne den Diff-Text) kann man folgendes probieren:
./delta.sh 1.6.9 1.6.10 | grep Index: