Compilation de PHP 5.0.5 sous Solaris 9

Introduction

Cet article décrit les étapes et les problèmes rencontrés lors de la compilation de PHP 5.0.5 sous Sun Solaris SPARC 2.9. Cette compilation est réalisée dans le contexte de la mise en place d'Insite Portal sous Solaris.

Dans le contexte de la compilation réalisée, la machine Solaris en question ne dispose d'aucun compilateur disponible, aussi la description de l'installation de tous les packages Solaris nécessaires pour la compilation est réalisée dans cette documentation.

Options PHP 5

Pour les futurs besoins de l'utilisation de PHP 5, les options de compilation PHP ci-dessous sont nécessaires :

Option PHP Description
oci8 Client Oracle Call Interface (/Software/oracle/app/product/9.2.0)
sybase-ct Client Sybase CT Library (/Software/sybase/sybase-12.5/OCS-12_5)
mysql Client Mysql (/Software/mysql/mysql-4.1)
libxml/ Librairie XML pour l'utilisation de SimpleXML
gd Librairie gd pour l'utilisation de JPGraph 2.0
zlib Libraire des fonctions de compression
png Librairie des images PNG pour pouvoir utiliser les fonctions PHP image% sur les images au format png (getimagesize etc...)
jpeg Librairie des images JPEG pour pouvoir utiliser les fonctions PHP image% sur les images au format jpeg (getimagesize etc...)
enable-calendar Activation du calendrier
enable-memory-limit Activation du bridage de la mémoire lors de l'exécution d'un script PHP5 (memory_limit = 8M dans le fichier php.ini)
enable-track-vars Activation de la recherche des variables HTTP/POST et HTTP/get
enable-trans-sid Activation du transport de la variable de session par les méthodes GET et POST

Dans une première phase (avant rencontre des erreurs), la ligne de commande de configuration de la compilation de PHP5 sous Solaris avec les options souhaitées est alors la suivante, sachant que toutes les librairies nécessaires (libxml, png etc..) sont installées par défaut dans le répertoire /usr/local/bin:


./configure --prefix=/Software/php5 \
  --with-oci8=/Software/oracle/app/product/9.2.0 \
  --with-sybase-ct=/Software/sybase/sybase-12.5/OCS-12_5 \
  --with-mysql=/Software/mysql/mysql-4.1 \
  --with-libxml \
  --with-jpeg-dir=/usr/local/bin \
  --with-zlib-dir=/usr/local/bin \
  --with-png-dir=/usr/local/bin \
  --with-gd \
  --enable-calendar \
  --enable-memory-limit \
  --enable-track-vars \
  --enable-trans-sid

L'option --prefix=/Software/php5 spécifie une installation de PHP 5 dans le répertoire /Software/php5.

Prérequis de la compilation PHP 5 sous Sun Solaris 2.9

Dans la documentation officielle PHP pour l'installation et la compilation de PHP sous Solaris, les packages Solaris ci-dessous sont nécessaires :

gcc                autoconf
make               automake
flex               perl
bison              gzip
m4                 tar
GNU sed

La commande pkginfo

La commande pkginfo de Solaris permet de déterminer si un package est déjà existant ou non sur la machine. Exemple pour déterminer si le package gcc est installé (dans cet exemple, le package est déjà installé juste pour démonstration) :

root@SRVUNXFR1 > pkginfo | grep 'gcc'
application SMCgcc342                        gcc
application SMClibgcc                        libgcc

Le site SunFreeWare

Les packages nécessaires sont disponibles sur le site Sunfreeware.com à la rubrique SPARC/Solaris 9 dans le contexte technique de cette documentation ( http://www.sunfreeware.com/indexsparc9.html).

A droite de l'écran sont donnés les liens vers tous les packages disponibles (exemple : gd-2.0.33) et le site donne également toutes les dépendances éventuelles d'un package.

Exemple pour gd-2.0.33 :

gd-2.0.33-sol9-sparc-local.gz : GD Graphics Library - An ANSI C library for the dynamic creation of images. GD creates PNG and JPEG images, among other formats - installs in /usr/local. The gd package requires the following library files - libXpm.so.4.11 from xpm, libfreetype.so.6 from freetype, libfontconfig.so.1 from fonctconfig, libgcc_s.so.1 from libgcc-3.3 or from gcc-3.3.2, libiconv.so.2 from libiconv, libpng12.so.0 from libpng, libz.so from zlib, libexpat.so.0 from expat, and libjpeg.so.62 from the jpeg package.

Les commandes pkgadd et pkgrm

La commande pkgadd avec l'option -d est utilisée pour ajouter un package Solaris. Dans le contexte de cette documentation, tous les packages zippés provenant de SunFreeWare sont installés dans le répertoire /export/home/compilation/packages et pour installer par exemple le package flex 2.5.31 :

root@SRVUNXFR1 > cd /export/home/compilation/packages
root@SRVUNXFR1 > gunzip flex-2.5.31-sol9-sparc-local
root@SRVUNXFR1 > pkgadd -dflex-2.5.31-sol9-sparc-local
      The following packages are available:
1 SMCflex flex
          (sparc) 2.5.31

      Select package(s) you wish to process
      (or 'all' to process all packages). (default: all) [?,??,q]: 1

La commande pkginfo confirme si package est effectivement installé :

root@SRVUNXFR1 > pkginfo | grep 'flex'
      application SMCflex flex

La commande pkgrm supprime un package Solaris :

root@SRVUNXFR1 > pkgrm flex

Téléchargement des sources PHP 5.0.5

Les sources PHP 5.0.5 (php-5.0.5.tar.gz) sont téléchargées à partir du site http://www.php.net/downloads.php et installées dans le répertoire /export/home/compilation/php5 avec le user root :

root@SRVUNXFR1 > cd /export/home/compilation/php5
root@SRVUNXFR1 > gunzip php-5.0.5.tar.gz
root@SRVUNXFR1 > tar xvf php-5.0.5.tar

A l'issue de la commande tar sur l'archive php-5.0.5.tar, les sources pour la compilation sont alors décompressées dans le répertoire /export/home/compilation/php5/php-5.0.5.

Installation des packages Solaris nécessaires pour PHP 5

Tous les packages GNU sont installés par défaut dans le répertoire /usr/local/, ce qui est le cas dans l'implémentation technique ici qui nous intéresse.

Installation des packages primaires

Compte tenu des dépendances, et notamment pour l'installation du package gcc version 3.4.2, le package libiconv version 1.8 est installé en premier :

root@SRVUNXFR1 > pkgadd -d libiconv-1.8-sol9-sparc-local

Puis les packages ci-dessous sont installés :

root@SRVUNXFR1 > pkgadd -d gcc-3.4.2-sol9-sparc-local
Package gcc 3.4.2
root@SRVUNXFR1 > pkgadd -d make-3.80-sol9-sparc-local
Package make 3.80
root@SRVUNXFR1 > pkgadd -d flex-2.5.31-sol9-sparc-local
Package flex 2.5.31
root@SRVUNXFR1 > pkgadd -d bison-1.875d-sol9-sparc-local
Package bison 1.875d
root@SRVUNXFR1 > pkgadd -d m4-1.4.2-sol9-sparc-local
Package m4 1.4.2
root@SRVUNXFR1 > pkgadd -d autoconf-2.59-sol9-sparc-local
Package autoconf 2.59
root@SRVUNXFR1 > pkgadd -d automake-1.9-sol9-sparc-local
Package automake 1.9
root@SRVUNXFR1 > pkgadd -d gzip-1.3-sol9-sparc-local
Package gzip 1.3
root@SRVUNXFR1 > pkgadd -d tar-1.15.1-sol9-sparc-local
Package tar 1.15.1
root@SRVUNXFR1 > pkgadd -d sed-4.1.1-sol9-sparc-local
Package GNU Sed 4.1.1

L'installation du package automake peut nécessiter le package perl, cependant il s'est avéré que le package perl n'a pas été nécessaire durant la compilation de PHP5 avec les options choisies.

Installation des packages liés aux librairies XML

La configuration de PHP5 avec l'option simpleXML génère une erreur si le package libxml2 n'est pas installé :

configure: error: libxml2 version 2.5.10 or greater required.

Le package libxml2 version 2.6.16 dépend uniquement des packages zlib, libiconv et gcc ou libgcc, cependant le package zlib n'est pas encore installé, d'où les installations ci-dessous :

root@SRVUNXFR1 > pkgadd -d zlib-1.2.3-sol9-sparc-local
Package zlib 1.2.3
root@SRVUNXFR1 > pkgadd -d libxml2-2.6.16-sol9-sparc-local
Package libxml2 2.6.16

Installation des packages liés aux librairies graphiques

Pour l'utilisation des librairies GD 2 (Graphics library), png et jpeg et compte tenu des dépendances de GD 2, les packages suivants sont installés dans l'ordre ci-dessous :

root@SRVUNXFR1 > pkgadd -d expat-1.95.5-sol9-sparc-local
Package expat 1.95.5
root@SRVUNXFR1 > pkgadd -d xpm-3.4k-sol9-sparc-local
Package xpm 3.4k
root@SRVUNXFR1 > pkgadd -d freetype-2.1.9-sol9-sparc-local
Package freetype 2.1.9
root@SRVUNXFR1 > pkgadd -d fontconfig-2.2.98-sol9-sparc-local
Package fontconfig 2.2.98
root@SRVUNXFR1 > pkgadd -d libpng-1.2.8-sol9-sparc-local
Package libpng 1.2.8
root@SRVUNXFR1 > pkgadd -d jpeg-6b-sol9-sparc-local
Package jpeg6b
root@SRVUNXFR1 > pkgadd -d gd-2.0.33-sol9-sparc-local
Package gd 2.0.33

Compilation et installation de PHP 5.0

Méthodologie de la compilation PHP 5.0 (configure, make, make install)

Pour réaliser la compilation de PHP 5.0.5, il faut se positionner dans le répertoire racine des sources PHP 5.0.5 /export/home/compilation/php5/php-5.0.5, ensuite bien affecter respectivement les répertoires /usr/local/bin et /usr/local/lib dans les variables d'environnement PATH et LD_LIBRARY_PATH pour retrouver les packages nécessaires lors de la compilation :

root@SRVUNXFR1 > cd /export/home/compilation/php5/php-5.0.5
root@SRVUNXFR1 > export PATH=/usr/local/bin:$PATH
root@SRVUNXFR1 > export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

puis la compilation est exécutée en lançant successivement les 3 étapes configure, make et make install ci-dessous :

Étape 1 : configuration de la compilation avec configure

./configure --prefix=/Software/php5 \
      --with-oci8=/Software/oracle/app/product/9.2.0 \
      ...

Étape 2 : construction des binaires avec make

./make

Étape 3 : installation de PHP 5 dans le répertoire spécifié avec l'option --prefix (/Software/php5) grâce à make install

./make install

Toutes les erreurs rencontrées et contournées lors de la compilation sont décrites dans le paragraphe qui suit.

Erreurs de compilation PHP 5 rencontrées

Problème de compilation Zend avec flex 2.5.31, upgrade vers flex 2.5.4

Pour PHP 5.0, la compilation du moteur Zend 2 rencontre une grave erreur. Cette erreur se produit avec les versions de flex inférieures à la version 2.5.4.

flex -Pzend -S/export/home/php5/php-5.0.5/Zend/flex.skl -oZend/zend_language_scanner.c
-i/export/home/php5/php-5.0.5/Zend/zend_language_scanner.le
make: *** [Zend/zend_language_scanner.c] Error 1

Pour résoudre ce problème, le package flex 2.5.31 doit être désinstallé pour être remplacé par la version flex 2.5.4. Toutefois à ce jour le package flex 2.5.4 n'est pas encore prêt et cette version doit être compilée manuellement.

Problèmes de compilation avec PEAR

Une erreur se produit lors de la compilation de PEAR avec la librairie libwtc8.so qui est une librairie Oracle 8

Installing PEAR environment: /Software/php5/lib/php/
ld.so.1: /export/home/compilation/php5/php-5.0.5/sapi/cli/php: fatal:
libwtc8.so: open failed: No such file or directory
Killed
make[1]: *** [install-pear-installer] Error 137
make: *** [install-pear] Error 2

Dans la configuration de la compilation, Oracle 9 est utilisé et non Oracle 8. Des contournements à problème sont possibles mais n'ont pas été mis en œuvre car PEAR n'est pas utile, toutefois pour contourner ce problème, le fichier /etc/ld.so.conf doit être mis à jour :

root@SRVUNXFR1> updatedb
root@SRVUNXFR1> locate lbwtc

Un autre problème pour la compilation de PEAR peut également se présenter avec XML :

ld.so.1: php: fatal: relocation error: file
/export/home/compilation/php5/php-5.0.5/sapi/cli/php: symbol
xmlRelaxNGCleanupTypes: referenced symbol not found
Killed
make[1]: *** [install-pear-installer] Error 137
make: *** [install-pear] Error 2

Cette erreur à due à la présence des packages XML Solaris SUNWlxml et SUNWlxmlx qui prennent le pas sur le package xml2 et il suffit de supprimer ces 2 packages avec pkgrm pour éviter cette erreur de compilation.

Pour les besoins futurs de PHP5, PEAR n'est pas utilisé aussi pour contourner cette erreur de compilation, l'option --without-pear est ajoutée dans la ligne de commande de configuration de la compilation de PHP5.

./configure --prefix=/Software/php5
      ...
      --without-pear

Problèmes de compilation avec sqlite

Par défaut, le support de la base de données sqlite est automatiquement embarqué dans la compilation de PHP 5, cependant une erreur grave se produit lors de la compilation de l'extension sqlite avec PHP 5 sous Solaris 2.9 :


bison -y
/export/home/compilation/php-5.0.5/ext/sqlite/libsqlite/src/parse.y
/export/home/compilation/php-5.0.5/ext/sqlite/libsqlite/src/parse.y :19 :
unrecognized : %token-prefix
/export/home/compilation/php-5.0.5/ext/sqlite/libsqlite/src/parse.y :19 :
Skipping to next %

Cette erreur vient du fait que le parser Lemon est nécessaire dans la ligne de commande ci-dessus en échec. Le parser Bison/yacc ne peut pas prendre en charge le fichier parse.y en raison d'une syntaxe spécifique au parser Lemon.

Pour les besoins futurs de PHP5, sqlite n'a pas d'intérêt aussi pour contourner cette erreur de compilation, l'option --without-sqlite est ajoutée dans la ligne de commande de configuration de la compilation de PHP 5.

./configure --prefix=/Software/php5 \
      ...
      --without-pear \
      --without-sqlite

Avertissement avec libiconv

Un avertissement non gravissime lors de la compilation est détecté avec la librairie iconv. Ces avertissements peuvent être ignorés et sont causés par des différences de prototype entre libiconv et glibc.


/export/home/compilation/php-5.0.5/libtool --silent --preserve-dup-deps
--mode=compile
gcc -I"/usr/local/include" -Iext/iconv/
-I/export/home/compilation/php-5.0.5/ext/iconv/ -DPHP_ATOM_INC
-I/export/home/compilation/php-5.0.5/include
-I/export/home/compilation/php-5.0.5/main
-I/export/home/compilation/php-5.0.5
-I/export/home/compilation/php-5.0.5/Zend -I/usr/local/include
-I/export/home/compilation/php-5.0.5/TSRM -g -O2 -prefer-pic -c
/export/home/compilation/php-5.0.5/ext/iconv/iconv.c -o
ext/iconv/iconv.lo
/export/home/compilation/php-5.0.5/ext/iconv/iconv.c: In
function`_php_iconv_appendl':
/export/home/compilation/php-5.0.5/ext/iconv/iconv.c:246: warning: passing
arg 2 of `libiconv' from incompatible pointer type
/export/home/compilation/php-5.0.5/ext/iconv/iconv.c: In function
`php_iconv_string':
/export/home/compilation/php-5.0.5/ext/iconv/iconv.c:406: warning: passing
arg 2 of `libiconv' from incompatible pointer type
/export/home/compilation/php-5.0.5/ext/iconv/iconv.c: In function
`_php_iconv_strlen':
/export/home/compilation/php-5.0.5/ext/iconv/iconv.c:520: warning: passing
arg 2 of `libiconv' from incompatible pointer type
/export/home/compilation/php-5.0.5/ext/iconv/iconv.c: In function
`_php_iconv_substr':
/export/home/compilation/php-5.0.5/ext/iconv/iconv.c:620: warning: passing
arg 2 of `libiconv' from incompatible pointer type
/export/home/compilation/php-5.0.5/ext/iconv/iconv.c: In function
`_php_iconv_strpos':
/export/home/compilation/php-5.0.5/ext/iconv/iconv.c:751: warning: passing
arg 2 of `libiconv' from incompatible pointer type
/export/home/compilation/php-5.0.5/ext/iconv/iconv.c: In function
`_php_iconv_mime_encode':
/export/home/compilation/php-5.0.5/ext/iconv/iconv.c:985: warning: passing
arg 2 of `libiconv' from incompatible pointer type
/export/home/compilation/php-5.0.5/ext/iconv/iconv.c:1073: warning: passing
arg 2 of `libiconv' from incompatible pointer type

Ligne de commande configure définitive

Les lignes de commande définitives pour la compilation de PHP5 sans erreurs sont alors les suivantes :

#!/bin/ksh
export PATH=/usr/local/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
      
./configure --prefix=/Software/php5 \
      --with-oci8=/Software/oracle/app/product/9.2.0 \
      --with-sybase-ct=/Software/sybase/sybase-12.5/OCS-12_5 \
      --with-mysql=/Software/mysql/mysql-4.1 \
      --with-libxml \
      --with-jpeg-dir=/usr/local/bin \
      --with-zlib-dir=/usr/local/bin \
      --with-png-dir=/usr/local/bin \
      --with-gd \
      --enable-calendar \
      --enable-memory-limit \
      --enable-track-vars \
      --enable-trans-sid \
      --without-pear \
      --without-sqlite

./make

./make install

Vérification de l'installation de PHP5 (fichier php.ini, php -m, ldd)

A l'issue de la compilation de PHP5 et l'étape make install, toute la distribution PHP 5 a été installée dans le répertoire /Software/php5. Il est nécessaire d'affecter alors le bon propriétaire au répertoire /Software/php5 car par défaut toute la distribution a été installée avec le user Unix root.

Par défaut dans un environnement Unix/linux, le fichier de configuration php.ini doit être créé dans le répertoire <install_dir_php>/lib ( soit /Software/php5/lib dans cet exemple).

Il est également possible de vérifier en ligne de commande les extensions disponibles et valides pour la distribution PHP 5 créée : pour cela il suffit de donner l'option -m au binaire php installé dans le répertoire <install_dir_php>/bin :

root@SRVUNXFR1 > cd /Software/php5/bin
root@SRVUNXFR1 > php -m
      [PHP Modules]
      bcmath
      calendar
      ctype
      gd
      iconv
      libxml
      mysql
      oci8
      session
      SimpleXML
      standard
      sybase_ct
      tokenizer
      zlib
      [Zend Modules]

La commande ldd lancée pour le binaire php permet également de déterminer les librairies dépendantes (Sybase, Oracle etc...) :

root@SRVUNXFR1 > ldd php