OpenJDK 7 sur Mac OS X

Dans certains contextes client, il est nécessaire d’avoir un contrôle complet des sources s’exécutant sur un serveur ou une appliance donnée, par exemple pour un service critique et/ou ayant des contraintes de pérennité fortes. Avec la mise à disposition d’OpenJDK, il est tout à fait possible de compiler et de packager sa propre JVM, et ainsi de positionner Java dans des secteurs traditionnellement frileux à exécuter du code binaire non audité. Il est aussi possible de créer son propre packaging du JDK afin par exemple de réduire sa surface d’attaque en ne conservant que les fonctionnalités minimales souhaitées, ou même de modifier le code source afin de rajouter des probes DTrace, etc.
Ce billet a pour but de signaler la possibilité récente de compiler facilement (entendre: sans avoir à patcher soi-même le code source) OpenJDK 7 sous Mac OS X. Le code étant en perpétuel changement, il est possible que votre expérience de compilation soit différente de la mienne (voir la fin de ce billet qui contient toutes les informations techniques sur la révision stable utilisée).

Le code source du JDK est publié dans des repositories Mercurial hébergés sur java.net. Le minimum vital de commandes Mercurial est précisé ci-dessous, pour plus de détail se reporter à cette documentation. La première chose à faire est de se procurer Mercurial; vous pouvez par exemple passer par MacPorts pour l’installer:

 port install mercurial

Il faut de plus se procurer une extension Mercurial appelée ‘forest’ qui est utilisée par les équipes d’OpenJDK. Par ailleurs cela peut vous servir à étrenner votre nouvelle installation de Mercurial. A noter que sous Mac j’ai dû forcer ma locale pour éviter à Mercurial de planter:

 LC_ALL='C' hg clone http://hg.akoha.org/hgforest

Il faut ensuite déclarer cette extension dans le fichier ~/.hgrc en rajoutant les lignes suivantes:

 [ui] username = votreLoginDeCommitter [extensions] forest=/usr/local/src/openjdk/hgforest/forest.py

Vous êtes maintenant prêts à récupérer le code. Il vous faut un ‘port’ spécial du JDK, c’est-à-dire un code maintenu pour votre plateforme (FreeBSD, Linux, Windows, etc). Sans entrer dans les détails, Mac OS X est rangé dans la catégorie des BSD, et le travail de maintenance de la branche contenant ce port est partagé entre des committers et des contributeurs venant des mondes FreeBSD, OpenBSD, NetBSD, et Mac. La récupération du code donc se fait de la façon suivante:

 LC_ALL='C' hg fclone http://hg.openjdk.java.net/bsd-port/bsd-port

Cette commande va créer un répertoire bsd-port, contenant une arborescence de projets divers et variés formant un JDK. Pour compiler un JDK, vous allez devoir en posséder déjà un sur votre disque, et pas n’importe lequel, puisque ceux d’Apple ne conviendront pas (vous obtiendriez une erreur de type (‘ld: library not found for -ljvm’). Il vous faudra en récupérer un déjà compilé tel que celui mis à disposition par Landon Fuller, SoyLatte-1.6-1.0.3. Il vous faudra de même récupérer sur cette même page une archive tar appelée ‘jdk-7-icedtea-plugs’, contenant des classes SNMP, audio et AWT fournies par le projet IcedTea et provenant de GNU Classpath et destinées à remplacer celles de SUN en cours d’ouverture.
Après avoir décompressé les deux archives dans un répertoire (nommé ‘/usr/local/src/openjdk’ par la suite), il est nécessaire de supprimer la variable d’environnement JAVA_HOME et de vérifier la présence de ANT dans le PATH.

 unset JAVA_HOME which ant

Enfin, OpenJDK fournit une commande de vérification d’environnement afin de tester la présence de toutes les dépendances et outils nécessaires à la bonne conduite du build:

 ALT_BOOTDIR=/usr/local/src/openjdk/soylatte16-i386-1.0.3  ALT_BINARY_PLUGS_PATH=/usr/local/src/openjdk/jdk-7-icedtea-plugs  ALT_CUPS_HEADERS_PATH=/usr/include  ALT_FREETYPE_LIB_PATH=/usr/X11R6/lib  ALT_FREETYPE_HEADERS_PATH=/usr/X11R6/include  gmake sanity

Si tout est OK, vous pouvez lancer le build:

 ALT_BOOTDIR=/usr/local/src/openjdk/soylatte16-i386-1.0.3  ALT_BINARY_PLUGS_PATH=/usr/local/src/openjdk/jdk-7-icedtea-plugs  ALT_CUPS_HEADERS_PATH=/usr/include  ALT_FREETYPE_LIB_PATH=/usr/X11R6/lib  ALT_FREETYPE_HEADERS_PATH=/usr/X11R6/include  gmake all

Si tout se termine de façon satisfaisante, vous êtes maintenant l’heureux possesseur d’un build d’OpenJDK 7. Il vous suffit de lancer les commandes suivantes pour vous en rendre compte par vous-même:

 export JAVA_HOME=/usr/local/src/openjdk/bsd-port/build/bsd-i586/j2sdk-image export PATH=${JAVA_HOME}/bin:$PATH
 $ java -version openjdk version "1.7.0-internal" OpenJDK Runtime Environment (build 1.7.0-internal-queinnec_2009_01_17_13_49-b00) OpenJDK Server VM (build 14.0-b10, mixed mode)

Si le build a échoué ou pour toute autre raison, vous pouvez nettoyer votre répertoire de compilation en lançant la tâche dédiée:

 ALT_BOOTDIR=/usr/local/src/openjdk/soylatte16-i386-1.0.3  ALT_BINARY_PLUGS_PATH=/usr/local/src/openjdk/jdk-7-icedtea-plugs  ALT_CUPS_HEADERS_PATH=/usr/include  ALT_FREETYPE_LIB_PATH=/usr/X11R6/lib  ALT_FREETYPE_HEADERS_PATH=/usr/X11R6/include  gmake clean

Enfin, il est bien sûr simple de maintenir vos sources à jour en utilisant Mercurial. Voici les commandes à lancer depuis le répertoire ‘bsd-port’:

 LC_ALL='C' hg fincoming LC_ALL='C' hg fpull LC_ALL='C' hg fupdate

Nota Bene 1: cette compilation est basée sur le changeset 55:310ab698eb58, avec le patch corrigeant des erreurs de cast de pointeurs dans HotSpot que j’ai envoyé à la liste bsd-port-dev@openjdk.java.net, cf mail. Mon patch est basé sur celui de Michael Franz, un grand merci à lui. Normalement tout ceci (ou des variantes) vient d’être committé dans le bsd-port, il est donc probable que tout compile immédiatement, sans patch supplémentaire.
Nota Bene 2: cette compilation produit une JVM 32 bits. Produire une JVM 64 bits nécessite de passer la variable d’environnement LP64=1.
Nota Bene 3: cet article a été écrit avec les outils suivants:

 $ ant -version Apache Ant version 1.7.1 compiled on June 27 2008 $ uname -a Darwin pasiphae 9.6.0 Darwin Kernel Version 9.6.0: Mon Nov 24 17:37:00 PST 2008; root:xnu-1228.9.59~1/RELEASE_I386 i386 $ xcodebuild -version Xcode 3.1.1 Component versions: DevToolsCore-1114.0; DevToolsSupport-1102.0 BuildVersion: 9M2517 $ gcc -v Using built-in specs. Target: i686-apple-darwin9 Configured with: /var/tmp/gcc/gcc-5488~2/src/configure --disable-checking -enable-werror --prefix=/usr --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-transform-name=/^[cg][^.-]*$/s/$/-4.0/ --with-gxx-include-dir=/include/c++/4.0.0 --with-slibdir=/usr/lib --build=i686-apple-darwin9 --with-arch=apple --with-tune=generic --host=i686-apple-darwin9 --target=i686-apple-darwin9 Thread model: posix gcc version 4.0.1 (Apple Inc. build 5488)

Une réflexion sur “OpenJDK 7 sur Mac OS X

  • 19 février 2009 à 23 h 00 min
    Permalien

    Il y en a qui sont capables de marier Pasiphae à Darwin… Au moins un, et pas des moindres. Finalement tout est lié : f… with the best, die with the rest, n’est-ce pas du darwinisme ? Il a fallu attendre ce soir pour que tout s’éclaire !

    Répondre

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

%d blogueurs aiment cette page :