Différences entre versions de « Java »

De Cliss XXI
Sauter à la navigation Sauter à la recherche
imported>SylvainBeucler
m (→‎Lenny : new URL for hgforest)
imported>SylvainBeucler
m (refactor)
Ligne 1 : Ligne 1 :
Sun a libéré le code source de Java, une technologie utilisée par de nombreux programmes (libres ou non). C'est l'OpenJDK.
+
Quel support Java libre aujourd'hui?
  
Cependant il reste encore des parties propriétaires (''binary plugs''), mais des projets pour un Java 100% libre existent.
+
== État courant ==
  
== É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 (http://www.gnu.org/software/classpath/), qui n'inclut pas de code de l'OpenJDK.
+
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:
 
* [http://packages.debian.org/java-gcj-compat 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.
 
* [http://packages.debian.org/java-gcj-compat-plugin java-gcj-compat-plugin]: un plugin pour Mozilla
 
* [http://packages.debian.org/java-gcj-compat-plugin java-gcj-compat-plugin]: un plugin pour Mozilla
  
Ça ne marche pas parfaitement.
+
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.
  
== IcedTea ==
+
== Introduction à IcedTea ==
  
 
http://icedtea.classpath.org/
 
http://icedtea.classpath.org/
  
IcedTea est un projet qui combine l'OpenJDK avec GCJ+Classpath pour obtenir un JDK 100% libre.
+
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 n'est pas encore présent dans les distributions. Il est également fortement lié à RedHat, donc le travail est plutôt disponible autour de Fedora (apparemment il y a des paquets binaires disponibles dans Fedora 8, en cours de développement).
+
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)
  
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 on fait alors?
+
Il commence à être présent dans les distributions. Il est également fortement lié à RedHat, donc le travail est plutôt disponible autour de Fedora (apparemment il y a des paquets binaires disponibles dans Fedora 8, en cours de développement). Une personne @ubuntu.com travaille également sur le projet.
* Soit on peut utiliser les paquets Fedora de développement; mais apparemment cela met à jour pas mal de composants de Fedora 7, qu'on aurait préféré laisser en l'état.
 
* 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.
 
  
On va décrire ici la deuxième méthode plus en détail.
+
=== Le plugin web ===
  
=== Compilation de IcedTea 1.4 ===
+
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 :)
  
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>).
+
== Compilation ==
  
yum install /usr/bin/ecj cups-devel lesstif-devel libXp-devel libXtst-devel libXi-devel \
+
La compilation de ce projet n'est pas évidente, car elle utilise des bibliothèques souvent récentes ou non officielle.
  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
 
  
Ensuite, ben on compile bêtement. 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.
+
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.
  
cd /usr/src/
+
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.
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à:
+
=== Prérequis IcedTea7: forest ===
IcedTea is served: openjdk/control/build/linux-i586
 
  
=== Compilation de IcedTea dernière version ===
+
La compilation nécessite l'extension 'forest' de Mercurial. Pourquoi? Pour aller cherche OpenJDK dans le dépôt mercurial, plutôt que via une tarball.
 +
Soit:
 +
aptitude install -t etch-backports mercurial
 +
#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
  
On compile maintenant le nouveau IcedTea à l'aide du précédent:
+
=== Prérequis: environnement Java 1.5 ===
  
cd /usr/src/
+
Il faut effectivement Java pour compiler Java!
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:
+
IcedTea est prévu pour fonctionner avec GCC 4.3 (ou 4.2 + rétroportage ''generics'' de RedHat), qui fournit GIJ et Classpath, ainsi qu'Eclipse pour le compilateur.
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:
+
Autre solution (pas testée): 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 :)
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...
+
=== Compilation IcedTea6 avec Debian Sarge ===
  
 +
==== Prérequis - recompiler GCC 4.3 ====
  
On réessaie plus tard avec la release du 12 octobre, ça passe mieux, mais au bout d'une heure et demi:
+
La version 4.3 inclut le support Java 1.5, nécessaire pour compiler IcedTea.
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...
+
On compile ici à la main, voir si un backport de Lenny ne serait pas plus simple (probablement pas, le packaging est relativement velu).
  
=== La suite... ===
+
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/
  
Maintenant il faudrait voir dans quelle mesure on ne pourrait pas faire une archive binaire directement installable.
+
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
  
À voir aussi: activer le plugin Java dans Mozilla, et d'autres navigateurs si possible.
+
Backport mpfr:
 +
aptitude install pbuilder cowdancer
 +
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
 +
cd mpfr-2.3.1.dfsg.1/
 +
pdebuild --pbuilder cowbuilder
 +
aptitude purge libmpfr1
 +
dpkg -i /var/cache/pbuilder/result/libmpfr*.deb
  
On peut sans doute déjà faire des choses avec la version 1.4.
+
Compilation proprement dite:
 +
aptitude install bison
 +
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
 +
cd gcc-4.3.0
 +
mkdir builddir
 +
cd builddir/
 +
../configure --prefix=/opt/gcc-4.3.0 --enable-languages=java
 +
make
 +
make install
  
=== Le plugin web ===
+
Résultat (au bout de 2-3h):
  
Essayé sous Lenny après avoir compilé IcedTea:
+
  # /opt/gcc-4.3.0/bin/gij -version
  ln -s `pwd`/openjdk/control/build/linux-i586/j2re-image/lib/i386/gcjwebplugin.so ~/.mozilla/plugins/
+
java version "1.5.0"
Redémarrez Firefox (ou Mozilla, Iceweasel, etc.) - c'est tout :)
+
gij (GNU libgcj) version 4.3.0
  
=== Depuis Debian ===
+
Gagné!
  
Allez, on tente depuis une
+
==== La suite ====
 
 
==== Etch ====
 
  
 
* cups-devel => libcupsys2-dev
 
* cups-devel => libcupsys2-dev
Ligne 113 : Ligne 126 :
 
* gtk+-2.0 gthread-2.0 => libgtk2.0-dev
 
* gtk+-2.0 gthread-2.0 => libgtk2.0-dev
 
* gdk-pixbuf-2.0 => libgdk-pixbuf-dev (optional?)
 
* gdk-pixbuf-2.0 => libgdk-pixbuf-dev (optional?)
 +
 +
* giflib-devel => libungif4-dev | libgif-dev
 +
* libjpeg-devel => libjpeg-dev
  
 
Soit:
 
Soit:
Ligne 120 : Ligne 136 :
 
* ecj => ecj-bootstrap-gcj
 
* ecj => ecj-bootstrap-gcj
 
* javac, javah => java-gcj-compat-dev
 
* javac, javah => java-gcj-compat-dev
* 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)" mais je parviens pas à mettre la main sur le dépôt correspondant. 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 (en quoi cette version est-elle nécessaire?). 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. 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.
 
  
==== Lenny ====
+
== Compilation IcedTea7 1.4- sous Debian Lenny (10/2007) ==
  
 
Pour 1.4 < 10-2007:
 
Pour 1.4 < 10-2007:
Ligne 164 : Ligne 164 :
  
  
Pour 1.5 (01-2008):
+
== Autres essais et notes ==
 +
 
 +
=== Sans amorçage ECJ ===
  
Les nouveautés:
+
À 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?
* hg => mercurial
+
* Soit on peut utiliser des paquets précompilés si la distribution utilisée le propose
* giflib-devel => libungif4-dev | libgif-dev
+
* 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.
* extension 'forest' de Mercurial. Pourquoi? Pour aller cherche OpenJDK dans le dépôt mercurial, plutôt que via une tarball.
 
Soit:
 
aptitude install mercurial libungif4-dev
 
#hg clone http://www.terminus.org/hg/hgforest hgforest
 
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
 
wget http://icedtea.classpath.org/download/source/icedtea-1.5.tar.gz
 
tar xzf icedtea-1.5.tar.gz
 
cd icedtea-1.5
 
./configure --with-libgcj-jar=/usr/share/java/libgcj-4.2.jar
 
make
 
...
 
  
=== Solution de repli ===
+
L'amorçage ECJ est de nouveau disponible (début 2008).
  
(pas testé)
+
== Compilation IcedTea7 1.4- sous Fedora 7 (10/2007) ==
  
Il est toujours possible d'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 :)
+
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>).
  
== Apparté - recompiler GCC 4.3 ==
+
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
  
La version 4.3 inclut le support Java 1.5, nécessaire pour compiler IcedTea.
+
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
  
On compile ici à la main, voir si un backport de Lenny ne serait pas plus simple (probablement pas, le packaging est relativement velu).
+
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
  
Prévoir de la place:
+
=== Compilation IcedTea7 1.4 sous Fedora 7 (10/2007) ===
$ 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/
 
  
Dépendances:
+
On compile maintenant le nouveau IcedTea à l'aide du précédent:
* 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 install pbuilder cowdancer
 
cowbuilder --create --distribution=etch
 
echo "deb-src http://ftp.fr.debian.org/debian/ lenny main" >> /etc/apt/sources.list
 
aptitude update
 
 
  cd /usr/src/
 
  cd /usr/src/
  apt-src install mpfr
+
  hg clone http://icedtea.classpath.org/hg/icedtea
  cd mpfr-2.3.1.dfsg.1/
+
cd icedtea
  pdebuild --pbuilder cowbuilder
+
./configure --with-icedtea-home=/usr/src/icedtea-1.4/openjdk/control/build/linux-i586
  aptitude purge libmpfr1
+
  make
  dpkg -i /var/cache/pbuilder/result/libmpfr*.deb
+
 
 +
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...
 +
 
  
Compilation proprement dite:
+
On réessaie plus tard avec la release du 12 octobre, ça passe mieux, mais au bout d'une heure et demi:
  aptitude install bison
+
  make[5]: Leaving directory `/usr/src/icedtea-1.4/openjdk/control/build/linux-i586/hotspot/outputdir/linux_i486_compiler2/product'
wget ftp://ftp.irisa.fr/pub/mirrors/gcc.gnu.org/gcc/releases/gcc-4.3.0/gcc-4.3.0.tar.bz2
+
  cd linux_i486_compiler2/product && ./test_gamma
tar xjf gcc-4.3.0.tar.bz2
+
  There was an error trying to initialize the HPI library.
  cd gcc-4.3.0
+
  Could not create the Java virtual machine.
mkdir builddir
 
cd builddir/
 
  ../configure --prefix=/opt/gcc-4.3.0 --enable-languages=java
 
  make
 
make install
 
  
Résultat (au bout de 2-3h):
+
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...
  
# /opt/gcc-4.3.0/bin/gij -version
+
=== Dépendence à GCC 4.3 ===
.?.
 
  
Avant la version 4.3, il fallait utiliser un rétroportage non-officiel de RedHat ("with generics"), qui était d'ailleurs souvent utilisée dans les paquets officiels des distributions..
+
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.
  
Amélioration référencée dans http://gcc.gnu.org/gcc-4.3/changes.html :
+
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.
 
* 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.
 
* 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 ==
 
== Liens ==
  
 
[http://icedtea.classpath.org/wiki/DebianBuildingInstructions DebianBuildingInstructions] pour PPC (wiki IcedTea)
 
[http://icedtea.classpath.org/wiki/DebianBuildingInstructions DebianBuildingInstructions] pour PPC (wiki IcedTea)

Version du 19 mars 2008 à 22:01

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:

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. Il est également fortement lié à RedHat, donc le travail est plutôt disponible autour de Fedora (apparemment il y a des paquets binaires disponibles dans Fedora 8, en cours de développement). 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

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 IcedTea7: forest

La compilation nécessite l'extension 'forest' de Mercurial. Pourquoi? Pour aller cherche OpenJDK dans le dépôt mercurial, plutôt que via une tarball. Soit:

aptitude install -t etch-backports mercurial
#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, ainsi qu'Eclipse pour le compilateur.

Autre solution (pas testée): 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 avec Debian Sarge

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/

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 install pbuilder cowdancer
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
cd mpfr-2.3.1.dfsg.1/
pdebuild --pbuilder cowbuilder
aptitude purge libmpfr1
dpkg -i /var/cache/pbuilder/result/libmpfr*.deb

Compilation proprement dite:

aptitude install bison
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
cd gcc-4.3.0
mkdir builddir
cd builddir/
../configure --prefix=/opt/gcc-4.3.0 --enable-languages=java
make
make install

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é!

La suite

  • 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

Soit:

aptitude install libcupsys2-dev libxt-dev libxp-dev lesstif2-dev libasound2-dev libxtst-dev iceape-dev libgtk2.0-dev libgdk-pixbuf-dev

Pour 1.4 < 10-2007:

  • ecj => ecj-bootstrap-gcj
  • javac, javah => java-gcj-compat-dev

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


Autres essais et notes

Sans amorçage ECJ

À un moment donné (fin 2007), IcedTea nécessitait IcedTea (cf. [1], 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épendence à 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)