Nous avons installé dans l’article précédent un serveur Apache sur une carte Pandaboard en le cross-compilant – non sans mal. En effet, ce serveur n’est pas particulièrement prévu pour être compilé sur un système embarqué.
Nous allons aborder une seconde étape assez épique : la compilation de PHP. Comme on peut s’y attendre, il n’est pas non plus prévu pour être facilement cross-compilé (après tout, un éléphant sur un système embarqué…) et nous devrons emprunter des voies détournées pour atteindre notre but !
Configuration de PHP
Premièrement, nous allons télécharger et décompresser les sources de PHP :
[~]$ cd Projets/Panda/ [Panda]$ wget http://fr2.php.net/get/php-5.3.6.tar.bz2/from/this/mirror --2011-06-16 18:31:35-- http://fr2.php.net/get/php-5.3.6.tar.bz2/from/this/mirror [...] 2011-06-16 18:31:47 (965 KB/s) - «php-5.3.6.tar.bz2» sauvegardé [10952171/10952171] [Panda]$ tar -xjf php-5.3.6.tar.bz2 [Panda]$ cd php-5.3.6 [php-5.3.6]$
Nous allons devoir modifier le script configure
qui prépare la compilation. En effet celui-ci essaye de déterminer s’il peut optimiser les opérations en virgules flottantes en les codant directement en assembleur. Rien ne l’empêchera de compiler son test, mais il ne pourra bien entendu pas le faire s’exécuter car le programme devrait tourner sur un autre processeur. Nous allons contourner le test et donner des valeurs par défaut à certaines constantes de configuration. Les commandes sed
que j’indique ci-dessous peuvent très bien être réalisées à la main ou dans un éditeur de texte. Je les utilise ici car je pense que c’est la manière la plus reproductible de décrire la modification à apporter.
[php-5.3.6]$ sed -i -e 's/ac_cfp_have__fpu_setcw=yes/ac_cfp_have__fpu_setcw=no/' configure [php-5.3.6]$ sed -i -e 's/ac_cfp_have_fpsetprec=yes/ac_cfp_have_fpsetprec=no/' configure [php-5.3.6]$ sed -i -e 's/ac_cfp_have__controlfp=yes/ac_cfp_have__controlfp=no/' configure [php-5.3.6]$ sed -i -e 's/ac_cfp_have__controlfp_s=yes/ac_cfp_have__controlfp_s=no/' configure [php-5.3.6]$ sed -i -e 's/ac_cfp_have_fpu_inline_asm_x86=yes/ac_cfp_have_fpu_inline_asm_x86=no/' configure
Lors de la configuration, le script va exécuter la commande apxs
pour connaître la configuration du serveur Apache pour lequel il doit créer un nouveau module. Cette commande apxs
est elle-même un script qui a été généré lors de la compilation d’Apache. Il se trouve dans /server/bin
. Petit souci : le script vérifie que le serveur httpd
soit bien présent en essayant de le lancer ! Mais il n’est pas compilé pour le bon processeur et la configuration échoue.
Pour contourner ce problème, nous allons modifier le script apxs
pour mettre en commentaire la portion qui essaye de lancer le serveur. Je vous propose d’utiliser le petit patch ci-dessous. En cas de souci, sachez qu’il suffit de mettre en commentaire (avec des #
) la zone suivante du fichier /server/bin/apxs
:
unless (grep /mod_so/, `. $envvars && $httpd -l`) { error("Sorry, no shared object support for Apache"); error("available under your platform. Make sure"); error("the Apache module mod_so is compiled into"); error("your server binary `$httpd'."); exit 1; }
Voici l’utilisation du patch :
[Panda]$ su - Mot de passe : [root@tr-a-0 ~]# cd /server/bin/ [root@tr-a-0 bin]# patch -p0 < apxs-commente.patch patching file apxs [root@tr-a-0 bin]# exit [Panda]$
A présent, nous pouvons lancer la configuration :
[php-5.3.6]$ ./configure --host=arm-generic-linux-gnueabi --disable-all --prefix=/server --with-apxs2=/server/bin/apxs creating cache ./config.cache checking for Cygwin environment... no checking for mingw32 environment... no checking for egrep... grep -E checking for a sed that does not truncate output... /bin/sed checking host system type... arm-generic-linux-gnueabi checking target system type... arm-generic-linux-gnueabi [...] creating main/internal_functions.c creating main/internal_functions_cli.c +--------------------------------------------------------------------+ | License: | | This software is subject to the PHP License, available in this | | distribution in the file LICENSE. By continuing this installation | | process, you are bound by the terms of this license agreement. | | If you do not agree with the terms of this license, you must abort | | the installation process at this point. | +--------------------------------------------------------------------+ Thank you for using PHP. [php-5.3.6]$
Compilation de PHP
Prêt pour la cross-compilation ? Non, pas tout à fait ! Le script configure
ne tient pas vraiment compte du nom du compilateur, il utiliser gcc
sans se soucier de nos options… Nous devons modifier le Makefile pour remplacer gcc
par arm-generic-linux-gnueabi-gcc
:
[php-5.3.6]$ sed -i -e 's/gcc/arm-generic-linux-gnueabi-gcc/' Makefile [php-5.3.6]$
Et la même chose pour les utilitaires mentionnés dans le script libtool
qui réalise l’édition des liens :
[php-5.3.6]$ sed -i -e 's/"ar"/"arm-generic-linux-gnueabi-ar"/' libtool [php-5.3.6]$ sed -i -e 's/"gcc"/"arm-generic-linux-gnueabi-gcc"/' libtool [php-5.3.6]$ sed -i -e 's/"strip"/"arm-generic-linux-gnueabi-strip"/' libtool [php-5.3.6]$ sed -i -e 's/"objdump"/"arm-generic-linux-gnueabi-objdump"/' libtool [php-5.3.6]$ sed -i -e 's/"as"/"arm-generic-linux-gnueabi-as"/' libtool [php-5.3.6]$ sed -i -e 's/"ranlib"/"arm-generic-linux-gnueabi-ranlib"/' libtool
Pour la ligne suivante, le script contient le chemin de ld
. Pour éviter d’avoir à préfixer tous les /
du chemin par des , je préfère remplacer les
/
de la commande de substitution de sed
par des !
.
[php-5.3.6]$ sed -i -e 's!"/usr/bin/ld"!"arm-generic-linux-gnueabi-ld"!' libtool
Nous pouvons maintenant lancer enfin la compilation…
[php-5.3.6]$ make /bin/sh /home/cpb/Projets/Panda/php-5.3.6/libtool --silent --preserve-dup-deps --mode=compile arm-generic-linux-gnueabi-gcc -Iext/date/lib -Iext/date/ -I/home/cpb/Projets/Panda/php-5.3.6/ext/date/ -DPHP_ATOM_INC -I/home/cpb/Projets/Panda/php-5.3.6/include -I/home/cpb/Projets/Panda/php-5.3.6/main -I/home/cpb/Projets/Panda/php-5.3.6 -I/home/cpb/Projets/Panda/php-5.3.6/ext/date/lib -I/home/cpb/Projets/Panda/php-5.3.6/ext/ereg/regex -I/home/cpb/Projets/Panda/php-5.3.6/TSRM -I/home/cpb/Projets/Panda/php-5.3.6/Zend -g -O2 -fvisibility=hidden -c /home/cpb/Projets/Panda/php-5.3.6/ext/date/lib/parse_date.c -o ext/date/lib/parse_date.lo [...] Build complete. Don't forget to run 'make test'. [php-5.3.6]$
Contrairement à ce que nous demande la chaîne de compilation de Php, nous n’allons pas exécuter le make test
. En effet, elle essaye alors de compiler des exemples (pour la cible embarquée) et de les exécuter (sur l’hôte de développement), ce qui ne donne vraiment pas de bons résultats !
Installation de PHP
[php-5.3.6]$ su Mot de passe : [root@tr-a-0 php-5.3.6]# make install Installing PHP SAPI module: apache2handler /server/build/instdso.sh SH_LIBTOOL='/server/build/libtool' libphp5.la /server/modules /server/build/libtool --mode=install cp libphp5.la /server/modules/ [...] Installing man pages: /server/man/man1/ page: phpize.1 page: php-config.1 [root@tr-a-0 php-5.3.6]#
Nous pouvons vérifier la présence d’un module pour Apache qui vient d’être ajouté :
[root@tr-a-0 php-5.3.6]# ls -l /server/modules/ total 8832 -rw-rw-r-- 1 root root 9149 9 juin 08:37 httpd.exp -rwxr-xr-x 1 root root 9030634 13 juin 21:57 libphp5.so [root@tr-a-0 php-5.3.6]#
Pour les tests, nous allons ajouter un petit script PHP dans le répertoire /server/htdocs/
(à côté du fichier index.html
fourni par défaut avec Apache :
/server/htdocs/essai.php : <html> <head><title>Essai avec PHP</title></head> <body> <?php echo "Ce message est généré par un script PHP"; ?> </body> </html>
Puis nous devrons ajouter deux lignes au fichier de configuration d’Apache, qui se trouve dans /server/conf/httpd.conf
. Juste sous la ligne :
LoadModule php5_module modules/libphp5.so
(qui a été insérée lors de l’installation de Php), nous ajoutons la ligne :
AddHandler php5-script php
Et dans la section mime_module
qui contient plusieurs lignes commençant par AddType
, ajoutons la ligne :
AddType text/html php
Transférons l’image du serveur sur notre cible, décompressons-la, et lançons Apache :
[php-5.3.6]$ su - Mot de passe : [root@tr-a-0 ~]# cd / [root@tr-a-0 /]# tar -xzf server.tar.gz server/ [root@tr-a-0 /]# scp server.tar.gz root@192.168.3.152:/ root@192.168.3.152's password: server.tar.gz 100% 5225KB 5.1MB/s 00:01 [root@tr-a-0 /]# ssh root@192.168.3.152 root@192.168.3.152's password: [PANDA ~]# cd / [PANDA /]# tar -xzf server.tar.gz [PANDA /]# /server/bin/apachectl start httpd: apr_sockaddr_info_get() failed for (none) httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName [PANDA /]#
Il nous reste à tester notre installation en demandant depuis un navigateur de notre système hôte la page :
http://192.168.3.152/essai.php
.