La librairie graphique libpng 1.5.4, compilation sur Sun Solaris 10 X86 64 bits

Introduction

La librairie graphique libpng est utilisée par de nombreux produits comme gnuplot ou encore PHP et JPgraph pour générer des images au format *.png (Portable Network Graphics).

La compilation de la version 1.5.4 de la librairie libpng 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 .

La librairie libpng 1.5.4 est compilée avec la librairie de compression zlib version 1.2.5 64 bits, version recommandée et optimale pour les performances et la sécurité et afin de ne pas polluer les répertoires systèmes, la librairie libpng 1.5.4 n'est installée dans son répertoire par défaut /usr/local. Pour plus d'informations sur l'installation de zlib 1.2.5 avec SunStudio 12.1 : zlib 1.2.5, compilation sur Sun Solaris 10 X86 en 64 bits.

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

Téléchargement

libpng 1.5.4 est disponible en téléchargement sous la forme d'une archive compressée (libpng-1.5.4.tar.gz) à cette adresse : libpng 1.5.4 > Sourceforge Download.

L'archive compressée libpng-1.5.4.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 libpng-1.5.4.tar.gz | tar xvf -

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

Préparation de l'environnement pour la compilation de libpng 1.5.4 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

Dans le contexte de cette compilation, la version 1.2.3 de la librairie zlib existe déjà dans les répertoires systèmes /usr. Pour vérifier la version de zlib déjà disponible sur la plateforme Sun Solaris 10 x86, consulter l'entête du fichier zlib.h situé dans le répertoire /usr/include.

% cat /usr/include/zlib.h | more
...
#define ZLIB_VERSION "1.2.3"
 ...

La version zlib 1.2.5 64 bits, version recommandée pour libpng 1.5.4, est installée dans le répertoire /Software/tools/misc (pour plus d'informations sur l'installation de zlib 1.2.5 avecSunStudio 12.1 : zlib 1.2.5, compilation sur Sun Solaris 10X86 en 64 bits .). Les variables $CPPFLAGS et $LDFLAGS sont mises à jour pour pointer sur la version 1.2.5 64 bits de zlib (fichiers d'entête *.h et librairies) :

% cd /Software/tools/temp/libpng-1.5.4

% CPPFLAGS="-I/Software/tools/misc/include $CPPFLAGS"
% export CPPFLAGS

% LDFLAGS="-L/Software/tools/misc/lib $LDFLAGS"
% export LDFLAGS

La variable $CPPFLAGS pointe sur les fichiers zlib.h et zconf.h version 1.2.5 de la librairie zlib (/Software/tools/misc/include).

La variable $LDFLAGS pointe sur la librairie libz.so.1.2.5 de la librairie zlib.

Configuration, compilation et installation

Une fois l'environnement préparé (variables $PATH, $CFLAGS, $CPPFLAGS, $LDFLAGS), 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/libpng-1.5.4

% ./configure --help
`configure' configures libpng 1.5.4 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 libpng 1.5.4 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/libpng-1.5.4

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

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

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

% cd /Software/tools/temp/libpng-1.5.4
% make
% make test
% make install

La commande "make test" permet de tester la librairie libpng sur plusieurs aspects. Lors de ce test notamment, une image au format png, pngout.png, est générée dans le répertoire courant :

images out libpng test

% make test
Running tests.  For details see pngtest-log.txt
Running test-pngtest.sh
PASS: test-pngtest.sh
Running test-pngvalid-simple.sh
  PASS: pngvalid --standard
  PASS: pngvalid --standard --progressive-read
  PASS: pngvalid --standard --interlace
  PASS: pngvalid --standard --progressive-read --interlace
  PASS: pngvalid --size
  PASS: pngvalid --size --progressive-read
  PASS: pngvalid --transform
PASS: test-pngvalid-simple.sh
Running test-pngvalid-full.sh
  PASS: pngvalid --gamma-threshold
  PASS: pngvalid --gamma-transform
  PASS: pngvalid --gamma-sbit
  PASS: pngvalid --gamma-16-to-8
  PASS: pngvalid --gamma-background
  PASS: pngvalid --gamma-alpha-mode
  PASS: pngvalid --gamma-transform --expand16
  PASS: pngvalid --gamma-background --expand16
  PASS: pngvalid --gamma-alpha-mode --expand16

PASS: test-pngvalid-full.sh
==================
All 3 tests passed
==================

Le fichier de log pngtest-log.txt confirme qu'il s'agit bien de la version 1.2.5 de zlib qui est utilisée :

% cd /Software/tools/temp/libpng-1.5.4

% cat pngtest-log.txt | more
============ pngtest pngtest.png ==============

 Testing libpng version 1.5.4
   with zlib   version 1.2.5
 ...

Architecture de libpng

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

Lors de l'utilisation de la librairie dynamique libpng.so, l'environnement ($LD_LIBRARY_PATH) doit montrer une dépendance avec la librairie libz.so version 1.5.2. Cette dépendance peut être vérifiée avec la commande ldd :

% cd /Software/tools/misc/lib

% ldd libpng15.so
        libz.so =>       ./libz.so
        libm.so.2 =>     /lib/64/libm.so.2
        libc.so.1 =>     /lib/64/libc.so.1

3 fichiers d'entête png.h,pngconf.h et pnglibconf.h sont générés dans le répertoire DIR/include. La version 1.5.4 est mentionnée dans le fichier d'entête png.h :

% cat /Software/tools/misc/include/png.h
#define PNG_LIBPNG_VER_STRING "1.5.4"

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