<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Artisan Numérique</title>
  <link rel="alternate" type="text/html" href="http://artisan.karma-lab.net/node/66"/>
  <link rel="self" type="application/atom+xml" href="http://artisan.karma-lab.net/node/66/atom/feed"/>
  <id>http://artisan.karma-lab.net/node/66/atom/feed</id>
  <updated>2008-10-01T01:36:10+02:00</updated>
  <entry>
    <title>Construire l&#039;environnement de Cross-Compilation pour pdaXrom</title>
    <link rel="alternate" type="text/html" href="http://artisan.karma-lab.net/node/66" />
    <id>http://artisan.karma-lab.net/node/66</id>
    <published>2006-10-13T00:00:00+02:00</published>
    <updated>2008-10-01T01:36:10+02:00</updated>
    <author>
      <name>Ulhume</name>
    </author>
    <category term="Zaurus" />
    <category term="Aucun" />
    <category term="OK" />
    <category term="Tutoriel" />
    <summary type="html"><![CDATA[<p>
  Le cross-compiler fournit avec <kbd>pdaXrom</kbd> est un vrai bonheur. Il permet de récupérer des sources d'applications manquantes dans la distribution et de les compiler de sort à être exécutable directement sur le Zaurus. Le "petit" tutorial suivant permet de mettre cela en oeuvre.</p>    ]]></summary>
    <content type="html"><![CDATA[<p>
  Le cross-compiler fournit avec <kbd>pdaXrom</kbd> est un vrai bonheur. Il permet de récupérer des sources d'applications manquantes dans la distribution et de les compiler de sort à être exécutable directement sur le Zaurus. Le "petit" tutorial suivant permet de mettre cela en oeuvre.</p>

<!-- break -->

	<a name='chapter_1'></a>
  <h2>Qu'est-ce donc qu'une cross-compilation ?</h2>
	
<p>
  Tout d'abord, prérequis de base, tout ce qui suit ne fonctionne que sous Linux. Quelques aventureux peuvent tenter l'équivalent sous <kbd>cygwin</kbd> mais je n'ai aucune idée sur la viabilité d'une telle chose. Pour ma part, j'utilise une Mandriva 2007.1 qui contient tout ce qui me sera nécessaire. 
</p>
<p>
  La cross-compilation permet dans sur une machine spécifique (hôte) de fabriquer des binaires pour une autre machine spécifique (cible). L'hôte est donc ici la Mandriva sur architecture i586 et la cible pdaXrom sur architecture ARM (le cpu du Zaurus). Pour pouvoir effectuer une telle opération, il faut donc disposer d'un compilateur (gcc) et l'ensemble des outils qui va avec (appelé tool-chain) qui s'exécute sur un i586 mais qui fabrique des binaire ARM. Une telle tool-chain est généreusement fournit avec pdaXrom . Il contient gcc, les utilitaires associés mais aussi toutes les librairies de base pour compiler une application moderne (gtk, qt, X, etc.). 
</p>
<p>
  Dans la majorité des cas, un système linux est installé avec sa propre tool-chain et ses propres librairies. C'est le cas de la Mandriva et l'on comprends sans peine qu'un des "danger" de la cross-compilation, est que le compilateur s'emmêle les pattes entres les librairies i586 de l'hôte et celles de pdaXrom (binaires ARM). La résolution de ce problème passe d'abord par une habile manipulation des variables d'environnements pour tromper le systèmes (PATH, LD_LIBRARY_PATH, etc...). Le plus gros de la magie est ensuite pris en charge par l'utilitaire de configuration fournit avec les sources qui va générer les scripts de construction qui vont bien (chaîne automake, autoconf). C'est grâce à cela qu'une application qui n'avait jamais été pensée pour cela peut finir sur l'écran de notre Zaurus préféré. 
</p>



	<a name='chapter_2'></a>
  <h2>Installation du kit de cross-compilation de pdaXrom</h2>
	
<p>
  La première chose à faire est d'installer cross-sdk-armv5tel-cacko-linux-3.4.6-2.2.5-softfloat.tar.bz2 (le lien est mort..) dédié à la cross-compilation. Ce paquet est à décompresser à la racine, donc en tant que <kbd>root</kbd>. Les commandes suivantes vont se charger de cette tâche et le cross-compiler pdaXrom sera installé en <kbd>/opt/cross</kbd>. 
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <a target="blank" href="http://pwet.fr/man/linux/commandes/sudo"><span class="kw2">sudo</span></a> <a target="blank" href="http://pwet.fr/man/linux/commandes/su"><span class="kw2">su</span></a> -<br />
<span class="kw3">cd</span> <span class="sy0">/</span><br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/wget"><span class="kw2">wget</span></a> http:<span class="sy0">//</span>www.pdaxrom.org<span class="sy0">/</span>download<span class="sy0">/</span><span class="nu0">1.1</span>.0r121<span class="sy0">/</span>Zaurus-7x0<span class="nu0">-860</span><span class="sy0">/</span>cross-sdk-armv5tel-cacko-linux<span class="nu0">-3.4</span><span class="nu0">.6</span><span class="nu0">-2.2</span><span class="nu0">.5</span>-softfloat.<a target="blank" href="http://pwet.fr/man/linux/commandes/tar"><span class="kw2">tar</span></a>.bz2<br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/tar"><span class="kw2">tar</span></a> -jxvf sources<span class="sy0">/</span>cross-sdk-armv5tel-cacko-linux<span class="nu0">-3.4</span><span class="nu0">.6</span><span class="nu0">-2.2</span><span class="nu0">.5</span>-softfloat.<a target="blank" href="http://pwet.fr/man/linux/commandes/tar"><span class="kw2">tar</span></a>.bz2<br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/chmod"><span class="kw2">chmod</span></a> gou+rX <span class="sy0">/</span>opt<span class="sy0">/</span>cross -R<br />
<span class="kw3">exit</span>
  </div>
  
  </div>
  Voilà, nous avons maintenant en <kbd>/opt/cross</kbd> un ensemble assez important de fichiers comprenant toutes les librairies ainsi que le fameux compilateur de binaire pour architecture ARM. Il ne reste plus qu'à passer à l'action <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/smile.gif" title="Smiling" alt="Smiling" class="smiley-content"/>
</p>


	<a name='chapter_3'></a>
  <h2>Création de l'environnement de compilation</h2>
	
<p>
  Une fois le kit installé, nous allos créer notre environnement de compilation d'application pdaXrom pour Zaurus. 
  Tout ce qui suit n'a pas besoin d'être effectué en tant que root. En tout premier lieu, il faut créer sur l'ordinateur hôte un dossier qui va tout contenir. Dans cet exemple, le dossier sera <kbd>~/pdaXrom</kbd>. Nous allons ensuite créer les dossiers suivants :
  

  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="co0"># création de la racine</span><br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/mkdir"><span class="kw2">mkdir</span></a> ~<span class="sy0">/</span>pdaXrom<br />
<span class="kw3">cd</span> ~<span class="sy0">/</span>pdaXrom<br />
<br />
<span class="co0"># dossier contenant les tarballs</span><br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/mkdir"><span class="kw2">mkdir</span></a> sources<br />
<br />
<span class="co0"># dossier contenant les ipk</span><br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/mkdir"><span class="kw2">mkdir</span></a> feed<br />
<br />
<span class="co0"># dossier contenant les sources en cours de compilation</span><br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/mkdir"><span class="kw2">mkdir</span></a> build<br />
<br />
<span class="co0"># nos futurs scripts d'automatisation</span><br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/mkdir"><span class="kw2">mkdir</span></a> script &nbsp;
  </div>
  
  </div>
</p>


	<a name='chapter_4'></a>
  <h2>Création du script d'initialisation</h2>
	
<p>
  Pour éviter de se perdre dans les commandes à taper, un petit script à lancer avant toute compilation va nous être bien utile. Il va initializer un certain nombre de variable d'environnement et nous placer dans un sous-shell nous permettant de nous concentrer sur le seul portage. Une fois votre session de compilation terminé, il suffira de tape <kbd>exit</kbd> pour revenir à votre environnement normale.
  </p>
  <p>
  Le script est à stocker dans le fichier <kbd>./script/start.sh</kbd> :
 
  <div class='code-block code-block-fragment'>
  <div class='container'>
  &nbsp; &nbsp; <span class="co0"># recherche de la racine de notre builder</span><br />
&nbsp; &nbsp; <span class="kw3">pushd</span> $<span class="br0">&#40;</span><a target="blank" href="http://pwet.fr/man/linux/commandes/dirname"><span class="kw2">dirname</span></a> $<span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">/</span>.. <span class="sy0">&gt;</span> <span class="sy0">/</span>dev<span class="sy0">/</span>null<br />
&nbsp; &nbsp; <span class="kw3">export</span> <span class="re2">BUILDER_HOME=</span><span class="re1">$PWD</span><br />
&nbsp; &nbsp; <span class="kw3">popd</span> <span class="sy0">&gt;</span> <span class="sy0">/</span>dev<span class="sy0">/</span>null<br />
<br />
&nbsp; &nbsp; <span class="co0"># Définition des divers variables de compilation</span><br />
&nbsp; &nbsp; <span class="kw3">export</span> <span class="re2">CROSS_COMPILER_HOME=</span><span class="sy0">/</span>opt<span class="sy0">/</span>cross<span class="sy0">/</span>arm<span class="sy0">/</span><span class="nu0">3.4</span><span class="nu0">.6</span>-xscale-softvfp<br />
&nbsp; &nbsp; <span class="kw3">export</span> <span class="re2">PATH=</span><span class="re1">$CROSS_COMPILER_HOME</span><span class="sy0">/</span>bin:<span class="re1">$PATH</span><br />
&nbsp; &nbsp; <span class="kw3">export</span> <span class="re2">QTDIR=</span><span class="re1">$CROSS_COMPILER_HOME</span><span class="sy0">/</span>armv5tel-cacko-linux<span class="sy0">/</span>qt<br />
&nbsp; &nbsp; <span class="kw3">export</span> <span class="re2">KDEDIR=</span><span class="re1">$CROSS_COMPILER_HOME</span><span class="sy0">/</span>armv5tel-cacko-linux<span class="sy0">/</span>qt<br />
&nbsp; &nbsp; <span class="kw3">export</span> <span class="re2">X11INC=</span><span class="re1">$CROSS_COMPILER_HOME</span><span class="sy0">/</span>armv5tel-cacko-linux<span class="sy0">/</span>include<br />
&nbsp; &nbsp; <span class="kw3">export</span> <span class="re2">X11LIB=</span><span class="re1">$CROSS_COMPILER_HOME</span><span class="sy0">/</span>armv5tel-cacko-linux<span class="sy0">/</span>lib<br />
&nbsp; &nbsp; <span class="kw3">export</span> <span class="re2">PKG_CONFIG_PATH=</span><span class="re1">$CROSS_COMPILER_HOME</span><span class="sy0">/</span>armv5tel-cacko-linux<span class="sy0">/</span>lib<span class="sy0">/</span>pkgconfig:<span class="sy0">/</span>usr<span class="sy0">/</span>lib<span class="sy0">/</span>pkgconfig<br />
&nbsp; &nbsp; <span class="kw3">export</span> <span class="re2">CPPFLAGS=</span><span class="st0">&quot;-O3&quot;</span><br />
&nbsp; &nbsp; <span class="kw3">export</span> <span class="re2">CFLAGS=</span><span class="st0">&quot;-O3&quot;</span><br />
&nbsp; &nbsp; <span class="kw3">export</span> <span class="re2">LD_LIBRARY_PATH=</span><span class="re1">$CROSS_COMPILER_HOME</span><span class="sy0">/</span>lib:<span class="re1">$CROSS_COMPILER_HOME</span><span class="sy0">/</span>i686-host-linux-gnu<span class="sy0">/</span>armv5tel-cacko-linux<span class="sy0">/</span>lib<br />
&nbsp; &nbsp; <span class="kw3">export</span> <span class="re2">LDFLAGS=</span><span class="st0">&quot;-Wl,-rpath-link,$CROSS_COMPILER_HOME/armv5tel-cacko-linux/X11R6/lib,-L/usr/lib&quot;</span><br />
&nbsp; &nbsp; <span class="kw3">export</span> <span class="re2">DEFAULT_CONFIGURE_OPTIONS=</span><span class="st0">&quot;-host=armv5tel-cacko-linux --build=i686-linux --x-includes=$CROSS_COMPILER_HOME/armv5tel-cacko-linux/X11R6/include --x-libraries=$CROSS_COMPILER_HOME/armv5tel-cacko-linux/X11R6/lib --oldincludedir=$CROSS_COMPILER_HOME/armv5tel-cacko-linux/include&quot;</span><br />
&nbsp; &nbsp; <span class="kw3">export</span> <span class="re2">QMAKESPEC=</span><span class="st0">&quot;$CROSS_COMPILER_HOME/armv5tel-cacko-linux/qt/mkspecs/default&quot;</span><br />
&nbsp; &nbsp; <span class="kw3">export</span> <span class="re2">CC=</span><span class="re1">$CROSS_COMPILER_HOME</span><span class="sy0">/</span>bin<span class="sy0">/</span>armv5tel-cacko-linux-gcc<br />
&nbsp; &nbsp; <span class="kw3">export</span> <span class="re2">ac_cv_func_getpgrp_void=</span>yes<br />
&nbsp; &nbsp; <span class="kw3">export</span> <span class="re2">ac_cv_func_setpgrp_void=</span>yes<br />
&nbsp; &nbsp; <span class="kw3">export</span> <span class="re2">ICONV=</span><span class="st0">&quot;/usr/bin/iconv&quot;</span><br />
<br />
&nbsp; &nbsp; <span class="co0"># fin du script, lancement d'un shell imbriqué</span><br />
&nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&quot;Taper exit pour sortir de l'environnement de cross-compilation.&quot;</span><br />
&nbsp; &nbsp; <span class="kw3">export</span> <span class="re2">PS1=</span><span class="st0">'pdaXrom/ARM [<span class="es0">\W</span>] $ '</span><br />
&nbsp; &nbsp;<span class="sy0">/</span>bin<span class="sy0">/</span>bash --noprofile --norc
  </div>
  
  </div>
</p>
<p> 
 Une fois ce fichier créé, lui donner l'attribut "exécutable" et le lancer :
 
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <a target="blank" href="http://pwet.fr/man/linux/commandes/chmod"><span class="kw2">chmod</span></a> +x script<span class="sy0">/</span>start.<a target="blank" href="http://pwet.fr/man/linux/commandes/sh"><span class="kw2">sh</span></a><br />
.<span class="sy0">/</span>script<span class="sy0">/</span>start.<a target="blank" href="http://pwet.fr/man/linux/commandes/sh"><span class="kw2">sh</span></a>
  </div>
  
  </div>
</p>
<p> 
 Une invite vous indique que vous êtres dans l'environnement de cross-compilation, vous êtes maintenant près à compiler votre première application pour Zaurus...
</p>


	<a name='chapter_5'></a>
  <h2>Récupération des sources à compiler</h2>
	
<p>
L'exemple que je vais prendre est la dernière version d'OpenBox que nous allons créer de toute pièce :
</p>
<p> La première étape est donc de récupérer les deux paquets de source :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="kw3">cd</span> sources<br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/wget"><span class="kw2">wget</span></a> http:<span class="sy0">//</span>icculus.org<span class="sy0">/</span>openbox<span class="sy0">/</span>releases<span class="sy0">/</span>openbox<span class="nu0">-3.4</span><span class="nu0">.4</span>.<a target="blank" href="http://pwet.fr/man/linux/commandes/tar"><span class="kw2">tar</span></a>.gz<br />
<span class="kw3">cd</span> ..<span class="sy0">/</span>build<br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/tar"><span class="kw2">tar</span></a> -zxvf ..<span class="sy0">/</span>sources<span class="sy0">/</span>openbox<span class="nu0">-3.4</span><span class="nu0">.4</span>.<a target="blank" href="http://pwet.fr/man/linux/commandes/tar"><span class="kw2">tar</span></a>.gz
  </div>
  
  </div>
</p>


	<a name='chapter_6'></a>
  <h2>Compilation</h2>
	
<p>Cette étapes est somme toute classique pour qui a déjà compilé une application sous linux. Elle consiste en la classique trinité config/make/make install.

  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="kw3">cd</span> openbox<span class="nu0">-3.4</span><span class="nu0">.4</span><br />
.<span class="sy0">/</span>configure <span class="re1">$DEFAULT_CONFIGURE_OPTIONS</span> --<span class="re2">prefix=</span><span class="re1">$PWD</span><span class="sy0">/</span>dist<span class="sy0">/</span>usr
  </div>
  
  </div>
</p>

<p>
	Un ensemble de test va alors s'afficher pendant un certain temps. L'utilitaire est en train de vérifier que toutes les librairies nécessaire à la compilation sont bien présente sur la machine. Il va ensuite fabriquer les scripts de compilation. Notez le <kbd>$DEFAULT_CONFIGURE_OPTIONS</kbd> qui est une variable initialisée par notre script de démarrage. Elle contient un tas d'option permettant à la compilation de se passer correctement et à vous d'en taper le moins possible <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/wink2.gif" title="Wink" alt="Wink" class="smiley-content"/>
</p>
<p>
	Autre détail important, le paramètre <kbd>--prefix</kbd>. Nous allons grâce à lui forcer l'installation de la librairie à se faire dans le sous dossier <kbd>./dist/usr</kbd>. C'est très important car sinon l'installation des librairies se feraients dans votre linux (en /usr...) et là, bonjour l'horreur <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/wink2.gif" title="Wink" alt="Wink" class="smiley-content"/>
</p>

<div class='inline-box note'>
	Sans options complémentaires le configurateur va désactiver de nombreuses options de pilot-link (support Java, Perl, etc...). C'est normal donc que ces choix se reflettent dans le résumé. Si vous lancez <kbd>./configure --help</kbd> vous aurez une liste des options activables si vos besoins sont plus spécifiques.
</div>

<p>
	Il est maintenant temps de compiler notre application:

  <div class='code-block code-block-fragment'>
  <div class='container'>
  <a target="blank" href="http://pwet.fr/man/linux/commandes/make"><span class="kw2">make</span></a>
  </div>
  
  </div>
</p>
<p>
Avec une machine rapide, cette opération ne prends qu'une grosse minute pour se terminer (espérons le <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/wink2.gif" title="Wink" alt="Wink" class="smiley-content"/> sans erreurs. Il ne reste alors plus qu'à générer une installation :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  <a target="blank" href="http://pwet.fr/man/linux/commandes/make"><span class="kw2">make</span></a> <a target="blank" href="http://pwet.fr/man/linux/commandes/install"><span class="kw2">install</span></a>
  </div>
  
  </div>
</p>
<p>
L'opération est rapide. Une fois que l'utilitaire vous rends la main, vous pouvez vérifier que la compilation s'est correctement déroulée en tapant :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  &nbsp; <a target="blank" href="http://pwet.fr/man/linux/commandes/file"><span class="kw2">file</span></a> &nbsp;dist<span class="sy0">/</span>usr<span class="sy0">/</span>lib<span class="sy0">/</span>libobrender.so<span class="nu0">.16</span><span class="nu0">.0</span><span class="nu0">.1</span><br />
&nbsp; <span class="sy0">&gt;</span> dist<span class="sy0">/</span>usr<span class="sy0">/</span>lib<span class="sy0">/</span>libobrender.so<span class="nu0">.16</span><span class="nu0">.0</span><span class="nu0">.1</span>: ELF <span class="nu0">32</span>-bit LSB shared object, ARM, version <span class="nu0">1</span>, not stripped<br />
&nbsp; <a target="blank" href="http://pwet.fr/man/linux/commandes/ls"><span class="kw2">ls</span></a> -la dist<span class="sy0">/</span>usr<span class="sy0">/</span>lib<span class="sy0">/</span>libobrender.so<span class="nu0">.16</span><span class="nu0">.0</span><span class="nu0">.1</span><br />
&nbsp; <span class="sy0">&gt;</span> -rwxr-xr-x <span class="nu0">1</span> ulhume ulhume <span class="nu0">94762</span> aoû <span class="nu0">11</span> <span class="nu0">16</span>:<span class="nu0">24</span> dist<span class="sy0">/</span>usr<span class="sy0">/</span>lib<span class="sy0">/</span>libobrender.so<span class="nu0">.16</span><span class="nu0">.0</span>.
  </div>
  
  </div>
</p>
<p>
Nos fichiers sont donc bien installés. Essayons d'optimiser un peu tout cela. 
</p>



	<a name='chapter_7'></a>
  <h2>Optimisation de l'installation<h2>
<h3>Enlever les fichiers qui ne \"servent à rien\"</h3>
<p>Avant toute chose, nous devons penser à optimiser l'espace occupé par nos paquets Zaurus. La place y est grandement comptée. Pour cela deux opérations. D'abord enlever ce qui n'est pas absolument utile, ici le manuel :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  <a target="blank" href="http://pwet.fr/man/linux/commandes/rm"><span class="kw2">rm</span></a> -rf dist<span class="sy0">/</span>usr<span class="sy0">/</span>share<span class="sy0">/</span><a target="blank" href="http://pwet.fr/man/linux/commandes/man"><span class="kw2">man</span></a>
  </div>
  
  </div>
</p>
<p>
Il y aurait encore du ménage à faire dans le même dossier, je vous laisse optimiser cela à votre goût mais faite attention de ne rien enlever de \"vitale\"</p>
<h3>Optimisation des binaires</h3>
<p>
Ensuite nous pouvons optimiser la taille des binaires eux-même. C'est le rôle de la commande <kbd>strip</kbd> que nous pouvons efficacement combiner avec la commande find :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  <a target="blank" href="http://pwet.fr/man/linux/commandes/find"><span class="kw2">find</span></a> dist -perm <span class="sy0">/</span><span class="re2">u=</span>x,<span class="re2">g=</span>x,<span class="re2">o=</span>x -exec armv5tel-cacko-linux-strip <span class="br0">&#123;</span><span class="br0">&#125;</span> \;
  </div>
  
  </div>
</p>
<div class='inline-box note'>Ne pas tenir compte des erreurs dans la mesure où strip râle lorsque je lui passes des fichiers non binaires <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/smile.gif" title="Smiling" alt="Smiling" class="smiley-content"/> </div>
<p>
Nous pouvons vérifier le résultat en retappant les commande précédentes :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  &nbsp; <a target="blank" href="http://pwet.fr/man/linux/commandes/file"><span class="kw2">file</span></a> &nbsp;dist<span class="sy0">/</span>usr<span class="sy0">/</span>lib<span class="sy0">/</span>libobrender.so<span class="nu0">.16</span><span class="nu0">.0</span><span class="nu0">.1</span><br />
&nbsp; <span class="sy0">&gt;</span> dist<span class="sy0">/</span>usr<span class="sy0">/</span>lib<span class="sy0">/</span>libobrender.so<span class="nu0">.16</span><span class="nu0">.0</span><span class="nu0">.1</span>: ELF <span class="nu0">32</span>-bit LSB shared object, ARM, version <span class="nu0">1</span>, stripped<br />
&nbsp; <a target="blank" href="http://pwet.fr/man/linux/commandes/ls"><span class="kw2">ls</span></a> -la dist<span class="sy0">/</span>usr<span class="sy0">/</span>lib<span class="sy0">/</span>libobrender.so<span class="nu0">.16</span><span class="nu0">.0</span><span class="nu0">.1</span><br />
&nbsp; <span class="sy0">&gt;</span> -rwxr-xr-x <span class="nu0">1</span> ulhume ulhume <span class="nu0">80100</span> aoû <span class="nu0">11</span> <span class="nu0">16</span>:<span class="nu0">24</span> dist<span class="sy0">/</span>usr<span class="sy0">/</span>lib<span class="sy0">/</span>libobrender.so<span class="nu0">.16</span><span class="nu0">.0</span>.
  </div>
  
  </div>
<p>
  Nous constatons alors que la commande <kbd>files</kbd> qui donnait le fichier comme <kbd>non stripped</kbd>, le donne maintenant comme <kbd>stripped</kbd>. Et que sa taille a perdu plus de 14ko, ce qui n'est pas mal du tout !!
</p>
<h3>Séparation des packages</h3>
<p>
Vous l'avez déjà remarqué, une même application est souvent déclinée en plusieurs paquets ayant chacun son rôle. Généralement nous avons le paquet de l'application elle-même, celui des documentations, celui de développement. L'objectif étant de n'installer que le stricte minimum. Nous allons donc faire de même et créer deux paquets, l'un pour l'application openBox, l'autre pour les fichiers qui permettent de compiler des applications utilisant openbox. 
</p>
<p>
  Nous alons partir du principe que <kbd>./dist</kbd> contiendra les fichiers de l'application seule. Nous allons donc créer un dossier au même niveau nommé <kbd>dist-devel</kbd> dans lequel nous allons déplacer les fichiers liés au développement. 

  <div class='code-block code-block-fragment'>
  <div class='container'>
  <a target="blank" href="http://pwet.fr/man/linux/commandes/mkdir"><span class="kw2">mkdir</span></a> -p dist-devel<span class="sy0">/</span>usr<br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/mv"><span class="kw2">mv</span></a> dist<span class="sy0">/</span>usr<span class="sy0">/</span>include dist-devel<span class="sy0">/</span>usr<span class="sy0">/</span>
  </div>
  
  </div>
</p>
<p>
Voilà, nous avons maintenant deux dossiers <kbd>dist</kbd>. Nous pourrions aller beaucoup plus loin en créant par exemple un dossier dist par langue (/usr/share/locale/), un autre contenant les themes d'openBox, etc. 
</p>

<h2>Création des packets IPK</h2>
	
<p>Il ne reste plus qu'à fabriquer le fichier .ipk. Pour cela, créons dans le dossier dist, le dossier <kbd>CONTROL</kbd> dans lequel nous écrirons un fichier <kbd>control</kbd> contenant les informations suivantes :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  Package: OpenBox<br />
Installed-Size: 1.3M<br />
Filename: ./openbox-3.4.4.ipk<br />
Version: 3.4.4<br />
Depends:<br />
Priority: optional<br />
Section: system<br />
Maintainer: <script>document.write(String.fromCharCode(60,97,32,104,114,101,102,61,39,109,97,105,108,116,111,58,115,105,116,101,46,97,114,116,105,115,97,110,64,95,98,97,100,95,107,97,114,109,97,45,108,97,98,46,110,101,116,39,62,115,105,116,101,46,97,114,116,105,115,97,110,64,95,98,97,100,95,107,97,114,109,97,45,108,97,98,46,110,101,116,60,47,97,62));</script> (remove _bad_ to send an email)<br />
Architecture: armv5tel<br />
Description: OpenBox le gestionnaire de fenêtres
  </div>
  
  </div>
</p>
<p>
Comme nous avons aussi un <kbd>dist-devel</kbd>, nous allons y répéter l'opération en mettant cette fois <kbd>FileName: ./openbox-devel-3.4.4.ipk</kbd>
<p>
<p>
Il ne reste plus qu'à lancer la commande <kbd>mkipkg</kbd> pour produire notre deux fichiers ipk dans le dossier <kbd>../../feed</kbd>

  <div class='code-block code-block-fragment'>
  <div class='container'>
  mkipkg dist ..<span class="sy0">/</span>..<span class="sy0">/</span>feed<br />
mkipkg dist-devel ..<span class="sy0">/</span>..<span class="sy0">/</span>feed
  </div>
  
  </div>
</p>
<p>
Et le tour est joué!! Vous pouvez vérifier dans le dossier feed, les deux paquets devraient y être. Il ne reste plus qu'à installer le nouvel ipk dans Zaurus. 
</p>

    ]]></content>
  </entry>
</feed>
