Neues HOWTO, 11.Oktober 2007
Leider habe ich es nicht mehr geschafft, mit dem GCC-4.2 die .java-Files direkt zu compilieren, deshalb wird der Bytecode vom originalen Sun JDK erzeugt
Build-Abhängigkeiten:
- JDK (getestet mit Vesion 1.6.0_01)
- ProjectX Source 0.90.3.01 (lt. http://www.vdr-wiki.de/wiki/index.php/Burn-plugin kann die neuere zu Problemen führen)
- GCC 4.2.1 mit gcj und libgcj (getestet bisher auf Debian testing)
Runtime-Abhängigkeiten:
- libgcj
- zlib1g
- eventuell cairo, gtk, ...? (nicht direkt, aber über die libgcj -- noch zu testen auf einem LFS-System)
Vorgehensweise:
[list=1]
[*]Compiler-Optimierungen wählen, z.B. für einen Athlon64
(unbedingt auf den eigenen Prozessortyp anpassen!)
[*]ProjectX entpacken und build-script anpassen zum compilieren ohne GUI:
unzip ProjectX_Source_0.90.3.01.zip
cd ProjectX_Source_0.90.3.01
sed -i -e's:sources.lst:noguisources.lst:' build.sh
[*]Compilieren in Byte-Code:
[*]Libraries compilieren:
cd lib
gcj -c $GCJFLAGS -o jakarta-oro-2.0.8.o jakarta-oro-2.0.8.jar
gcj -c $GCJFLAGS -Ijakarta-oro-2.0.8.jar -o commons-net-1.3.0.o \
commons-net-1.3.0.jar
cd ..
[*]ProjectX compilieren und strippen:
gcj $GCJFLAGS -fno-bounds-check -fno-store-check -fjni -encoding \
"ISO-8859-1" --main=net.sourceforge.dvb.projectx.common.Start \
-Dawt.toolkit=gnu.java.awt.peer.headless.HeadlessToolkit \
-oprojectx -Ilib/commons-net-1.3.0.jar -Ilib/jakarta-oro-2.0.8.jar \
ProjectX.jar lib/jakarta-oro-2.0.8.o lib/commons-net-1.3.0.o
strip --strip-all projectx
[/list=1]
Hier noch ein bisher ungetesteter patch für das burn-plugin um die nativ compilierte Version von projectx zu verwenden:
#! /bin/sh /usr/share/dpatch/dpatch-run
## 20_native-projectx.dpatch by <fmp@palmen.homeip.net>
##
## All lines beginning with `## DP:' are a description of the patch.
## DP: No description.
@DPATCH@
diff -urNad burn-0.1.0-pre21~/vdrburn-dvd.sh burn-0.1.0-pre21/vdrburn-dvd.sh
--- burn-0.1.0-pre21~/vdrburn-dvd.sh 2006-08-27 20:34:30.000000000 +0200
+++ burn-0.1.0-pre21/vdrburn-dvd.sh 2007-10-11 12:18:26.498923641 +0200
@@ -75,9 +75,7 @@
CUT="-cut $MPEG_DATA_PATH/px.cut"
fi
- $JAVA_HOME/bin/java -Djava.awt.headless=true \
- -jar $PROJECTX_HOME/ProjectX.jar \
- -ini $CONFIG_PATH/ProjectX.ini \
+ projectx -ini $CONFIG_PATH/ProjectX.ini \
$CUT -id $USED_TRACKS,0x1f,0x20 \
-demux -out "$MPEG_DATA_PATH" -name vdrsync \
$(ls "$MPEG_TMP_PATH/convert/"[0-9][0-9][0-9].vdr)
Display More
--- Ab hier folgt eine ALTE Version für GCC-4.1.x ---
Hier mal eine Schritt für Schritt Anleitung, wie man sich projectx als optimierten native code compiliert.
[edit] ACHTUNG: Leider habe ich gerade einen unschönen Effekt entdeckt: Das Binary ist abhängig von GTK+ und einem laufenden X-Server. Für den Headless-Einsatz ist das natürlich sehr hässlich
Voraussetzungen:
- ProjectX Source 0.90.4
- GCC 4.1.x mit gcj und libgcj
getestet auf Debian testing mit GCC 4.1.1 und auf einem LFS System mit GCC 4.1.2
1. ProjectX entpacken und angehängten Patch einspielen
unzip ProjectX_Source_eng_0.90.4.00.zip
cd ProjectX_Source_0.90.4
patch -Np1 -i ../ProjectX_0.90-gcc-build-fixes.1.diff
Der Patch ergänzt ein paar explizite typecasts in einem source-file, die gcj unbedingt haben will.
2. Optimierungen setzen (das hängt natürlich vom Prozessortyp ab). Ich habe folgendes gemacht:
3. Mitgelieferte libraries compilieren
cd lib
gcj -c $GCJFLAGS -o jakarta-oro-2.0.8.o jakarta-oro-2.0.8.jar
gcj -c $GCJFLAGS -Ijakarta-oro-2.0.8.jar -o commons-net-1.3.0.o \
commons-net-1.3.0.jar
cd ..
4. ProjectX selbst compilieren
gcj -c $GCJFLAGS -fno-bounds-check -fno-store-check -fjni \
-encoding "ISO-8859-1" -Ilib/commons-net-1.3.0.jar \
-Ilib/jakarta-oro-2.0.8.jar -oprojectx.o @noguisources.lst
Die Flags schalten Exceptions für Fehler im Umgang mit Arrays aus. Sollte ProjectX tatsächlich einen solchen Fehler haben ist die Folge undefiniertes Verhalten anstatt einer aussagekräftigen Exception. Wer will kann die Flags natürlich auch weglassen.
5. Benötigte Resourcen
gcj -c -o ac3.o --resource ac3.bin resources/ac3.bin
gcj -c -o pjxresources_en.o --resource pjxresources_en.properties \
resources/pjxresources_en.properties
6. Linken
gcj $GCJFLAGS --main=net.sourceforge.dvb.projectx.common.Start -o projectx \
projectx.o ac3.o pjxresources_en.o \
lib/jakarta-oro-2.0.8.o lib/commons-net-1.3.0.o
Nach dieser Prozedur hat man ein dynamisch gegen libgcj gelinktes ca. 2.5 MB großes binary im aktuellen Verzeichnis. Durch strippen lässt es sich auf ca. 1.7 MB verkleinern:
Ich habe damit testweise eine VDR-Aufnahme mit einer Video-, einer AC3- und zwei mp2-Tonspuren demuxt, es hat anstandslos funktioniert
Grüße, Felix
PS: Eventuell lässt sich noch weiter optimieren indem man
- die verwendeten Libraries im Quellcode besorgt und ohne Umweg über Bytecode direkt mit gcj compiliert
- ProjectX in Teile zerlegt, die mit JNI compiliert werden müssen, und solche, für die man CNI verwenden kann