{"id":875,"date":"2011-06-17T12:00:10","date_gmt":"2011-06-17T11:00:10","guid":{"rendered":"http:\/\/www.blaess.fr\/christophe\/?p=875"},"modified":"2011-06-17T12:00:10","modified_gmt":"2011-06-17T11:00:10","slug":"construire-son-systeme-personnel-sur-carte-pandaboard-5","status":"publish","type":"post","link":"https:\/\/www.blaess.fr\/christophe\/2011\/06\/17\/construire-son-systeme-personnel-sur-carte-pandaboard-5\/","title":{"rendered":"Construire son syst\u00e8me personnel sur carte Pandaboard (5)"},"content":{"rendered":"<p style=\"text-align: justify;\">Nous avons install\u00e9 dans l&rsquo;<a title=\"Construire son syst\u00e8me personnel sur une carte Pandaboard (4)\" href=\"http:\/\/www.blaess.fr\/christophe\/2011\/06\/10\/construire-son-systeme-personnel-sur-une-carte-pandaboard-4\/\">article pr\u00e9c\u00e9dent<\/a> un serveur Apache sur une carte Pandaboard en le cross-compilant &#8211; non sans mal. En effet, ce serveur n&rsquo;est pas particuli\u00e8rement pr\u00e9vu pour \u00eatre compil\u00e9 sur un syst\u00e8me embarqu\u00e9.<\/p>\n<p style=\"text-align: justify;\">Nous allons aborder une seconde \u00e9tape assez \u00e9pique&nbsp;: <strong>la compilation de PHP<\/strong>. Comme on peut s&rsquo;y attendre, il n&rsquo;est pas non plus pr\u00e9vu pour \u00eatre facilement cross-compil\u00e9 (apr\u00e8s tout, un \u00e9l\u00e9phant sur un syst\u00e8me embarqu\u00e9&#8230;) et nous devrons emprunter des voies d\u00e9tourn\u00e9es pour atteindre notre but&nbsp;!<\/p>\n<p>\n<!--more-->\n<\/p>\n<h2 style=\"text-align: justify;\">Configuration de PHP<\/h2>\n<p style=\"text-align: justify;\">Premi\u00e8rement, nous allons t\u00e9l\u00e9charger et d\u00e9compresser les sources de PHP&nbsp;:<\/p>\n<pre>[~]$ <strong>cd Projets\/Panda\/<\/strong>\n[Panda]$ <strong>wget <a title=\"http:\/\/fr2.php.net\/get\/php-5.3.6.tar.bz2\/from\/this\/mirror\" href=\"http:\/\/fr2.php.net\/get\/php-5.3.6.tar.bz2\/from\/this\/mirror\">http:\/\/fr2.php.net\/get\/php-5.3.6.tar.bz2\/from\/this\/mirror<\/a><\/strong>\n--2011-06-16 18:31:35--  http:\/\/fr2.php.net\/get\/php-5.3.6.tar.bz2\/from\/this\/mirror\n[...]\n2011-06-16 18:31:47 (965 KB\/s) - \u00abphp-5.3.6.tar.bz2\u00bb sauvegard\u00e9 [10952171\/10952171]\n[Panda]$ <strong>tar -xjf php-5.3.6.tar.bz2<\/strong>\n[Panda]$ <strong>cd php-5.3.6<\/strong>\n[php-5.3.6]$<\/pre>\n<p style=\"text-align: justify;\">Nous allons devoir modifier le script <code>configure<\/code> qui pr\u00e9pare la compilation. En effet celui-ci essaye de d\u00e9terminer s&rsquo;il peut optimiser les op\u00e9rations en virgules flottantes en les codant directement en assembleur. Rien ne l&#8217;emp\u00eachera de compiler son test, mais il ne pourra bien entendu pas le faire s&rsquo;ex\u00e9cuter car le programme devrait tourner sur un autre processeur. Nous allons contourner le test et donner des valeurs par d\u00e9faut \u00e0 certaines constantes de configuration. Les commandes <code>sed<\/code> que j&rsquo;indique ci-dessous peuvent tr\u00e8s bien \u00eatre r\u00e9alis\u00e9es \u00e0 la main ou dans un \u00e9diteur de texte. Je les utilise ici car je pense que c&rsquo;est la mani\u00e8re la plus reproductible de d\u00e9crire la modification \u00e0 apporter.<\/p>\n<pre>[php-5.3.6]$ <strong>sed -i -e 's\/ac_cfp_have__fpu_setcw=yes\/ac_cfp_have__fpu_setcw=no\/' configure<\/strong>\n[php-5.3.6]$ <strong>sed -i -e 's\/ac_cfp_have_fpsetprec=yes\/ac_cfp_have_fpsetprec=no\/' configure<\/strong>\n[php-5.3.6]$ <strong>sed -i -e 's\/ac_cfp_have__controlfp=yes\/ac_cfp_have__controlfp=no\/' configure<\/strong>\n[php-5.3.6]$ <strong>sed -i -e 's\/ac_cfp_have__controlfp_s=yes\/ac_cfp_have__controlfp_s=no\/' configure<\/strong>\n[php-5.3.6]$ <strong>sed -i -e 's\/ac_cfp_have_fpu_inline_asm_x86=yes\/ac_cfp_have_fpu_inline_asm_x86=no\/' configure<\/strong><\/pre>\n<p style=\"text-align: justify;\">Lors de la configuration, le script va ex\u00e9cuter la commande <code>apxs<\/code> pour conna\u00eetre la configuration du serveur Apache pour lequel il doit cr\u00e9er un nouveau module. Cette commande <code>apxs<\/code> est elle-m\u00eame un script qui a \u00e9t\u00e9 g\u00e9n\u00e9r\u00e9 lors de la compilation d&rsquo;Apache. Il se trouve dans <code>\/server\/bin<\/code>. Petit souci&nbsp;: le script v\u00e9rifie que le serveur <code>httpd<\/code> soit bien pr\u00e9sent en essayant de le lancer&nbsp;! Mais il n&rsquo;est pas compil\u00e9 pour le bon processeur et la configuration \u00e9choue.<\/p>\n<p style=\"text-align: justify;\">Pour contourner ce probl\u00e8me, nous allons modifier le script <code>apxs<\/code> pour mettre en commentaire la portion qui essaye de lancer le serveur. Je vous propose d&rsquo;utiliser le petit patch ci-dessous. En cas de souci, sachez qu&rsquo;il suffit de mettre en commentaire (avec des <code>#<\/code>) la zone suivante\u00a0du fichier <code>\/server\/bin\/apxs<\/code> :<\/p>\n<pre style=\"padding-left: 30px;\">unless (grep \/mod_so\/, `. $envvars &amp;&amp; $httpd -l`) {\n    error(\"Sorry, no shared object support for Apache\");\n    error(\"available under your platform. Make sure\");\n    error(\"the Apache module mod_so is compiled into\");\n    error(\"your server binary `$httpd'.\");\n    exit 1;\n}<\/pre>\n<p style=\"text-align: justify;\">Voici l&rsquo;utilisation du patch&nbsp;:<\/p>\n<pre>[Panda]$ <strong>su -<\/strong>\nMot de passe :\n[root@tr-a-0 ~]#<strong> cd \/server\/bin\/<\/strong>\n[root@tr-a-0 bin]#<strong> patch -p0 &lt; <a title=\"http:\/\/www.blaess.fr\/christophe\/files\/article-2011-06-17\/apxs-commente.patch\" href=\"http:\/\/www.blaess.fr\/christophe\/files\/article-2011-06-17\/apxs-commente.patch\">apxs-commente.patch<\/a> <\/strong>\npatching file apxs\n[root@tr-a-0 bin]# <strong>exit<\/strong>\n[Panda]$<\/pre>\n<p style=\"text-align: justify;\">A pr\u00e9sent, nous pouvons lancer la configuration&nbsp;:<\/p>\n<pre>[php-5.3.6]$ <strong>.\/configure --host=arm-generic-linux-gnueabi --disable-all --prefix=\/server --with-apxs2=\/server\/bin\/apxs<\/strong>\ncreating cache .\/config.cache\nchecking for Cygwin environment... no\nchecking for mingw32 environment... no\nchecking for egrep... grep -E\nchecking for a sed that does not truncate output... \/bin\/sed\nchecking host system type... arm-generic-linux-gnueabi\nchecking target system type... arm-generic-linux-gnueabi\n[...]\ncreating main\/internal_functions.c\ncreating main\/internal_functions_cli.c\n+--------------------------------------------------------------------+\n| License:                                                           |\n| This software is subject to the PHP License, available in this     |\n| distribution in the file LICENSE.  By continuing this installation |\n| process, you are bound by the terms of this license agreement.     |\n| If you do not agree with the terms of this license, you must abort |\n| the installation process at this point.                            |\n+--------------------------------------------------------------------+\n\nThank you for using PHP.\n\n[php-5.3.6]$<\/pre>\n<h2 style=\"text-align: justify;\">Compilation de PHP<\/h2>\n<p style=\"text-align: justify;\">Pr\u00eat pour la cross-compilation&nbsp;? Non, pas tout \u00e0 fait&nbsp;! Le script <code>configure<\/code> ne tient pas vraiment compte du nom du compilateur, il utiliser  <code>gcc<\/code> sans se soucier de nos options&#8230; Nous devons modifier le Makefile pour remplacer <code>gcc<\/code> par <code>arm-generic-linux-gnueabi-gcc<\/code> :<\/p>\n<pre>[php-5.3.6]$ <strong>sed -i -e 's\/gcc\/arm-generic-linux-gnueabi-gcc\/' Makefile<\/strong>\n[php-5.3.6]$<\/pre>\n<p style=\"text-align: justify;\">Et la m\u00eame chose pour les utilitaires mentionn\u00e9s dans le script <code>libtool<\/code> qui r\u00e9alise l&rsquo;\u00e9dition des liens&nbsp;:<\/p>\n<pre>[php-5.3.6]$ <strong>sed -i -e 's\/\"ar\"\/\"arm-generic-linux-gnueabi-ar\"\/' libtool<\/strong>\n[php-5.3.6]$ <strong>sed -i -e 's\/\"gcc\"\/\"arm-generic-linux-gnueabi-gcc\"\/' libtool<\/strong>\n[php-5.3.6]$ <strong>sed -i -e 's\/\"strip\"\/\"arm-generic-linux-gnueabi-strip\"\/' libtool<\/strong>\n[php-5.3.6]$ <strong>sed -i -e 's\/\"objdump\"\/\"arm-generic-linux-gnueabi-objdump\"\/' libtool<\/strong>\n[php-5.3.6]$ <strong>sed -i -e 's\/\"as\"\/\"arm-generic-linux-gnueabi-as\"\/' libtool<\/strong>\n[php-5.3.6]$ <strong>sed -i -e 's\/\"ranlib\"\/\"arm-generic-linux-gnueabi-ranlib\"\/' libtool<\/strong><\/pre>\n<p><strong> <\/strong><\/p>\n<p><strong> <\/strong><\/p>\n<p style=\"text-align: justify;\">Pour la ligne suivante, le script contient le chemin de <code>ld<\/code>. Pour \u00e9viter d&rsquo;avoir \u00e0 pr\u00e9fixer tous les <code>\/<\/code> du chemin par des <code><\/code>, je pr\u00e9f\u00e8re remplacer les <code>\/<\/code> de la commande de substitution de <code>sed<\/code> par des <code>!<\/code>.<\/p>\n<pre>[php-5.3.6]$ <strong>sed -i -e 's!\"\/usr\/bin\/ld\"!\"arm-generic-linux-gnueabi-ld\"!' libtool<\/strong><\/pre>\n<p>Nous pouvons maintenant lancer enfin la compilation&#8230;<\/p>\n<pre>[php-5.3.6]$ <strong>make<\/strong>\n\/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\n[...]\nBuild complete.\nDon't forget to run 'make test'.\n[php-5.3.6]$<\/pre>\n<p style=\"text-align: justify;\">Contrairement \u00e0 ce que nous demande la cha\u00eene de compilation de Php, nous n&rsquo;allons pas ex\u00e9cuter le <code>make test<\/code>. En effet, elle essaye alors de compiler des exemples (pour la cible embarqu\u00e9e) et de les ex\u00e9cuter (sur l&rsquo;h\u00f4te de d\u00e9veloppement), ce qui ne donne vraiment pas de bons r\u00e9sultats&nbsp;!<\/p>\n<h2 style=\"text-align: justify;\">Installation de PHP<\/h2>\n<pre>[php-5.3.6]$ <strong>su<\/strong>\nMot de passe :\n[root@tr-a-0 php-5.3.6]# <strong>make install<\/strong>\nInstalling PHP SAPI module:       apache2handler\n\/server\/build\/instdso.sh SH_LIBTOOL='\/server\/build\/libtool' libphp5.la \/server\/modules\n\/server\/build\/libtool --mode=install cp libphp5.la \/server\/modules\/\n[...]\nInstalling man pages:             \/server\/man\/man1\/\n  page: phpize.1\n  page: php-config.1\n[root@tr-a-0 php-5.3.6]#<\/pre>\n<p>Nous pouvons v\u00e9rifier la pr\u00e9sence d&rsquo;un module pour Apache qui vient d&rsquo;\u00eatre ajout\u00e9&nbsp;:<\/p>\n<pre>[root@tr-a-0 php-5.3.6]# <strong>ls -l \/server\/modules\/<\/strong>\ntotal 8832\n-rw-rw-r-- 1 root\u00a0root\u00a0 \u00a0 9149 \u00a09 juin \u00a008:37 httpd.exp\n-rwxr-xr-x 1 root root 9030634 13 juin \u00a021:57 libphp5.so\n[root@tr-a-0 php-5.3.6]#<\/pre>\n<p>Pour les tests, nous allons ajouter un petit script PHP dans le r\u00e9pertoire <code>\/server\/htdocs\/<\/code> (\u00e0 c\u00f4t\u00e9 du fichier <code>index.html<\/code> fourni par d\u00e9faut avec Apache&nbsp;:<\/p>\n<pre><strong>\/server\/htdocs\/essai.php :<\/strong>\n&lt;html&gt;\n&lt;head&gt;&lt;title&gt;Essai avec PHP&lt;\/title&gt;&lt;\/head&gt;\n&lt;body&gt;\n&lt;?php  echo \"Ce message est g&amp;eacute;n&amp;eacute;r&amp;eacute; par un script PHP\"; ?&gt;\n&lt;\/body&gt;\n&lt;\/html&gt;<\/pre>\n<p style=\"text-align: justify;\">Puis nous devrons ajouter deux lignes au fichier de configuration d&rsquo;Apache, qui se trouve dans\u00a0<code>\/server\/conf\/httpd.conf<\/code>. Juste sous la ligne&nbsp;:<\/p>\n<pre>LoadModule php5_module        modules\/libphp5.so<\/pre>\n<p style=\"text-align: justify;\">(qui a \u00e9t\u00e9 ins\u00e9r\u00e9e lors de l&rsquo;installation de Php), nous ajoutons la ligne&nbsp;:<\/p>\n<pre>AddHandler   php5-script  php<\/pre>\n<p style=\"text-align: justify;\">Et dans la section <code>mime_module<\/code> qui contient plusieurs lignes commen\u00e7ant par <code>AddType<\/code>, ajoutons la ligne&nbsp;:<\/p>\n<pre> AddType text\/html       php<\/pre>\n<p style=\"text-align: justify;\">Transf\u00e9rons l&rsquo;image du serveur sur notre cible, d\u00e9compressons-la, et lan\u00e7ons Apache&nbsp;:<\/p>\n<pre>[php-5.3.6]$ <strong>su -<\/strong>\nMot de passe :\n[root@tr-a-0 ~]# <strong>cd \/<\/strong>\n[root@tr-a-0 \/]# <strong>tar -xzf server.tar.gz server\/<\/strong>\n[root@tr-a-0 \/]#<strong> scp server.tar.gz root@192.168.3.152:\/<\/strong>\nroot@192.168.3.152's password:\nserver.tar.gz                                                            100% 5225KB   5.1MB\/s   00:01\n[root@tr-a-0 \/]# <strong>ssh root@192.168.3.152<\/strong>\nroot@192.168.3.152's password:\n[PANDA ~]#<strong> cd \/<\/strong>\n[PANDA \/]#<strong> tar -xzf server.tar.gz <\/strong>\n[PANDA \/]# <strong>\/server\/bin\/apachectl start<\/strong>\nhttpd: apr_sockaddr_info_get() failed for (none)\nhttpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName\n[PANDA \/]#<\/pre>\n<p>Il nous reste \u00e0 tester notre installation en demandant depuis un navigateur de notre syst\u00e8me h\u00f4te la page&nbsp;:<br \/>\n<code>http:\/\/192.168.3.152\/essai.php<\/code>.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-882\" title=\"Apache et PHP sur Pandaboard\" src=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2011\/06\/capture-php.gif\" alt=\"Apache et PHP sur Pandaboard\" width=\"400\" height=\"308\" \/><\/p>","protected":false},"excerpt":{"rendered":"<p>Nous avons install&eacute; dans l&rsquo;article pr&eacute;c&eacute;dent un serveur Apache sur une carte Pandaboard en le cross-compilant &ndash; non sans mal. En effet, ce serveur n&rsquo;est pas particuli&egrave;rement pr&eacute;vu pour &ecirc;tre compil&eacute; sur un syst&egrave;me embarqu&eacute;. Nous allons aborder une seconde &eacute;tape assez &eacute;pique&nbsp;: la compilation de PHP. Comme on peut s&rsquo;y attendre, il n&rsquo;est pas [&hellip;]<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,8],"tags":[],"class_list":["post-875","post","type-post","status-publish","format-standard","hentry","category-embarque","category-linux-2"],"_links":{"self":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/875","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/comments?post=875"}],"version-history":[{"count":0,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/875\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/media?parent=875"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/categories?post=875"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/tags?post=875"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}