Construire son système personnel sur carte Pandaboard (5)

Publié par cpb
Juin 17 2011

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&eacute;n&eacute;r&eacute; 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.

Apache et PHP sur Pandaboard

URL de trackback pour cette page