Das VDR Quelltextpaket
Posted by Tobi
Mit Version 1.2.6-7 des VDR-Pakete für c't-VDR gibt es nun ein zentrales Quelltextpaket. Aus diesem kann jeder ambitionierte VDR- Benutzer, nicht nur die Standard-VDR-Version, sondern auch eine ganze Reihe von Patchvarianten erstellen. Die verschiedenen Patches sind so vorbereitet, dass sie ohne manuelle Eingriffe in den Quelltext in unterschiedlichen Kombinationen angewendet werden können. Damit sollte es für jeden möglich sein, sich nach dieser Anleitung eine auf seine Bedürfnisse zugeschnittene Patchvariante zu erstellen.
Grundvoraussetzungen
Zunächst benötigst du einige Tools rund ums Compilieren und Bauen von Debian-Paketen. Mit dem folgenden Kommando, werden diese "Essentials" installiert:
apt-get install dpkg-dev gcc g++ libc6-dev make patch fakeroot
Noch einfacher, geht das auch so:
apt-get install build-essential fakeroot
Es ist übrigens nicht erforderlich, die Pakete für VDR auch auf dem VDR-Rechner zu erzeugen. Dies kann genauso gut auch auf jedem anderen Rechner mit Debian-Woody geschehen.
Falls du ein vorbildlicher Linux-User sein willst, so möchtest du
sicher nicht als root die Pakete erstellen. Der Benutzer unter
dem du angemeldet bist, sollte in diesem Fall der Gruppe
src angehören. Ausserdem ist es dann erforderlich,
bestimmte Befehle wie z.B. dpkg-buildpackage oder debian/rules
(mehr dazu später) mit fakeroot auszuführen:
fakeroot dpkg-buildpackage .....
fakeroot debian/rules .....
Um neue Pakete zu installieren, kannst du dich mittels
su kurzfristig als root anmelden und dann mit
exit wieder abmelden. Alternativ kannst du jeden Befehl,
der root-Rechte erfordert, auch mittels sudo
<Befehl> ausführen. Letzteres setzt natürlich voraus,
dass du als Benutzer dazu berechtigt bist.
Installation der Quelltextpakete
Die Installation von Quelltextpaketen erfolgt, wie auch bei den
Binärpaketen, am einfachsten mittels apt-get, jedoch mit
dem Kommando source. Der einzige Unterschied ist, dass
abhängige Entwicklerpakete (z.B. mit den Headerdateien der verwendeten
Bibliotheken) nicht automatisch mit installiert werden. Hierfür ist
noch ein zweiter Aufruf mit dem Kommando build-dep notwendig:
apt-get source <paketname>
apt-get build-dep <paketname>
Ach und noch einen Unterschied gibt es: Die Quelltextpakete werden automatisch in das momentane Arbeitsverzeichnis heruntergeladen und entpackt. Um nicht den überblick zu verlieren, legst du also am besten vorher ein paar Unterverzeichnisse an. üblicher Weise sollten diese Verzeichnisse unterhalb von /usr/src/ liegen. Aus dem angelegten Verzeichnis heraus, brauchst du dann lediglich noch die Installation des entsprechenden Quelltextpaketes starten. Um z.B. die Quelltexte der Pakete vdr und vdr-plugin-mp3 zu installieren, kannst du wie folgt vorgehen:
mkdir /usr/src/vdr
mkdir /usr/src/vdr-plugin-mp3
cd /usr/src/vdr
apt-get source vdr
apt-get build-dep vdr
cd /usr/src/vdr-plugin-mp3
apt-get source vdr-plugin-mp3
apt-get build-dep vdr-plugin-mp3
Danach liegen im Verzeichnis /usr/src/vdr drei Dateien. Die Datei vdr_1.2.6.orig.tar.gz enthält die Upstream- Version 1.2.6 von VDR. Als Upstream-Version wird die originale "nicht- Debian-Version" des Entwicklers bezeichnet. vdr_1.2.6-7.diff.tar.gz enthält alle Änderungen, die notwendig sind, um aus der Upstream-Version ein Debian-Paket zu machen. Die dritte Datei, vdr_1.2.6- 7.dsc, enthält Informationen über das Paket, wie z.B. die zum Compilieren benötigten abhängigen Pakete. Neben dem Download dieser drei Dateien, wurden von apt-get source auch gleich die Upstream-Version in das Verzeichnis vdr-1.2.6 entpackt und die notwendigen änderungen aus dem diff-File darauf angewendet. Letzteres kannst du mit dem folgenden Befehl auch jederzeit manuell tun:
dpkg-source -x vdr_1.2.6-7.dsc
Da die Entwicklung der Pakete schneller voranschreitet als ich diese Anleitung aktuell halten kann, sind alle angegebenen Paketversionen natürlich durch die aktuelle Version zu ersetzen (statt 1.2.6-7 also z.B. 1.2.6-9).
Compilieren von Paketen
Jetzt wo die Quelltextpakete und die dazugehörigen Entwicklerpakete installiert sind, ist es an der Zeit zu testen, ob sich alles erwartungsgemäß compilieren lässt. Hierzu wechselst du in das entsprechende Quelltextverzeichnis (In unserem Beispiel wäre das /usr/src/vdr/vdr-1.2.6/) und rufst den folgenden Befehl auf:
debian/rules binary
debian/rules ist ein Makefile, welches in einem ersten Schritt das Makefile der eigentlichen Software aufruft um das Compilieren zu starten. In einem zweiten Schritt sucht debian/rules alle notwendigen Dateien zusammen und erstellt ein Debian-Paket im übergeordneten Verzeichnis (also /usr/src/vdr/), welches sofort installiert werden kann. Um den beim Compilieren entstandenen Unrat aufzuräumen, kannst du dann noch folgenden Befehl ausführen:
debian/rules clean
Das ganze lässt sich sogar noch vereinfachen, indem du statt der obigen zwei Befehle einfach folgendes aufrufst:
dpkg-buildpackage -tc
Damit wird aber nicht einfach nur "blind" ein Debian-Paket erzeugt. Zuvor prüft dpkg-buildpackage noch, ob alle Abhängigkeiten erfüllt sind. Ist dies nicht der Fall, hast du wahrscheinlich das apt-get build-dep vergessen (siehe oben). Sind alle Abhängigkeiten erfüllt, compiliert dpkg-buildpackage das Paket. Die Option - tc weist dpkg-buildpackage zudem an, hinterher gleich wieder aufzuräumen. Das fertige Binärpaket (*.deb) findest du zusammen mit einem neu erzeugten Quelltextpaket wiederum im übergeordneten Verzeichnis (/usr/src/vdr/).
dpkg-buildpackage versucht ausserdem, die erzeugten Sources und die Changes-Datei zu signieren, falls z.B. GnuPG installiert ist. Wenn du jedoch keinen GnuPG-Key erzeugt hast, kannst du mit den Optionen -uc -us das Signieren verhindern. (Besten Dank an Thomas für diesen Hinweis.)
VDR-Patches
Im Vergleich zum manuellen Patchen, wo man spätestens bei zwei oder mehr Patches nicht umhin kommt, selber in die Quelltexte einzugreifen, hat sich das Patchen in der neuen VDR-Version sehr vereinfacht. Dennoch musst du ein paar Dinge beachten:
** Nicht alle Patches lassen sich in jeder beliebigen Kombination
und Reihenfolge anwenden. Entsprechende Hinweise dazu, welcher
Patch sich mit welchem kreuzen lässt, sind in den Patch-Dateien
selbst und in der Patchliste zu finden.
** Die meisten Patches modifizieren VDR so stark, dass alle Plugins
für diese VDR-Version ebenfalls neu compiliert werden müssen. Wie
das gemacht wird, erkläre ich später noch im Detail.
Patches auswählen
Jeder einzelne Patch liegt im Verzeichnis debian/patches und trägt folgenden Namen:
<nn>_<patchname>.dpatch
<nn> ist dabei eine zweistellige Nummer, welche die Reihenfolge kennzeichnet, in der die Patches angewendet werden sollen. Welche Patches verwendet werden, kannst du in der Datei 00list festlegen. Hier sind alle Patches (ohne die .dpatch- Endung) aufgeführt. Zudem können Kommentare eingefügt werden, die durch ein vorangestelltes "#" gekennzeichnet sind. Um einen Patch zu aktivieren, oder zu deaktivieren, musst du also nur das vorangestellte "#" entfernen oder hinzufügen. Eine Patchliste, welche nur den Elchi und den ImprovedOSD-Patch aktiviert, würde z.B. so aussehen:
# to share one connection with several dvb cards
#10_sharelnb
# to allow channel editing with channels for analogtv-plugin
# (use this patch only, if you DON'T use the autopid-patch)
#12_analogtv
# to add submenus within the recording menu
#15_reccmdsubmenu125
# The Elchi AIO 3c patch for a nicer OSD:
20_elchiaio3c
# The Improved OSD patch, which extends the Elchi AIO patch:
21_improvedosd-3a
# The AC3overDVB patch for a outputting AC3 streams over the DVB card:
#25_ac3overdvb-0.2.4
# The AutoPID patch for automatic PID adjustment of channels:
# ( use this patch only, if you use the ac3overdvb-0.2.3 patch too !!! )
#30_autopid_ac3overdvb
# The AutoPID patch for automatic PID adjustment of channels:
# ( use this patch only, if you DON'T use the ac3overdvb-0.2.3 patch !!! )
#30_autopid
# to allow channel editing with channels for analogtv-plugin
# ( use this patch only, if you use one of the autopid-patches too !!!)
#32_analogtvautopid
# The Jump patch allows automatic jumping over cutting marks.
# It requires the following patches: elchiaio3c, ac3overdvb, autopid
#35_jumpplay-0.0
# to share one connection with several dvb cards
# ( use this patch only, if you use one of the autopid-patches too !!!)
#40_sharelnbautopid
Die Patches werden von debian/rules binary vor dem Compilieren automatisch
angewendet und mit einem debian/rules clean wieder
rückgängig gemacht. Die Patchliste sollte immer nur nach einem
debian/rules clean geändert werden, damit
sich die Quelltexte wieder in einem ungepatchten Zustand befinden,
bevor man etwas ändert. Alternativ kannst du auch, wie oben bereits
beschrieben, dpkg-buildpackage -tc verwenden.
Läuft beim Patchen etwas schief, weil du z.B. zwei Patches ausgewählt hast, die sich gegenseitig behindern, so befindet sich der Quelltext in einem undefinierten Patch-Zustand. Der zweite Patch konnte nur zum Teil angewendet werden und kann daher auch nicht so ohne weiteres rückgängig gemacht werden. In solch einem Fall solltest du das Quelltextpaket neu installieren, indem du folgendes ausführst:
dpkg-source -x vdr_1.2.6-7.dsc
Plugins neu compilieren
Die Patches nehmen auch änderungen an den Schnittstellen vor, welche von den VDR-Plugins verwendet werden. Daher ist es i.d.R. unerlässlich, nach änderung des Patchlevels auch die Plugins neu zu compilieren. Beim Starten von VDR lädt das init-Skript zudem nur die Plugins, die mit dem selben VDR-Patchlevel compiliert wurden, wie das installierte VDR. Zwar lässt sich dies umgehen, aber ich kann nur dazu raten, lieber alle Plugins neu zu compilieren. Fehler durch inkompatible Schnittstellen können so von vornherein ausgeschlossen werden.
Damit die Plugins mit dem richtigen VDR-Entwickler-Paket aus der neu erstellten Patchvariante compiliert werden, musst du dieses zunächst installieren. Das entsprechende Entwicklerpaket wurde beim Compilieren automatisch in /usr/src/vdr/ erzeugt. Mit folgendem Aufruf, kannst du es installieren:
dpkg -i vdr-dev_1.2.6-7.deb
Hierfür kann es wieder erforderlich sein, dass du dich zuerst als
root anmeldest (z.B. mit su) oder den Befehl mittels
sudo ausführst. Danach können alle Plugins mit
debian/rules binary oder dpkg-buildpackage
neu compiliert werden. In unserem Beispiel, wäre dies nur
vdr-plugin-mp3:
cd /usr/src/vdr-plugin-mp3/vdr-plugin-mp3-0.8.2
dpkg-buildpackage -tc
Ein lokales Repository anlegen
Um die Installation der neu erzeugten Pakete zu vereinfachen, bietet es sich an, ein eigenes kleines Repository zu erzeugen. Dieses kann dann in die sources.list eingetragen und von apt-get verwendet werden. Hierzu solltest du dir zunächst ein geeignetes Verzeichnis (z.B. /var/local/vdr-repository/) anlegen und dorthinein alle erzeugten .deb-Dateien legen. Zudem musst du in diesem Verzeichnis noch eine Datei Release** mit folgendem Inhalt anlegen:
Archive: stable
Component: main
Origin: Meins!
Label: Mein persönliches Debian repository
Architecture: i386
Um die Datei Packages.gz zu erzeugen rufst du dann noch den folgenden Befehl in deinem Repository-Verzeichnis auf:
dpkg-scanpackages ./ /dev/null | gzip -9c >Packages.gz
Das Repository-Verzeichnis kannst du dann über einen http- bzw. ftp-Server oder mittels des folgenden Eintrages in die sources.list direkt verfügbar machen:
deb file:/var/local/vdr-repository ./