La librairie graphique libjpeg 8c (8.3.0), compilation sur Sun Solaris 10 X86 64 bits

Introduction

La librairie graphique libjpeg est utilisée par de nombreux produits comme gnuplot ou encore PHP et JPgraph pour générer des images au format *.jpg, *.jpeg (Joint Photographic Experts Group).

La compilation de la version 8c (8.3.0) de la librairie libjpeg en 64 bits avec SunStudio 12.1 sur une plateforme Solaris 10 x86 64 bits est présentée dans cet article. Pour plus d'informations sur l'installation des compilateurs SunStudio 12.1 : Installation de Sun Studio 12 sur Sun Solaris 10 X86 pour les compilations.

Téléchargement et préparation de l'environnement

Téléchargement

libjpeg 8c est disponible en téléchargement sous la forme d'une archive compressée (jpegsrc.v8c.tar.gz) à cette adresse : libjpeg 8c > ijg.org Download.

L'archive compressée jpegsrc.v8c.tar.gz est transférée avec ftp sur la machine cible dans le répertoire /Software/tools/temp puis décompressée et désarchivée avec les utilitaires gunzip et tar :

% cd /Software/tools/temp
% gunzip -c jpegsrc.v8c.tar.gz | tar xvf -

Le code source est alors désarchivé avec la commande tar dans le sous répertoire ./jpec-8c.

Préparation de l'environnement pour la compilation de libjpeg 8c (8.3.0) avec SunStudio 64 bits

La variable $PATH est mise à jour avant la compilation pour référencer /usr/ccs/bin, répertoire qui contient les binaire ld et ar, indispensables pour la génération des librairies dynamiques et archives.

% PATH=/usr/ccs/bin:$PATH
% export PATH

Si les liens de SunStudio n'ont pas été installés dans /usr/bin lors de l'installation, la variable $PATH doit référencer également le répertoire <répertoire de sunstudio 12.1>/bin pour trouver les compilateurs.

% PATH=/opt/sunstudio12.1/bin:$PATH
% export PATH

Comme il s'agit d'une compilation en 64 bits, la variable d'environnement $CFLAGS est créée et mise à jour à -m64 :

% CFLAGS=-m64
% export CFLAGS

Configuration, compilation et installation

Une fois l'environnement préparé (variables $PATH, $CFLAGS), la configuration de la compilation peut être déclenchée avec le script configure.

L'option --help renvoie les options de configuration (la sortie de l'option --help est allégée pour la lisibilité, seules les options qui nous intéressent sont consignées).

% cd /Software/tools/temp/jpec-8c

% ./configure --help
`configure' configures libjpeg 8.3.0 to adapt to many kinds of systems.

Usage: ./configure [OPTION]... [VAR=VALUE]...

 ...

Installation directories:
  --prefix=PREFIX         install architecture-independent files in PREFIX
                          [/usr/local]
  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
                          [PREFIX]

By default, `make install' will install all the files in
`/usr/local/bin', `/usr/local/lib' etc.  You can specify
an installation prefix other than `/usr/local' using `--prefix',
for instance `--prefix=$HOME'.

 ...

L'option --prefix est spécifiée ici afin de délocaliser l'installation de libjpeg 8c en dehors des répertoires systèmes /usr. L'installation est réalisée dans le répertoire /Software/tools/misc : --prefix=/Software/tools/misc (DIR).

La ligne de configuration de la compilation est donc la suivante dans cet exemple pratique :

% cd /Software/tools/temp/jpec-8c

% ./configure --prefix=/Software/tools/misc

L'environnement étant bien préparé (variables$PATH, $CFLAGS), la configuration se déroule sans problème.

La compilation et l'installation de libjpeg 8c sont réalisées avec les commandes make et make install qui s'exécutent également sans problème.

% cd /Software/tools/temp/jpec-8c
% make
% make test
% make install

La commande "make test" permet de tester la librairie libjpeg. Lors de ces tests, les divers exécutables, djpeg, cjpeg et jpegtran, sont testés dans la génération et le traitement des images *.jpg :

images out libjpeg test

% make test
...
 ./djpeg -dct int -ppm -outfile testout.ppm  ./testorig.jpg
 ./djpeg -dct int -bmp -colors 256 -outfile testout.bmp  ./testorig.jpg
 ./cjpeg -dct int -outfile testout.jpg  ./testimg.ppm
 ./djpeg -dct int -ppm -outfile testoutp.ppm ./testprog.jpg
 ./cjpeg -dct int -progressive -opt -outfile testoutp.jpg ./testimg.ppm
 ./jpegtran -outfile testoutt.jpg ./testprog.jpg
 ...

Architecture de libjpeg 8c

La compilation génère dans le répertoire DIR/lib la librairie archive statique libjpeg.a et la librairie dynamique libjpeg.so.8.3.0. Les liens symboliques libjpeg.so et libjpeg.so.8 pointent sur la librairie libjpeg.so.8.3.0.

3 exécutables sont générés dans le répertoire DIR/bin :

  • cjpeg: exécutable qui compresse au format jpg des images PPM, BMP, PGM et RLE.
  • djpeg : exécutable qui décompresse une image jpg dans les formats PPM, BMP, GIF, PGM, RLE ou Targa.
  • jpegtran : exécutable qui optimise et transforme des images jpg (rotation, optimisation, encodage, conversion en niveaux de gris...).

4 fichiers d'entête jconfig.h, jerror.h, jmorecfg.h et jpeglib.h sont générés dans le répertoire DIR/include. Le fichier d'entête jpeglib.h est le fichier d'entête principal dans lequel la version 8.3.0 est mentionnée :

% cat /Software/tools/misc/include/jpeglib.h
...
#define JPEG_LIB_VERSION        80      /* Compatibility version 8.0 */
#define JPEG_LIB_VERSION_MAJOR  8
#define JPEG_LIB_VERSION_MINOR  3
 ...

Ces fichiers d'entête devront être inclus lors de la compilation de produits qui en dépendent (PHP, gnuplot...).