Différences entre versions de « Java »
imported>SylvainBeucler |
imported>SylvainBeucler |
||
(83 versions intermédiaires par le même utilisateur non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
− | + | Quel support Java libre aujourd'hui? | |
− | + | == État courant == | |
− | + | Jusqu'à 2007, Java était une technologie propriétaire de Sun. Il existe des paquets dans la section non-free de Debian. | |
− | Les distributions d'aujourd'hui (octobre 2007) proposent maintenant en standard la suite Java libre GIJ+GCJ+Classpath | + | Divers projects libres se sont créés pour réimplenter Java: |
+ | * JVM: Kaffe, GIJ (GNU Interpreter for Java) | ||
+ | * bibliothèques de fonctions: Classpath http://www.gnu.org/software/classpath/ | ||
+ | * environnement de compilation: GCJ - GNU Compiler for Java, ECJ - Eclipse Compiler for Java, Kopi... | ||
+ | Les distributions d'aujourd'hui (octobre 2007) proposent maintenant en standard la suite Java libre GIJ+GCJ+Classpath. | ||
Dans Debian: | Dans Debian: | ||
− | * java-gcj-compat: un remplacement pour le JDK de Sun. | + | * [http://packages.debian.org/java-gcj-compat java-gcj-compat]: un remplacement pour le JDK de Sun. |
− | * java-gcj-compat-plugin: un plugin pour Mozilla | + | * [http://packages.debian.org/java-gcj-compat-plugin java-gcj-compat-plugin]: un plugin pour Mozilla |
+ | |||
+ | En 2007 donc Sun a libéré le code source de Java, une technologie utilisée par de nombreux programmes (libres ou non). C'est l'OpenJDK. | ||
+ | Cependant il reste encore des parties propriétaires (''binary plugs''), mais des projets pour un Java 100% libre existent, notamment IcedTea. | ||
+ | |||
+ | == Introduction à IcedTea == | ||
+ | |||
+ | http://icedtea.classpath.org/ | ||
+ | |||
+ | IcedTea est un projet qui combine l'OpenJDK avec GCJ+Classpath pour obtenir un JDK 100% libre. Il fournit également un système de compilation à base d'Autoconf. | ||
+ | |||
+ | Il y a deux grandes versions: | ||
+ | * IcedTea 6: travaille sur OpenJDK 6, proche de version stable de Java (depuis début 2008, actif 3/2008) | ||
+ | * IcedTea 1.x: travaille sur OpenJDK 7, qui est la version de développpement de Java (depuis 2007, en pause 3/2008) | ||
+ | |||
+ | Il commence à être présent dans les distributions. | ||
+ | * Fedora 8: http://fedoraproject.org/wiki/Features/IcedTea | ||
+ | * Mandriva 2008.1: http://sophie.zarb.org/srpm/cooker/java-1.7.0-icedtea | ||
+ | * Ubuntu Gutsy: http://packages.ubuntu.com/gutsy/interpreters/icedtea-java7-jre | ||
+ | |||
+ | Il est également fortement lié à RedHat, donc le travail est plutôt disponible autour de Fedora. Une personne @ubuntu.com travaille également sur le projet. | ||
+ | |||
+ | === Le plugin web === | ||
+ | |||
+ | Essayé sous Lenny après avoir compilé IcedTea: | ||
+ | ln -s `pwd`/openjdk/control/build/linux-i586/j2re-image/lib/i386/gcjwebplugin.so ~/.mozilla/plugins/ | ||
+ | Redémarrez Firefox (ou Mozilla, Iceweasel, etc.) - c'est tout :) | ||
+ | |||
+ | == Compilation: principes == | ||
+ | |||
+ | La compilation de ce projet n'est pas évidente, car elle utilise des bibliothèques souvent récentes ou non officielle. | ||
+ | |||
+ | Notez que vous devez avoir accès à Internet: l'archive IcedTea est de petite taille, mais récupère une version de l'OpenJDK chez Sun durant la compilation, d'environ 90Mo comprimés, soit par HTTP, soit par Mercurial selon les versions. | ||
+ | |||
+ | Prévoir aussi de l'espace disque: entre 3 et 4 gigaoctets de produits de compilation, avec un JRE (Java Runtime Environment) de l'ordre de 300Mo. | ||
− | + | === Prérequis: mercurial === | |
− | + | Utilisé: | |
+ | * Soit pour récupérer une version de IcedTea6 | ||
+ | * Soit pour le rappatriement dynamique d'OpenJDK dans IcedTea7 | ||
− | + | Sous Debian Etch: | |
+ | # First install with Etch dependencies | ||
+ | aptitude install mercurial | ||
+ | # then upgrade mercurial to backports.org version | ||
+ | aptitude install -t etch-backports mercurial | ||
− | + | La commande mercurial est nommée <code>hg</code>. | |
− | Pour compiler IcedTea, il faut IcedTea (cf. [http://article.gmane.org/gmane.comp.java.openjdk.distro-packaging.devel/291], b21 est le nom de la version de septembre de l'OpenJDK). Comment | + | === Prérequis IcedTea7: forest === |
− | * Soit on peut utiliser | + | |
+ | La compilation nécessite l'extension 'forest' de Mercurial. Pourquoi? Pour aller chercher OpenJDK dans le dépôt mercurial, plutôt que via une tarball. | ||
+ | Soit: | ||
+ | #hg clone http://www.terminus.org/hg/hgforest hgforest # ancienne URL | ||
+ | hg clone http://hg.akoha.org/hgforest/ hgforest | ||
+ | mkdir ~/.hgext | ||
+ | cp hgforest/forest.py ~/.hgext | ||
+ | cat <<EOF >> ~/.hgrc | ||
+ | [extensions] | ||
+ | hgext.forest = ~/.hgext/forest.py | ||
+ | EOF | ||
+ | |||
+ | === Prérequis: environnement Java 1.5 === | ||
+ | |||
+ | Il faut effectivement Java pour compiler Java! | ||
+ | |||
+ | IcedTea est prévu pour fonctionner avec GCC 4.3 (ou 4.2 + rétroportage ''generics'' de RedHat), qui fournit GIJ et Classpath, plus ECJ pour le compilateur. | ||
+ | |||
+ | Autre solutions (pas testées): | ||
+ | * utilise la machine virtuelle Cacao et le dernier Classpath | ||
+ | * installer une version propriétaire de Java, de l'utiliser pour compiler IcedTea, puis de la désinstaller. Après ça, pour faire propre, vous pouvez recompiler IcedTea avec IcedTea :) | ||
+ | |||
+ | |||
+ | == Compilation IcedTea6 sous Debian Etch (3/2008) == | ||
+ | |||
+ | === Prérequis - recompiler GCC 4.3 === | ||
+ | |||
+ | La version 4.3 inclut le support Java 1.5, nécessaire pour compiler IcedTea. | ||
+ | |||
+ | On compile ici à la main, voir si un backport de Lenny ne serait pas plus simple (probablement pas, le packaging est relativement velu). | ||
+ | |||
+ | Prévoir de la place: | ||
+ | $ ls -lh gcc-4.3.0.tar.bz2 | ||
+ | -rw-r--r-- 1 sylvain src 57M 2008-03-18 18:05 gcc-4.3.0.tar.bz2 | ||
+ | $ du -sh gcc-4.3.0/ # non compilé | ||
+ | 511M gcc-4.3.0/ | ||
+ | $ du -sh gcc-4.3.0/ # compilé | ||
+ | 1,7G gcc-4.3.0/ | ||
+ | |||
+ | Dépendances: | ||
+ | * bison: OK | ||
+ | * GMP 4.1+: OK (<code>apt-cache policy libgmp3-dev</code> => <code>4.2.1</code>) | ||
+ | * MPFR 2.3.0+: KO, backport nécessaire | ||
+ | |||
+ | Backport mpfr: | ||
+ | aptitude --assume-yes install pbuilder cowdancer | ||
+ | aptitude --assume-yes install apt-src | ||
+ | apt-get --assume-yes install fakeroot sudo | ||
+ | cowbuilder --create --distribution=etch | ||
+ | echo "deb-src http://ftp.fr.debian.org/debian/ lenny main" >> /etc/apt/sources.list | ||
+ | aptitude update | ||
+ | cd /usr/src/ | ||
+ | apt-src install mpfr | ||
+ | pushd mpfr-2.3.1.dfsg.1/ | ||
+ | yes | dch -D etch-backports \ | ||
+ | --newversion $(dpkg-parsechangelog | sed -ne 's,^Version: ,,p')~bpo40+1 \ | ||
+ | --force-bad-version -- \ | ||
+ | "Rebuild for Debian Backports <http://www.backports.org/>" | ||
+ | pdebuild --pbuilder cowbuilder | ||
+ | popd | ||
+ | aptitude purge libmpfr1 | ||
+ | dpkg -i /var/cache/pbuilder/result/libmpfr*.deb | ||
+ | |||
+ | Compilation proprement dite: | ||
+ | apt-get --assume-yes install bzip2 | ||
+ | apt-get --assume-yes install bison unzip | ||
+ | wget ftp://ftp.irisa.fr/pub/mirrors/gcc.gnu.org/gcc/releases/gcc-4.3.0/gcc-4.3.0.tar.bz2 | ||
+ | tar xjf gcc-4.3.0.tar.bz2 | ||
+ | pushd gcc-4.3.0 | ||
+ | mkdir builddir | ||
+ | cd builddir/ | ||
+ | ../configure --prefix=/opt/gcc-4.3.0 --enable-languages=java | ||
+ | make | ||
+ | make install | ||
+ | popd | ||
+ | |||
+ | Résultat (au bout de 2-3h): | ||
+ | |||
+ | # /opt/gcc-4.3.0/bin/gij -version | ||
+ | java version "1.5.0" | ||
+ | gij (GNU libgcj) version 4.3.0 | ||
+ | |||
+ | Gagné! | ||
+ | |||
+ | === Prérequis: backporter FreeType === | ||
+ | |||
+ | Cf. [[Backport_FreeType]]. | ||
+ | |||
+ | # Setup pbuilder and add Lenny source list as shown in [[#Pr.C3.A9requis_-_recompiler_GCC_4.3]] | ||
+ | cd /usr/src | ||
+ | apr-src install libfreetype6 | ||
+ | yes | dch -D etch-backports \ | ||
+ | --newversion $(dpkg-parsechangelog | sed -ne 's,^Version: ,,p')~bpo40+1 \ | ||
+ | --force-bad-version -- \ | ||
+ | "Rebuild for Debian Backports <http://www.backports.org/>" | ||
+ | pdebuild --pbuilder cowbuilder | ||
+ | |||
+ | (cd /var/cache/pbuilder/result/ && \ | ||
+ | dpkg -i libfreetype6-dev_2.3.5-1~bpo40+1_i386.deb \ | ||
+ | libfreetype6_2.3.5-1~bpo40+1_i386.deb) | ||
+ | |||
+ | === Dépendances en paquets === | ||
+ | |||
+ | * ant => ant | ||
+ | * ecj => ecj-bootstrap-gcj (Lenny: ecj-gcj) | ||
+ | * cups-devel => libcupsys2-dev | ||
+ | * libXt-devel => libxt-dev | ||
+ | * libXp-devel => libxp-dev | ||
+ | * lesstif-devel => lesstif2-dev | ||
+ | * alsa-lib-devel => libasound2-dev | ||
+ | * libXtst-devel => libxtst-dev | ||
+ | * ''plugin support headers and libraries'' => iceape-dev | ||
+ | * gtk+-2.0 gthread-2.0 => libgtk2.0-dev | ||
+ | * gdk-pixbuf-2.0 => libgdk-pixbuf-dev (optional?) | ||
+ | * giflib-devel => libungif4-dev | libgif-dev | ||
+ | * libjpeg-devel => libjpeg-dev | ||
+ | * freetype => libfreetype6-dev | ||
+ | * xalan2 => libxalan2-java | ||
+ | * unzip | ||
+ | * gawk | ||
+ | |||
+ | On utilisera apt-get plutôt qu'aptitude, de manière à ce que les paquets soient tous considérés comme installés automatiquement, et facilement supprimables après coup. | ||
+ | |||
+ | Soit: | ||
+ | apt-get install --assume-yes ant \ | ||
+ | libcupsys2-dev libxt-dev libxp-dev lesstif2-dev libasound2-dev libxtst-dev iceape-dev libgtk2.0-dev libgdk-pixbuf-dev \ | ||
+ | libungif4-dev libjpeg-dev libxalan2-java unzip gawk | ||
+ | apt-get install --assume-yes ecj-bootstrap-gcj | ||
+ | |||
+ | === Environnement Java 1.5 === | ||
+ | |||
+ | Il faut installer le petit paquet java-gcj-compat à la main pour pointer sur l'installation locale de GCC 4.3: | ||
+ | wget ftp://sources.redhat.com/pub/rhug/java-gcj-compat-1.0.77.tar.gz | ||
+ | tar xzf java-gcj-compat-1.0.77.tar.gz | ||
+ | cd java-gcj-compat-1.0.77/ | ||
+ | ./configure --prefix=/opt/gcc-4.3.0 | ||
+ | make install | ||
+ | ll /usr/bin/ecj /opt/gcc-4.3.0/lib/jvm/java-1.5.0-gcj-1.5.0.0/bin | ||
+ | ln -fs ../../../../bin/gjar /opt/gcc-4.3.0/lib/jvm/java-1.5.0-gcj-1.5.0.0/bin/jar | ||
+ | # TODO: pourquoi ceci n'est-il pas fait automatiquement? | ||
+ | cp -a /opt/gcc-4.3.0/lib/gcj-4.3.0-9/* /opt/gcc-4.3.0/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre/lib/i386/ | ||
+ | cp -a /opt/gcc-4.3.0/lib/gcc/i686-pc-linux-gnu/4.3.0/include/* /opt/gcc-4.3.0/lib/jvm/java-1.5.0-gcj-1.5.0.0/include/ | ||
+ | |||
+ | Cela permet de définir un jeu de liens symboliques qu'IcedTea reconnait. | ||
+ | |||
+ | === Téléchargement === | ||
+ | |||
+ | hg clone http://icedtea.classpath.org/hg/icedtea6 | ||
+ | |||
+ | === Configuration === | ||
+ | |||
+ | unset JAVA_HOME | ||
+ | ./configure \ | ||
+ | --with-libgcj-jar=/opt/gcc-4.3.0/share/java/libgcj-4.3.0.jar \ | ||
+ | --with-gcj-home=/opt/gcc-4.3.0/lib/jvm/java-1.5.0-gcj-1.5.0.0 \ | ||
+ | --with-java=/opt/gcc-4.3.0/bin/java --with-jar=/opt/gcc-4.3.0/bin/jar \ | ||
+ | --with-rmic=/opt/gcc-4.3.0/bin/rmic --with-javah=/opt/gcc-4.3.0/bin/javah | ||
+ | |||
+ | Corriger le problème <code>undefined reference to `___tls_get_addr'</code> (cf. [[#Compilation_statique_de_libstdc.2B.2B]]) | ||
+ | <pre> | ||
+ | cat <<EOF | patch /usr/lib/libc.so | ||
+ | --- /usr/lib/libc.so-dist 2008-03-28 22:02:33.000000000 +0100 | ||
+ | +++ /usr/lib/libc.so 2008-03-28 22:02:49.000000000 +0100 | ||
+ | @@ -2,4 +2,4 @@ | ||
+ | Use the shared library, but some functions are only in | ||
+ | the static library, so try that secondarily. */ | ||
+ | OUTPUT_FORMAT(elf32-i386) | ||
+ | -GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a ) | ||
+ | +GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a AS_NEEDED ( /lib/ld-linux.so.2 ) ) | ||
+ | EOF | ||
+ | </pre> | ||
+ | |||
+ | On peut utiliser l'option suivante for une compilation plus rapide, en particulier avant d'avoir toutes les options et dépendences de compilation bien au point: | ||
+ | --enable-fast-build optimize for quick building: use -O0 and do not build documentation | ||
+ | |||
+ | === Compilation === | ||
+ | |||
+ | make | ||
+ | |||
+ | Vous en avez probablement pour 2-3h avant de voir enfin s'afficher: | ||
+ | IcedTea is served: openjdk/control/build/linux-i586 | ||
+ | |||
+ | === Prérequis: backporter zlib === | ||
+ | |||
+ | En essayant d'accéder à une base de données HSQLDB dans OpenOffice.org, la JVM plante [http://icedtea.classpath.org/bugzilla/show_bug.cgi?id=124]. | ||
+ | |||
+ | Cela est apparemment dû à un problème dans zlib. Il faut la backporter. Pour simplifier le backport (notamment, supprimer la dépendance à gcc-multilib apparu dans Lenny, et les erreurs <code>/usr/bin/ld: cannot find -lgcc_s</code>), on ne compile pas pour l'architecture 64bit: | ||
+ | |||
+ | <pre> | ||
+ | diff -ur zlib-1.2.3.3.dfsg/debian/control zlib-1.2.3.3.dfsg.beuc/debian/control | ||
+ | --- zlib-1.2.3.3.dfsg/debian/control 2008-03-21 11:52:40.000000000 +0100 | ||
+ | +++ zlib-1.2.3.3.dfsg.beuc/debian/control 2008-03-21 11:15:32.000000000 +0100 | ||
+ | @@ -4,7 +4,7 @@ | ||
+ | Maintainer: Mark Brown <broonie@debian.org> | ||
+ | Standards-Version: 3.7.3 | ||
+ | XS-VCS-Bzr: http://bzr.debian.org/bzr/pkg-zlib/zlib/debian | ||
+ | -Build-Depends: debhelper (>= 5), quilt, gcc-multilib [amd64 i386 kfreebsd-amd64 powerpc ppc64 s390 sparc] | ||
+ | +Build-Depends: debhelper (>= 5), quilt | ||
+ | |||
+ | Package: zlib1g | ||
+ | Architecture: any | ||
+ | @@ -57,26 +57,6 @@ | ||
+ | in gzip and PKZIP. This minimal package includes the shared library | ||
+ | for use with the Debian installer. | ||
+ | |||
+ | -Package: lib64z1 | ||
+ | -Architecture: sparc s390 i386 powerpc | ||
+ | -Depends: ${shlibs:Depends} | ||
+ | -Replaces: amd64-libs (<< 1.4) | ||
+ | -Description: compression library - 64 bit runtime | ||
+ | - zlib is a library implementing the deflate compression method found | ||
+ | - in gzip and PKZIP. This package includes a 64 bit version of the | ||
+ | - shared library. | ||
+ | - | ||
+ | -Package: lib64z1-dev | ||
+ | -Section: libdevel | ||
+ | -Architecture: sparc s390 i386 powerpc | ||
+ | -Depends: lib64z1 (= ${binary:Version}), zlib1g-dev (= ${binary:Version}), lib64c-dev | ||
+ | -Replaces: amd64-libs-dev (<< 1.4) | ||
+ | -Provides: lib64z-dev | ||
+ | -Description: compression library - 64 bit development | ||
+ | - zlib is a library implementing the deflate compression method found | ||
+ | - in gzip and PKZIP. This package includes the development support | ||
+ | - files for building 64 bit applications. | ||
+ | - | ||
+ | Package: lib32z1 | ||
+ | Architecture: amd64 ppc64 kfreebsd-amd64 | ||
+ | Depends: ${shlibs:Depends} | ||
+ | diff -ur zlib-1.2.3.3.dfsg/debian/rules zlib-1.2.3.3.dfsg.beuc/debian/rules | ||
+ | --- zlib-1.2.3.3.dfsg/debian/rules 2008-03-21 11:52:40.000000000 +0100 | ||
+ | +++ zlib-1.2.3.3.dfsg.beuc/debian/rules 2008-03-21 11:09:23.000000000 +0100 | ||
+ | @@ -34,7 +34,7 @@ | ||
+ | CFLAGS += -O3 | ||
+ | endif | ||
+ | |||
+ | -64-ARCHS=s390 sparc i386 powerpc | ||
+ | +64-ARCHS=s390 sparc powerpc | ||
+ | ifneq (,$(findstring $(DEB_HOST_ARCH), $(64-ARCHS))) | ||
+ | EXTRA_INSTALL=install64 | ||
+ | EXTRA_BUILD=build64-stamp | ||
+ | </pre> | ||
+ | |||
+ | Placez ce patch dans <code>/usr/src/zlib-diff</code>. | ||
+ | |||
+ | apt-src install zlib | ||
+ | cd zlib-1.2.3.3.dfsg/ | ||
+ | patch -p1 < ../zlib-diff | ||
+ | yes | dch -D etch-backports \ | ||
+ | --newversion $(dpkg-parsechangelog | sed -ne 's,^Version: ,,p')~bpo40+1 \ | ||
+ | --force-bad-version -- \ | ||
+ | "Rebuild for Debian Backports <http://www.backports.org/>" | ||
+ | pdebuild --pbuilder cowbuilder | ||
+ | dpkg -i /var/cache/pbuilder/result/zlib1g_1.2.3.3.dfsg-11~bpo40+1_i386.deb | ||
+ | |||
+ | OpenOffice.org fonctionne correctement à présent! | ||
+ | |||
+ | === Créer un paquet binaire Debian === | ||
+ | |||
+ | On peut créer un paquet Debian à la mimine (pas un paquet source traditionnel, parce qu'il faudrait backporter GCC 4.3 proprement), directement avec <code>dpkg -b</code>: | ||
+ | <pre> | ||
+ | cd /usr/src/icedtea6/ | ||
+ | |||
+ | path=openjdk/control/build/linux-i586/j2re-image | ||
+ | shlib=$(find $path -type f -perm -a+x | xargs -r dpkg-shlibdeps -O 2>/dev/null | sed 's/^shlibs:Depends=//') | ||
+ | date=$(php -r "print strftime('%Y%m%d', strtotime('$(hg log -l1 | sed -ne 's/date: //p')'));") | ||
+ | |||
+ | mkdir DEBS | ||
+ | mkdir -p tmp/usr/lib/jvm | ||
+ | mkdir -p tmp/DEBIAN | ||
+ | chmod g-s tmp/DEBIAN | ||
+ | cp -al $path tmp/usr/lib/jvm/java-6-openjdk | ||
+ | |||
+ | cat <<EOF > tmp/DEBIAN/control | ||
+ | Package: openjdk-6-jre | ||
+ | Version: 6.$date | ||
+ | Maintainer: Sylvain Beucler <beuc@beuc.net> | ||
+ | Architecture: i386 | ||
+ | Depends: $shlib | ||
+ | Description: OpenJDK Java runtime | ||
+ | The packages are built using the IcedTea build support and patches from the IcedTea project. | ||
+ | . | ||
+ | Homepage: http://icedtea.classpath.org/ | ||
+ | EOF | ||
+ | |||
+ | dpkg -b tmp/ DEBS/ | ||
+ | rm -rf tmp/ | ||
+ | </pre> | ||
+ | |||
+ | $ ls -lh DEBS/ | ||
+ | total 126M | ||
+ | -rw-r--r-- 1 sylvain src 126M 2008-03-28 19:40 openjdk-6-jre_6.20080317_i386.deb | ||
+ | |||
+ | J'ai emprunté les conventions de nommage, les emplacements et les descriptions [http://packages.ubuntu.com/hardy/openjdk-6-jre ici]. | ||
+ | |||
+ | == Compilation IcedTea7 sous Debian Etch (3/2008) == | ||
+ | |||
+ | Même principe que pour IcedTea6. N'oubliez pas d'installer le plug-in Mercurial 'forest' comme expliqué plus haut. | ||
+ | |||
+ | wget http://icedtea.classpath.org/download/source/icedtea-1.6.tar.gz | ||
+ | tar xzf icedtea-1.6.tar.gz | ||
+ | cd icedtea-1.6/ | ||
+ | .configure --with-... | ||
+ | |||
+ | == Compilation IcedTea6 sous Debian Lenny (3/2008) == | ||
+ | |||
+ | Toutes les dépendances sont présentes dans le système. On utilise GCJ-4.3/java-gcj-compat-dev pour la phase d'amorçage. Il faut juste penser à spécifier <code>gjar</code> à la place de <code>fastjar</code> (qui n'a pas l'option <code>-J</code>): | ||
+ | |||
+ | unset JAVA_HOME | ||
+ | apt-get install --assume-yes ant \ | ||
+ | libcupsys2-dev libxt-dev libxp-dev lesstif2-dev libasound2-dev libxtst-dev iceape-dev libgtk2.0-dev libgdk-pixbuf-dev \ | ||
+ | libungif4-dev libjpeg-dev libxalan2-java libfreetype6-dev unzip gawk | ||
+ | apt-get install --assume-yes java-gcj-compat-dev | ||
+ | |||
+ | ./configure --with-jar=gjar-4.3 | ||
+ | make | ||
+ | |||
+ | == Compilation IcedTea7 1.4- sous Debian Lenny (10/2007) == | ||
+ | |||
+ | Pour 1.4 < 10-2007: | ||
+ | * un OpenJDK existant | ||
+ | |||
+ | On y va, on commence par icedtea-1.4-f2364...: | ||
+ | aptitude install ecj-bootstrap-gcj java-gcj-compat-dev | ||
+ | aptitude install libcupsys2-dev libxt-dev libxp-dev lesstif2-dev libasound2-dev libxtst-dev iceape-dev libgtk2.0-dev | ||
+ | ./configure --with-libgcj-jar=/usr/share/java/libgcj-4.2.jar | ||
+ | make | ||
+ | |||
+ | Résultat des courses: au bout d'une petit heure j'ai: | ||
+ | cc1plus: warnings being treated as errors | ||
+ | suivi d'une série d'avertissements identiques: | ||
+ | /mnt/h/icedtea/icedtea-1.4/openjdk-ecj/hotspot/src/os/linux/vm/jvm_linux.cpp:182: warning: deprecated conversion from string constant to 'char*' | ||
+ | et arrêt de la compilation. QUI EST LE FOUTU CRÉTIN QUI A DEMANDÉ DE TRAITER LES AVERTISSEMENTS COMME DES ERREURS, NOM DE NOM?? | ||
+ | Note: je ne me souviens plus avec quoi j'avais testé, mais ça vaudrait le coup de réessayer avec g++3, car la version 4 est nettement plus stricte. | ||
+ | |||
+ | sed -i -e 's/WARNINGS_ARE_ERRORS = .*/WARNINGS_ARE_ERRORS = /' \ | ||
+ | ./openjdk/hotspot/build/linux/makefiles/gcc.make \ | ||
+ | ./openjdk-ecj/hotspot/build/linux/makefiles/gcc.make | ||
+ | make | ||
+ | |||
+ | et enfin: | ||
+ | IcedTea is served: openjdk/control/build/linux-i586 | ||
+ | |||
+ | |||
+ | == Erreurs et résolutions == | ||
+ | |||
+ | === Téléchargement Mercurial === | ||
+ | |||
+ | Il arrive que mercurial ait des soucis pendant le rappatriement d'OpenJDK: | ||
+ | ... | ||
+ | [jdk] | ||
+ | requesting all changes | ||
+ | adding changesets | ||
+ | adding manifests | ||
+ | adding file changes | ||
+ | transaction abort! | ||
+ | rollback completed | ||
+ | abort: consistency error adding group! | ||
+ | make: *** [stamps/clone.stamp] Erreur 255 | ||
+ | |||
+ | Rien de méchant, votre configuration n'est pas de problème, c'est en fait normal. Il suffit de recommencer: | ||
+ | make | ||
+ | |||
+ | === Compilation statique de libstdc++ === | ||
+ | |||
+ | <pre> | ||
+ | /usr/lib/gcc/i486-linux-gnu/4.1.2/libstdc++.a(eh_globals.o): In function `__gnu_internal::get_global()': | ||
+ | (.text._ZN14__gnu_internal10get_globalEv+0x17): undefined reference to `___tls_get_addr' | ||
+ | collect2: ld returned 1 exit status | ||
+ | </pre> | ||
+ | |||
+ | Le problème est l'utilisation de '-Wl,-Bstatic' devant '-lstdc++'. | ||
+ | |||
+ | Solution de contournement: | ||
+ | find -name "Makefile" -o -name "*.gmk" -o -name "*.make" \ | ||
+ | | xargs sed -i -e 's/STATIC_CXX \+= \+true/STATIC_CXX = false/' | ||
+ | |||
+ | Cf. http://icedtea.classpath.org/bugzilla/show_bug.cgi?id=123 | ||
+ | |||
+ | Autre solution: http://www.advogato.org/person/twisti/diary/9.html | ||
+ | <pre> | ||
+ | cat <<EOF | patch /usr/lib/libc.so | ||
+ | --- /usr/lib/libc.so-dist 2008-03-28 22:02:33.000000000 +0100 | ||
+ | +++ /usr/lib/libc.so 2008-03-28 22:02:49.000000000 +0100 | ||
+ | @@ -2,4 +2,4 @@ | ||
+ | Use the shared library, but some functions are only in | ||
+ | the static library, so try that secondarily. */ | ||
+ | OUTPUT_FORMAT(elf32-i386) | ||
+ | -GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a ) | ||
+ | +GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a AS_NEEDED ( /lib/ld-linux.so.2 ) ) | ||
+ | </pre> | ||
+ | |||
+ | === libjvm === | ||
+ | |||
+ | <pre> | ||
+ | /usr/bin/ld: cannot find -ljvm | ||
+ | collect2: ld returned 1 exit status | ||
+ | </pre> | ||
+ | |||
+ | Cela se produit en utilisant une version locale de GCC 4.3. Il faut manuellement copier les fichiers de bibliothèque au bon endroit: | ||
+ | cp -a /opt/gcc-4.3.0/lib/gcj-4.3.0-9/* /opt/gcc-4.3.0/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre/lib/i386/ | ||
+ | |||
+ | Il est curieux que ce ne soit pas fait automatiquement. Des idées là-dessus? | ||
+ | |||
+ | === zlib === | ||
+ | |||
+ | Avec la zlib de Etch (1.2.3), OpenOffice.org plante [http://icedtea.classpath.org/bugzilla/show_bug.cgi?id=124]. Le log d'IcedTea indique: | ||
+ | ... | ||
+ | Stack: [0xbfc32000,0xbfc82000], sp=0xbfc7f0e0, free space=308k | ||
+ | Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) | ||
+ | C [libz.so.1+0x6f6a] | ||
+ | C [libz.so.1+0x5f40] deflate+0x170 | ||
+ | C [libzip.so+0x2411] Java_java_util_zip_Deflater_deflateBytes+0x171 | ||
+ | v ~BufferBlob::Interpreter | ||
+ | ... | ||
+ | |||
+ | Solution: backporter 1.2.3.3 (cf. ci-dessus). | ||
+ | |||
+ | == Autres essais et notes == | ||
+ | |||
+ | === Sans amorçage ECJ === | ||
+ | |||
+ | À un moment donné (fin 2007), IcedTea nécessitait IcedTea (cf. [http://article.gmane.org/gmane.comp.java.openjdk.distro-packaging.devel/291], b21 est le nom de la version de septembre de l'OpenJDK), sans possibilité d'amorçage (''bootstrap'') avec ECJ. Comment faire alors? | ||
+ | * Soit on peut utiliser des paquets précompilés si la distribution utilisée le propose | ||
* Soit on compile un version de IcedTea antérieure à fin septembre 2007 (la [http://icedtea.classpath.org/download/source/icedtea-1.4-f23640f520cf248e08d731f91fed62ed14e97b2f.tar.gz 1.4-f236...] par exemple), puis on compile la dernière version d'IcedTea. | * Soit on compile un version de IcedTea antérieure à fin septembre 2007 (la [http://icedtea.classpath.org/download/source/icedtea-1.4-f23640f520cf248e08d731f91fed62ed14e97b2f.tar.gz 1.4-f236...] par exemple), puis on compile la dernière version d'IcedTea. | ||
− | + | L'amorçage ECJ est de nouveau disponible (début 2008). | |
− | === Compilation | + | === Compilation IcedTea7 1.4- sous Fedora 7 (10/2007) === |
− | La page des [http://icedtea.classpath.org/wiki/BuildRequirements dépendences] propose de rapatrier une longue liste de dépendances depuis le dépôt "développement" (<code>yum --enablerepo=development</code>). Sur Fedora 7, on va se contenter de les installer depuis le dépôt par défaut. | + | La page des [http://icedtea.classpath.org/wiki/BuildRequirements dépendences] propose de rapatrier une longue liste de dépendances depuis le dépôt "développement" (<code>yum --enablerepo=development</code>). Sur Fedora 7, on va se contenter de les installer depuis le dépôt par défaut (mettre à jour le système avant, j'ai eu une erreur de dépendances <code>Unresolveable requirement gecko-libs = 1.8.1.5 for yelp</code>). |
− | yum install /usr/bin/ecj | + | yum install /usr/bin/ecj cups-devel lesstif-devel libXp-devel libXtst-devel libXi-devel \ |
xalan-j2 xerces-j2 libXt-devel libgcj freetype-devel gcc gcc-c++ wget java-1.5.0-gcj-devel \ | xalan-j2 xerces-j2 libXt-devel libgcj freetype-devel gcc gcc-c++ wget java-1.5.0-gcj-devel \ | ||
alsa-lib-devel firefox-devel glib2-devel gtk2-devel ant libXinerama-devel | alsa-lib-devel firefox-devel glib2-devel gtk2-devel ant libXinerama-devel | ||
− | + | Puis une compilation classique: | |
− | |||
cd /usr/src/ | cd /usr/src/ | ||
wget http://icedtea.classpath.org/download/source/icedtea-1.4-f23640f520cf248e08d731f91fed62ed14e97b2f.tar.gz | wget http://icedtea.classpath.org/download/source/icedtea-1.4-f23640f520cf248e08d731f91fed62ed14e97b2f.tar.gz | ||
Ligne 44 : | Ligne 509 : | ||
IcedTea is served: openjdk/control/build/linux-i586 | IcedTea is served: openjdk/control/build/linux-i586 | ||
− | === Compilation | + | === Compilation IcedTea7 1.4 sous Fedora 7 (10/2007) === |
On compile maintenant le nouveau IcedTea à l'aide du précédent: | On compile maintenant le nouveau IcedTea à l'aide du précédent: | ||
Ligne 54 : | Ligne 519 : | ||
make | make | ||
− | (en | + | Là j'ai des erreurs bizarres. D'abord deux avertissements, peut-être pas anodins: |
+ | WARNING: The version of ant being used is older than | ||
+ | the required version of '1.6'. | ||
+ | The version of ant found was ''. | ||
+ | |||
+ | WARNING: The version of findbugs being used is older than | ||
+ | the required version of '1.1'. | ||
+ | The version of findbugs found was ''. | ||
+ | |||
+ | Sanity check passed. | ||
+ | |||
+ | Puis surtout: | ||
+ | BUILD FAILED | ||
+ | /usr/src/icedtea/openjdk/langtools/make/build.xml:315: The following error occurred while executing this line: | ||
+ | /usr/src/icedtea/openjdk/langtools/make/build.xml:657: bootstrap java is not installed in /usr/src/icedtea/bootstrap/jdk1.6.0 | ||
+ | |||
+ | Curieux... | ||
+ | |||
+ | |||
+ | On réessaie plus tard avec la release du 12 octobre, ça passe mieux, mais au bout d'une heure et demi: | ||
+ | make[5]: Leaving directory `/usr/src/icedtea-1.4/openjdk/control/build/linux-i586/hotspot/outputdir/linux_i486_compiler2/product' | ||
+ | cd linux_i486_compiler2/product && ./test_gamma | ||
+ | There was an error trying to initialize the HPI library. | ||
+ | Could not create the Java virtual machine. | ||
+ | |||
+ | Une rapide recherche montre qu'il s'agit d'une "vraie" erreur Java, autrement dit une insulte d'OpenJDK en personne (et non pas de GCJ ou autre). Apparemment cela peut arriver quand 2 JDKs sont en conflicts, ce qui est probablement le cas ici. Je n'ai pas le début d'une piste de correction donc ça va probablement rester comme ça jusqu'à la prochaine release... | ||
+ | |||
+ | === Dépendance à GCC 4.3 === | ||
+ | |||
+ | Avant la version 4.3, il fallait utiliser un rétroportage non-officiel de RedHat ("with generics"). Cette branche était d'ailleurs souvent utilisée dans les paquets officiels des distributions, qui étaient alors plus "récent" que les versions officielles de GCC -- un non-sens complet. | ||
+ | |||
+ | L'amélioration est référencée dans http://gcc.gnu.org/gcc-4.3/changes.html : | ||
+ | * gcj now uses the Eclipse Java compiler for its Java parsing needs. This enables the use of all 1.5 language features, and fixes most existing front end bugs. | ||
+ | * libgcj now supports all 1.5 language features which require runtime support: foreach, enum, annotations, generics, and auto-boxing. | ||
+ | |||
+ | === Tentative dans un environnement GCC 4.1.1 (10/2007) === | ||
+ | |||
+ | Il nous faut LIBGCJ jar / libgcj-4.1.2.jar => pas dans Etch! (on a la 4.1.1 :'( ). Le paquet source correspondant est essentiellement GCC - il faut carrement mettre à jour GCC. La page BuildRequirements de IcedTea parle de la "Red Hat branch (with generics)". Je suppose qu'il s'agit de compiler GCC après avoir importé la branche de Classpath (cf. libjava/HACKING) qui utilise les "generics", un nouvel élément de syntaxe Java introduit dans la version 1.5. Le paquet Debian GCC 4.2 fait un diff dans un dépôt SVN entre deux branches pour patcher les sources officielles. | ||
+ | |||
+ | Et avec <code>--with-libgcj-jar=/usr/share/java/libgcj-4.1.jar</code>? Ça donne: | ||
+ | ERROR: Your BOOTDIR environment variable does not point | ||
+ | to a valid JDK for bootstrapping this build. | ||
+ | A JDK 7 build must be bootstrapped using | ||
+ | JDK 1.5.0 fcs (or later). | ||
+ | Apparently, your bootstrap JDK is version 1.4 | ||
+ | Please update your ALT_BOOTDIR setting and start your build again. | ||
+ | Essayer alors de récupérer un libgcj-4.2.jar sans backporter tout GCC: | ||
+ | cd /tmp | ||
+ | mkdir t && cd t | ||
+ | wget http://ftp.fr.debian.org/debian/pool/main/g/gcj-4.2/libgcj8-jar_4.2.1-5_all.deb | ||
+ | ar x libgcj8-jar_4.2.1-5_all.deb | ||
+ | tar xzf data.tar.gz | ||
+ | cp usr/share/java/libgcj-4.2.jar /usr/share/java/ | ||
+ | Même résultat. En fait c'est plutôt le répertoire d'amorçage bootstrap/ecj/ qui fait référence aux outils Java installés sur le système, "1.4.2" sous Etch (gij 4.1.2) et "1.5.0" sous Lenny (gij 4.2.1). Pas d'amélioration avec <code>--with-ecj</code>, c'est apparemment l'environnement d'exécution (pas le compilateur) qui est en cause (donc gij et libgcj). Je sens qu'on ne va pas couper à un ch'tit rétroportage de GCC... | ||
+ | Ou alors tenter une compilation avec apbuild (autopackage) depuis Lenny. | ||
− | + | == Liens == | |
− | + | * [http://icedtea.classpath.org/wiki/DebianBuildingInstructions DebianBuildingInstructions] pour PPC (wiki IcedTea) | |
+ | * [[Backport_FreeType]]: instructions plus détaillées pour les rétroportages | ||
+ | * [http://blog.fuseyism.com/index.php/2008/03/27/building-icedtea6-on-debian-etch-stable/ Building IcedTea6 on Debian etch (stable)]: quick overview, involving a local installation of GNU Classpath and Cacao |
Version actuelle datée du 29 mars 2008 à 15:38
Quel support Java libre aujourd'hui?
État courant
Jusqu'à 2007, Java était une technologie propriétaire de Sun. Il existe des paquets dans la section non-free de Debian.
Divers projects libres se sont créés pour réimplenter Java:
- JVM: Kaffe, GIJ (GNU Interpreter for Java)
- bibliothèques de fonctions: Classpath http://www.gnu.org/software/classpath/
- environnement de compilation: GCJ - GNU Compiler for Java, ECJ - Eclipse Compiler for Java, Kopi...
Les distributions d'aujourd'hui (octobre 2007) proposent maintenant en standard la suite Java libre GIJ+GCJ+Classpath. Dans Debian:
- java-gcj-compat: un remplacement pour le JDK de Sun.
- java-gcj-compat-plugin: un plugin pour Mozilla
En 2007 donc Sun a libéré le code source de Java, une technologie utilisée par de nombreux programmes (libres ou non). C'est l'OpenJDK. Cependant il reste encore des parties propriétaires (binary plugs), mais des projets pour un Java 100% libre existent, notamment IcedTea.
Introduction à IcedTea
IcedTea est un projet qui combine l'OpenJDK avec GCJ+Classpath pour obtenir un JDK 100% libre. Il fournit également un système de compilation à base d'Autoconf.
Il y a deux grandes versions:
- IcedTea 6: travaille sur OpenJDK 6, proche de version stable de Java (depuis début 2008, actif 3/2008)
- IcedTea 1.x: travaille sur OpenJDK 7, qui est la version de développpement de Java (depuis 2007, en pause 3/2008)
Il commence à être présent dans les distributions.
- Fedora 8: http://fedoraproject.org/wiki/Features/IcedTea
- Mandriva 2008.1: http://sophie.zarb.org/srpm/cooker/java-1.7.0-icedtea
- Ubuntu Gutsy: http://packages.ubuntu.com/gutsy/interpreters/icedtea-java7-jre
Il est également fortement lié à RedHat, donc le travail est plutôt disponible autour de Fedora. Une personne @ubuntu.com travaille également sur le projet.
Le plugin web
Essayé sous Lenny après avoir compilé IcedTea:
ln -s `pwd`/openjdk/control/build/linux-i586/j2re-image/lib/i386/gcjwebplugin.so ~/.mozilla/plugins/
Redémarrez Firefox (ou Mozilla, Iceweasel, etc.) - c'est tout :)
Compilation: principes
La compilation de ce projet n'est pas évidente, car elle utilise des bibliothèques souvent récentes ou non officielle.
Notez que vous devez avoir accès à Internet: l'archive IcedTea est de petite taille, mais récupère une version de l'OpenJDK chez Sun durant la compilation, d'environ 90Mo comprimés, soit par HTTP, soit par Mercurial selon les versions.
Prévoir aussi de l'espace disque: entre 3 et 4 gigaoctets de produits de compilation, avec un JRE (Java Runtime Environment) de l'ordre de 300Mo.
Prérequis: mercurial
Utilisé:
- Soit pour récupérer une version de IcedTea6
- Soit pour le rappatriement dynamique d'OpenJDK dans IcedTea7
Sous Debian Etch:
# First install with Etch dependencies aptitude install mercurial # then upgrade mercurial to backports.org version aptitude install -t etch-backports mercurial
La commande mercurial est nommée hg
.
Prérequis IcedTea7: forest
La compilation nécessite l'extension 'forest' de Mercurial. Pourquoi? Pour aller chercher OpenJDK dans le dépôt mercurial, plutôt que via une tarball. Soit:
#hg clone http://www.terminus.org/hg/hgforest hgforest # ancienne URL hg clone http://hg.akoha.org/hgforest/ hgforest mkdir ~/.hgext cp hgforest/forest.py ~/.hgext cat <<EOF >> ~/.hgrc [extensions] hgext.forest = ~/.hgext/forest.py EOF
Prérequis: environnement Java 1.5
Il faut effectivement Java pour compiler Java!
IcedTea est prévu pour fonctionner avec GCC 4.3 (ou 4.2 + rétroportage generics de RedHat), qui fournit GIJ et Classpath, plus ECJ pour le compilateur.
Autre solutions (pas testées):
- utilise la machine virtuelle Cacao et le dernier Classpath
- installer une version propriétaire de Java, de l'utiliser pour compiler IcedTea, puis de la désinstaller. Après ça, pour faire propre, vous pouvez recompiler IcedTea avec IcedTea :)
Compilation IcedTea6 sous Debian Etch (3/2008)
Prérequis - recompiler GCC 4.3
La version 4.3 inclut le support Java 1.5, nécessaire pour compiler IcedTea.
On compile ici à la main, voir si un backport de Lenny ne serait pas plus simple (probablement pas, le packaging est relativement velu).
Prévoir de la place:
$ ls -lh gcc-4.3.0.tar.bz2 -rw-r--r-- 1 sylvain src 57M 2008-03-18 18:05 gcc-4.3.0.tar.bz2 $ du -sh gcc-4.3.0/ # non compilé 511M gcc-4.3.0/ $ du -sh gcc-4.3.0/ # compilé 1,7G gcc-4.3.0/
Dépendances:
- bison: OK
- GMP 4.1+: OK (
apt-cache policy libgmp3-dev
=>4.2.1
) - MPFR 2.3.0+: KO, backport nécessaire
Backport mpfr:
aptitude --assume-yes install pbuilder cowdancer aptitude --assume-yes install apt-src apt-get --assume-yes install fakeroot sudo cowbuilder --create --distribution=etch echo "deb-src http://ftp.fr.debian.org/debian/ lenny main" >> /etc/apt/sources.list aptitude update cd /usr/src/ apt-src install mpfr pushd mpfr-2.3.1.dfsg.1/ yes | dch -D etch-backports \ --newversion $(dpkg-parsechangelog | sed -ne 's,^Version: ,,p')~bpo40+1 \ --force-bad-version -- \ "Rebuild for Debian Backports <http://www.backports.org/>" pdebuild --pbuilder cowbuilder popd aptitude purge libmpfr1 dpkg -i /var/cache/pbuilder/result/libmpfr*.deb
Compilation proprement dite:
apt-get --assume-yes install bzip2 apt-get --assume-yes install bison unzip wget ftp://ftp.irisa.fr/pub/mirrors/gcc.gnu.org/gcc/releases/gcc-4.3.0/gcc-4.3.0.tar.bz2 tar xjf gcc-4.3.0.tar.bz2 pushd gcc-4.3.0 mkdir builddir cd builddir/ ../configure --prefix=/opt/gcc-4.3.0 --enable-languages=java make make install popd
Résultat (au bout de 2-3h):
# /opt/gcc-4.3.0/bin/gij -version java version "1.5.0" gij (GNU libgcj) version 4.3.0
Gagné!
Prérequis: backporter FreeType
Cf. Backport_FreeType.
# Setup pbuilder and add Lenny source list as shown in #Pr.C3.A9requis_-_recompiler_GCC_4.3 cd /usr/src apr-src install libfreetype6 yes | dch -D etch-backports \ --newversion $(dpkg-parsechangelog | sed -ne 's,^Version: ,,p')~bpo40+1 \ --force-bad-version -- \ "Rebuild for Debian Backports <http://www.backports.org/>" pdebuild --pbuilder cowbuilder
(cd /var/cache/pbuilder/result/ && \ dpkg -i libfreetype6-dev_2.3.5-1~bpo40+1_i386.deb \ libfreetype6_2.3.5-1~bpo40+1_i386.deb)
Dépendances en paquets
- ant => ant
- ecj => ecj-bootstrap-gcj (Lenny: ecj-gcj)
- cups-devel => libcupsys2-dev
- libXt-devel => libxt-dev
- libXp-devel => libxp-dev
- lesstif-devel => lesstif2-dev
- alsa-lib-devel => libasound2-dev
- libXtst-devel => libxtst-dev
- plugin support headers and libraries => iceape-dev
- gtk+-2.0 gthread-2.0 => libgtk2.0-dev
- gdk-pixbuf-2.0 => libgdk-pixbuf-dev (optional?)
- giflib-devel => libungif4-dev | libgif-dev
- libjpeg-devel => libjpeg-dev
- freetype => libfreetype6-dev
- xalan2 => libxalan2-java
- unzip
- gawk
On utilisera apt-get plutôt qu'aptitude, de manière à ce que les paquets soient tous considérés comme installés automatiquement, et facilement supprimables après coup.
Soit:
apt-get install --assume-yes ant \ libcupsys2-dev libxt-dev libxp-dev lesstif2-dev libasound2-dev libxtst-dev iceape-dev libgtk2.0-dev libgdk-pixbuf-dev \ libungif4-dev libjpeg-dev libxalan2-java unzip gawk apt-get install --assume-yes ecj-bootstrap-gcj
Environnement Java 1.5
Il faut installer le petit paquet java-gcj-compat à la main pour pointer sur l'installation locale de GCC 4.3:
wget ftp://sources.redhat.com/pub/rhug/java-gcj-compat-1.0.77.tar.gz tar xzf java-gcj-compat-1.0.77.tar.gz cd java-gcj-compat-1.0.77/ ./configure --prefix=/opt/gcc-4.3.0 make install ll /usr/bin/ecj /opt/gcc-4.3.0/lib/jvm/java-1.5.0-gcj-1.5.0.0/bin ln -fs ../../../../bin/gjar /opt/gcc-4.3.0/lib/jvm/java-1.5.0-gcj-1.5.0.0/bin/jar # TODO: pourquoi ceci n'est-il pas fait automatiquement? cp -a /opt/gcc-4.3.0/lib/gcj-4.3.0-9/* /opt/gcc-4.3.0/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre/lib/i386/ cp -a /opt/gcc-4.3.0/lib/gcc/i686-pc-linux-gnu/4.3.0/include/* /opt/gcc-4.3.0/lib/jvm/java-1.5.0-gcj-1.5.0.0/include/
Cela permet de définir un jeu de liens symboliques qu'IcedTea reconnait.
Téléchargement
hg clone http://icedtea.classpath.org/hg/icedtea6
Configuration
unset JAVA_HOME ./configure \ --with-libgcj-jar=/opt/gcc-4.3.0/share/java/libgcj-4.3.0.jar \ --with-gcj-home=/opt/gcc-4.3.0/lib/jvm/java-1.5.0-gcj-1.5.0.0 \ --with-java=/opt/gcc-4.3.0/bin/java --with-jar=/opt/gcc-4.3.0/bin/jar \ --with-rmic=/opt/gcc-4.3.0/bin/rmic --with-javah=/opt/gcc-4.3.0/bin/javah
Corriger le problème undefined reference to `___tls_get_addr'
(cf. #Compilation_statique_de_libstdc.2B.2B)
cat <<EOF | patch /usr/lib/libc.so --- /usr/lib/libc.so-dist 2008-03-28 22:02:33.000000000 +0100 +++ /usr/lib/libc.so 2008-03-28 22:02:49.000000000 +0100 @@ -2,4 +2,4 @@ Use the shared library, but some functions are only in the static library, so try that secondarily. */ OUTPUT_FORMAT(elf32-i386) -GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a ) +GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a AS_NEEDED ( /lib/ld-linux.so.2 ) ) EOF
On peut utiliser l'option suivante for une compilation plus rapide, en particulier avant d'avoir toutes les options et dépendences de compilation bien au point:
--enable-fast-build optimize for quick building: use -O0 and do not build documentation
Compilation
make
Vous en avez probablement pour 2-3h avant de voir enfin s'afficher:
IcedTea is served: openjdk/control/build/linux-i586
Prérequis: backporter zlib
En essayant d'accéder à une base de données HSQLDB dans OpenOffice.org, la JVM plante [1].
Cela est apparemment dû à un problème dans zlib. Il faut la backporter. Pour simplifier le backport (notamment, supprimer la dépendance à gcc-multilib apparu dans Lenny, et les erreurs /usr/bin/ld: cannot find -lgcc_s
), on ne compile pas pour l'architecture 64bit:
diff -ur zlib-1.2.3.3.dfsg/debian/control zlib-1.2.3.3.dfsg.beuc/debian/control --- zlib-1.2.3.3.dfsg/debian/control 2008-03-21 11:52:40.000000000 +0100 +++ zlib-1.2.3.3.dfsg.beuc/debian/control 2008-03-21 11:15:32.000000000 +0100 @@ -4,7 +4,7 @@ Maintainer: Mark Brown <broonie@debian.org> Standards-Version: 3.7.3 XS-VCS-Bzr: http://bzr.debian.org/bzr/pkg-zlib/zlib/debian -Build-Depends: debhelper (>= 5), quilt, gcc-multilib [amd64 i386 kfreebsd-amd64 powerpc ppc64 s390 sparc] +Build-Depends: debhelper (>= 5), quilt Package: zlib1g Architecture: any @@ -57,26 +57,6 @@ in gzip and PKZIP. This minimal package includes the shared library for use with the Debian installer. -Package: lib64z1 -Architecture: sparc s390 i386 powerpc -Depends: ${shlibs:Depends} -Replaces: amd64-libs (<< 1.4) -Description: compression library - 64 bit runtime - zlib is a library implementing the deflate compression method found - in gzip and PKZIP. This package includes a 64 bit version of the - shared library. - -Package: lib64z1-dev -Section: libdevel -Architecture: sparc s390 i386 powerpc -Depends: lib64z1 (= ${binary:Version}), zlib1g-dev (= ${binary:Version}), lib64c-dev -Replaces: amd64-libs-dev (<< 1.4) -Provides: lib64z-dev -Description: compression library - 64 bit development - zlib is a library implementing the deflate compression method found - in gzip and PKZIP. This package includes the development support - files for building 64 bit applications. - Package: lib32z1 Architecture: amd64 ppc64 kfreebsd-amd64 Depends: ${shlibs:Depends} diff -ur zlib-1.2.3.3.dfsg/debian/rules zlib-1.2.3.3.dfsg.beuc/debian/rules --- zlib-1.2.3.3.dfsg/debian/rules 2008-03-21 11:52:40.000000000 +0100 +++ zlib-1.2.3.3.dfsg.beuc/debian/rules 2008-03-21 11:09:23.000000000 +0100 @@ -34,7 +34,7 @@ CFLAGS += -O3 endif -64-ARCHS=s390 sparc i386 powerpc +64-ARCHS=s390 sparc powerpc ifneq (,$(findstring $(DEB_HOST_ARCH), $(64-ARCHS))) EXTRA_INSTALL=install64 EXTRA_BUILD=build64-stamp
Placez ce patch dans /usr/src/zlib-diff
.
apt-src install zlib cd zlib-1.2.3.3.dfsg/ patch -p1 < ../zlib-diff yes | dch -D etch-backports \ --newversion $(dpkg-parsechangelog | sed -ne 's,^Version: ,,p')~bpo40+1 \ --force-bad-version -- \ "Rebuild for Debian Backports <http://www.backports.org/>" pdebuild --pbuilder cowbuilder dpkg -i /var/cache/pbuilder/result/zlib1g_1.2.3.3.dfsg-11~bpo40+1_i386.deb
OpenOffice.org fonctionne correctement à présent!
Créer un paquet binaire Debian
On peut créer un paquet Debian à la mimine (pas un paquet source traditionnel, parce qu'il faudrait backporter GCC 4.3 proprement), directement avec dpkg -b
:
cd /usr/src/icedtea6/ path=openjdk/control/build/linux-i586/j2re-image shlib=$(find $path -type f -perm -a+x | xargs -r dpkg-shlibdeps -O 2>/dev/null | sed 's/^shlibs:Depends=//') date=$(php -r "print strftime('%Y%m%d', strtotime('$(hg log -l1 | sed -ne 's/date: //p')'));") mkdir DEBS mkdir -p tmp/usr/lib/jvm mkdir -p tmp/DEBIAN chmod g-s tmp/DEBIAN cp -al $path tmp/usr/lib/jvm/java-6-openjdk cat <<EOF > tmp/DEBIAN/control Package: openjdk-6-jre Version: 6.$date Maintainer: Sylvain Beucler <beuc@beuc.net> Architecture: i386 Depends: $shlib Description: OpenJDK Java runtime The packages are built using the IcedTea build support and patches from the IcedTea project. . Homepage: http://icedtea.classpath.org/ EOF dpkg -b tmp/ DEBS/ rm -rf tmp/
$ ls -lh DEBS/ total 126M -rw-r--r-- 1 sylvain src 126M 2008-03-28 19:40 openjdk-6-jre_6.20080317_i386.deb
J'ai emprunté les conventions de nommage, les emplacements et les descriptions ici.
Compilation IcedTea7 sous Debian Etch (3/2008)
Même principe que pour IcedTea6. N'oubliez pas d'installer le plug-in Mercurial 'forest' comme expliqué plus haut.
wget http://icedtea.classpath.org/download/source/icedtea-1.6.tar.gz tar xzf icedtea-1.6.tar.gz cd icedtea-1.6/ .configure --with-...
Compilation IcedTea6 sous Debian Lenny (3/2008)
Toutes les dépendances sont présentes dans le système. On utilise GCJ-4.3/java-gcj-compat-dev pour la phase d'amorçage. Il faut juste penser à spécifier gjar
à la place de fastjar
(qui n'a pas l'option -J
):
unset JAVA_HOME apt-get install --assume-yes ant \ libcupsys2-dev libxt-dev libxp-dev lesstif2-dev libasound2-dev libxtst-dev iceape-dev libgtk2.0-dev libgdk-pixbuf-dev \ libungif4-dev libjpeg-dev libxalan2-java libfreetype6-dev unzip gawk apt-get install --assume-yes java-gcj-compat-dev ./configure --with-jar=gjar-4.3 make
Compilation IcedTea7 1.4- sous Debian Lenny (10/2007)
Pour 1.4 < 10-2007:
- un OpenJDK existant
On y va, on commence par icedtea-1.4-f2364...:
aptitude install ecj-bootstrap-gcj java-gcj-compat-dev aptitude install libcupsys2-dev libxt-dev libxp-dev lesstif2-dev libasound2-dev libxtst-dev iceape-dev libgtk2.0-dev ./configure --with-libgcj-jar=/usr/share/java/libgcj-4.2.jar make
Résultat des courses: au bout d'une petit heure j'ai:
cc1plus: warnings being treated as errors
suivi d'une série d'avertissements identiques:
/mnt/h/icedtea/icedtea-1.4/openjdk-ecj/hotspot/src/os/linux/vm/jvm_linux.cpp:182: warning: deprecated conversion from string constant to 'char*'
et arrêt de la compilation. QUI EST LE FOUTU CRÉTIN QUI A DEMANDÉ DE TRAITER LES AVERTISSEMENTS COMME DES ERREURS, NOM DE NOM?? Note: je ne me souviens plus avec quoi j'avais testé, mais ça vaudrait le coup de réessayer avec g++3, car la version 4 est nettement plus stricte.
sed -i -e 's/WARNINGS_ARE_ERRORS = .*/WARNINGS_ARE_ERRORS = /' \ ./openjdk/hotspot/build/linux/makefiles/gcc.make \ ./openjdk-ecj/hotspot/build/linux/makefiles/gcc.make make
et enfin:
IcedTea is served: openjdk/control/build/linux-i586
Erreurs et résolutions
Téléchargement Mercurial
Il arrive que mercurial ait des soucis pendant le rappatriement d'OpenJDK:
... [jdk] requesting all changes adding changesets adding manifests adding file changes transaction abort! rollback completed abort: consistency error adding group! make: *** [stamps/clone.stamp] Erreur 255
Rien de méchant, votre configuration n'est pas de problème, c'est en fait normal. Il suffit de recommencer:
make
Compilation statique de libstdc++
/usr/lib/gcc/i486-linux-gnu/4.1.2/libstdc++.a(eh_globals.o): In function `__gnu_internal::get_global()': (.text._ZN14__gnu_internal10get_globalEv+0x17): undefined reference to `___tls_get_addr' collect2: ld returned 1 exit status
Le problème est l'utilisation de '-Wl,-Bstatic' devant '-lstdc++'.
Solution de contournement:
find -name "Makefile" -o -name "*.gmk" -o -name "*.make" \ | xargs sed -i -e 's/STATIC_CXX \+= \+true/STATIC_CXX = false/'
Cf. http://icedtea.classpath.org/bugzilla/show_bug.cgi?id=123
Autre solution: http://www.advogato.org/person/twisti/diary/9.html
cat <<EOF | patch /usr/lib/libc.so --- /usr/lib/libc.so-dist 2008-03-28 22:02:33.000000000 +0100 +++ /usr/lib/libc.so 2008-03-28 22:02:49.000000000 +0100 @@ -2,4 +2,4 @@ Use the shared library, but some functions are only in the static library, so try that secondarily. */ OUTPUT_FORMAT(elf32-i386) -GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a ) +GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a AS_NEEDED ( /lib/ld-linux.so.2 ) )
libjvm
/usr/bin/ld: cannot find -ljvm collect2: ld returned 1 exit status
Cela se produit en utilisant une version locale de GCC 4.3. Il faut manuellement copier les fichiers de bibliothèque au bon endroit:
cp -a /opt/gcc-4.3.0/lib/gcj-4.3.0-9/* /opt/gcc-4.3.0/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre/lib/i386/
Il est curieux que ce ne soit pas fait automatiquement. Des idées là-dessus?
zlib
Avec la zlib de Etch (1.2.3), OpenOffice.org plante [2]. Le log d'IcedTea indique:
... Stack: [0xbfc32000,0xbfc82000], sp=0xbfc7f0e0, free space=308k Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) C [libz.so.1+0x6f6a] C [libz.so.1+0x5f40] deflate+0x170 C [libzip.so+0x2411] Java_java_util_zip_Deflater_deflateBytes+0x171 v ~BufferBlob::Interpreter ...
Solution: backporter 1.2.3.3 (cf. ci-dessus).
Autres essais et notes
Sans amorçage ECJ
À un moment donné (fin 2007), IcedTea nécessitait IcedTea (cf. [3], b21 est le nom de la version de septembre de l'OpenJDK), sans possibilité d'amorçage (bootstrap) avec ECJ. Comment faire alors?
- Soit on peut utiliser des paquets précompilés si la distribution utilisée le propose
- Soit on compile un version de IcedTea antérieure à fin septembre 2007 (la 1.4-f236... par exemple), puis on compile la dernière version d'IcedTea.
L'amorçage ECJ est de nouveau disponible (début 2008).
Compilation IcedTea7 1.4- sous Fedora 7 (10/2007)
La page des dépendences propose de rapatrier une longue liste de dépendances depuis le dépôt "développement" (yum --enablerepo=development
). Sur Fedora 7, on va se contenter de les installer depuis le dépôt par défaut (mettre à jour le système avant, j'ai eu une erreur de dépendances Unresolveable requirement gecko-libs = 1.8.1.5 for yelp
).
yum install /usr/bin/ecj cups-devel lesstif-devel libXp-devel libXtst-devel libXi-devel \ xalan-j2 xerces-j2 libXt-devel libgcj freetype-devel gcc gcc-c++ wget java-1.5.0-gcj-devel \ alsa-lib-devel firefox-devel glib2-devel gtk2-devel ant libXinerama-devel
Puis une compilation classique:
cd /usr/src/ wget http://icedtea.classpath.org/download/source/icedtea-1.4-f23640f520cf248e08d731f91fed62ed14e97b2f.tar.gz tar xzf icedtea-1.4-f23640f520cf248e08d731f91fed62ed14e97b2f.tar.gz cd icedtea-1.4 ./configure make
Là j'ai attendu 6h, mais ça devrait aller plus vite sur des PCs plus récents. Compter tout de même un paire d'heures au minimum. Ça prend aussi 3,7Go d'espace disque. Mais le résultat est là:
IcedTea is served: openjdk/control/build/linux-i586
Compilation IcedTea7 1.4 sous Fedora 7 (10/2007)
On compile maintenant le nouveau IcedTea à l'aide du précédent:
cd /usr/src/ hg clone http://icedtea.classpath.org/hg/icedtea cd icedtea ./configure --with-icedtea-home=/usr/src/icedtea-1.4/openjdk/control/build/linux-i586 make
Là j'ai des erreurs bizarres. D'abord deux avertissements, peut-être pas anodins:
WARNING: The version of ant being used is older than the required version of '1.6'. The version of ant found was . WARNING: The version of findbugs being used is older than the required version of '1.1'. The version of findbugs found was . Sanity check passed.
Puis surtout:
BUILD FAILED /usr/src/icedtea/openjdk/langtools/make/build.xml:315: The following error occurred while executing this line: /usr/src/icedtea/openjdk/langtools/make/build.xml:657: bootstrap java is not installed in /usr/src/icedtea/bootstrap/jdk1.6.0
Curieux...
On réessaie plus tard avec la release du 12 octobre, ça passe mieux, mais au bout d'une heure et demi:
make[5]: Leaving directory `/usr/src/icedtea-1.4/openjdk/control/build/linux-i586/hotspot/outputdir/linux_i486_compiler2/product' cd linux_i486_compiler2/product && ./test_gamma There was an error trying to initialize the HPI library. Could not create the Java virtual machine.
Une rapide recherche montre qu'il s'agit d'une "vraie" erreur Java, autrement dit une insulte d'OpenJDK en personne (et non pas de GCJ ou autre). Apparemment cela peut arriver quand 2 JDKs sont en conflicts, ce qui est probablement le cas ici. Je n'ai pas le début d'une piste de correction donc ça va probablement rester comme ça jusqu'à la prochaine release...
Dépendance à GCC 4.3
Avant la version 4.3, il fallait utiliser un rétroportage non-officiel de RedHat ("with generics"). Cette branche était d'ailleurs souvent utilisée dans les paquets officiels des distributions, qui étaient alors plus "récent" que les versions officielles de GCC -- un non-sens complet.
L'amélioration est référencée dans http://gcc.gnu.org/gcc-4.3/changes.html :
- gcj now uses the Eclipse Java compiler for its Java parsing needs. This enables the use of all 1.5 language features, and fixes most existing front end bugs.
- libgcj now supports all 1.5 language features which require runtime support: foreach, enum, annotations, generics, and auto-boxing.
Tentative dans un environnement GCC 4.1.1 (10/2007)
Il nous faut LIBGCJ jar / libgcj-4.1.2.jar => pas dans Etch! (on a la 4.1.1 :'( ). Le paquet source correspondant est essentiellement GCC - il faut carrement mettre à jour GCC. La page BuildRequirements de IcedTea parle de la "Red Hat branch (with generics)". Je suppose qu'il s'agit de compiler GCC après avoir importé la branche de Classpath (cf. libjava/HACKING) qui utilise les "generics", un nouvel élément de syntaxe Java introduit dans la version 1.5. Le paquet Debian GCC 4.2 fait un diff dans un dépôt SVN entre deux branches pour patcher les sources officielles.
Et avec --with-libgcj-jar=/usr/share/java/libgcj-4.1.jar
? Ça donne:
ERROR: Your BOOTDIR environment variable does not point to a valid JDK for bootstrapping this build. A JDK 7 build must be bootstrapped using JDK 1.5.0 fcs (or later). Apparently, your bootstrap JDK is version 1.4 Please update your ALT_BOOTDIR setting and start your build again.
Essayer alors de récupérer un libgcj-4.2.jar sans backporter tout GCC:
cd /tmp mkdir t && cd t wget http://ftp.fr.debian.org/debian/pool/main/g/gcj-4.2/libgcj8-jar_4.2.1-5_all.deb ar x libgcj8-jar_4.2.1-5_all.deb tar xzf data.tar.gz cp usr/share/java/libgcj-4.2.jar /usr/share/java/
Même résultat. En fait c'est plutôt le répertoire d'amorçage bootstrap/ecj/ qui fait référence aux outils Java installés sur le système, "1.4.2" sous Etch (gij 4.1.2) et "1.5.0" sous Lenny (gij 4.2.1). Pas d'amélioration avec --with-ecj
, c'est apparemment l'environnement d'exécution (pas le compilateur) qui est en cause (donc gij et libgcj). Je sens qu'on ne va pas couper à un ch'tit rétroportage de GCC...
Ou alors tenter une compilation avec apbuild (autopackage) depuis Lenny.
Liens
- DebianBuildingInstructions pour PPC (wiki IcedTea)
- Backport_FreeType: instructions plus détaillées pour les rétroportages
- Building IcedTea6 on Debian etch (stable): quick overview, involving a local installation of GNU Classpath and Cacao