<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Zaurus</title>
  <link rel="alternate" type="text/html" href="http://artisan.karma-lab.net/taxonomy/term/47"/>
  <link rel="self" type="application/atom+xml" href="http://artisan.karma-lab.net/taxonomy/term/47/atom/feed"/>
  <id>http://artisan.karma-lab.net/taxonomy/term/47/atom/feed</id>
  <updated>2008-10-08T15:31:48+02:00</updated>
  <entry>
    <title>Bloc-note &#039;ZaurusFr&#039;</title>
    <link rel="alternate" type="text/html" href="http://artisan.karma-lab.net/node/1301" />
    <id>http://artisan.karma-lab.net/node/1301</id>
    <published>2007-12-15T16:50:11+01:00</published>
    <updated>2007-12-15T17:46:37+01:00</updated>
    <author>
      <name>Ulhume</name>
    </author>
    <category term="Zaurus" />
    <category term="Aucun" />
    <category term="Note" />
    <category term="OK" />
    <summary type="html"><![CDATA[<p>
  Trucs en vrac sur la distribution Zaurus Francisée initiée par <a class='external' target='_blank' href='http://dab.free.fr/buildoz/' >Dab</a>. 
</p>
    ]]></summary>
    <content type="html"><![CDATA[<p>
  Trucs en vrac sur la distribution Zaurus Francisée initiée par <a class='external' target='_blank' href='http://dab.free.fr/buildoz/' >Dab</a>. 
</p>
<!--break-->

	<a name='chapter_1'></a>
  <h2>Création de l'environnement</h2>
	
<p>
  Le plus simple est de créer avec debootstrap un environnement <a class='external' target='_blank' href='http://artisan.karma-lab.net/node/1055' >chrooté spécifique</a>. De créer un utilisateur une fois dans le chroot (ex. gaston) et de faire le checkout suivant :

  <div class='code-block code-block-traces'>
  <div class='container'>
  <div class='command'><span class='prompt'>root#</span>apt-get install subversion</div><div class='command'><span class='prompt'>root#</span>useradd gaston</div><div class='command'><span class='prompt'>root#</span>visudo</div><div class='result'>Editer ici le sudo pour ajouter gaston avec une ligne du genre</div><div class='result'>gaston   ALL=(ALL) NOPASSWD:ALL</div><div class='result'>et faire CTRL-X Y pour sortir</div><div class='result'>&nbsp;</div><div class='command'><span class='prompt'>root#</span>mkdir -p /home/gaston/tmp</div><div class='command'><span class='prompt'>root#</span>chown gaston:gaston /home/gaston -Rc</div><div class='command'><span class='prompt'>root#</span>su - gaston</div><div class='command'><span class='prompt'>gaston$</span>svn co http://artisan.karma-lab.net/dev/zaurusfr/trunk/zaurusfr/construct</div><div class='command'><span class='prompt'>gaston$</span>cd construct</div><div class='command'><span class='prompt'>gaston$</span>./oe build</div><div class='result'>Faire quelque prière ici pour que tout fonctionne</div><div class='command'><span class='prompt'>gaston$</span><span class='cursor'>&nbsp;</span></div>
  </div>
  
  </div>
</p>
<p>
  Lorsque le build est terminé, une archive contenant tout ce qu'il faut pour flasher le zaurus sur trouve dans le dossier <kbd>/home/rober/construct/stuff/zaurusfr/tmp/deploy/glibc/images/akita</kbd> sous le nom poétique de <kbd>Angstrom-zaurusfr-gpe-image-glibc-ipk-2007.9-test-YYYMMDD-akita-installkit.tgz</kbd>. Il suffit de décompresser cette archive à la racine d'une carte SD, et d'<a class='external' target='_blank' href='http://artisan.karma-lab.net/node/1098' >installer la nouvelle ROM</a>. 
</p>

	<a name='chapter_2'></a>
  <h2>Faire un patch kernel</h2>
	
<p>
Si si, c'est toujours utile <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/smile.gif" title="Smiling" alt="Smiling" class="smiley-content"/>

  <div class='code-block code-block-traces'>
  <div class='container'>
  <div class='command'><span class='prompt'>gaston$</span>cd stuff/zaurusfr/tmp/work/akita-angstrom-linux-gnueabi/linux-rp-2.6.23-r100</div><div class='command'><span class='prompt'>gaston$</span># on fait une copie des sources du kernel</div><div class='command'><span class='prompt'>gaston$</span>rsync -a linux-2.6.23 linux-2.6.23-new</div><div class='co0'># on modifie le kernel sur la copie et on fait un patch que l'on stoque directement au bon endroit</div><div class='command'><span class='prompt'>gaston$</span>patch  -Naur linux-2.6.23 linux-2.6.23-new > ../../../../myoe/packages/linux/linux-rp-2.6.23/mon-patch.patch</div><div class='command'><span class='prompt'>gaston$</span><span class='cursor'>&nbsp;</span></div>
  </div>
  
  </div>
</p>
<p>
On modifie ensuite le fichier <kbd>../../../../myoe/packages/linux/linux-rp_2.6.23.bb</kbd> en rajoutant dans SRC_URI une ligne du style :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  file://mon-patch.patch<SEMI>patch=1 \
  </div>
  
  </div>
</p>
<p>
Ensuite, soit on utilise <kbd>oe</kbd> pour faire un <kbd>clean</kbd> de <kbd>linux-rp</kbd> puis un build. Soit on veut tester et on va alors passer bitbake en mode interactif :

  <div class='code-block code-block-traces'>
  <div class='container'>
  <div class='command'><span class='prompt'>gaston$</span>cd /home/gaston/construct/stuff/zaurusfr</div><div class='command'><span class='prompt'>gaston$</span>. oe.env</div><div class='command'><span class='prompt'>gaston$</span>bitbake -i</div><div class='command'><span class='prompt'>gaston$</span>clean linux-rp</div><div class='command'><span class='prompt'>gaston$</span>fetch linux-rp</div><div class='command'><span class='prompt'>gaston$</span>unpack linux-rp</div><div class='command'><span class='prompt'>gaston$</span>patch linux-rp</div><div class='command'><span class='prompt'>gaston$</span>build linux-rp</div><div class='command'><span class='prompt'>gaston$</span><span class='cursor'>&nbsp;</span></div>
  </div>
  
  </div>
</p>


	<a name='chapter_3'></a>
  <h2>USB mode host/slave</h2>
	
<p>
Pour l'instant, l'Angstrom ne détecte pas correctement le changement de câble. Il faut donc charger le module correspondant au mode "host" à la main :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="co0">#!/bin/sh</span><br />
<span class="co0"># Stop possible USB networking to release g_ether lock</span><br />
ifconfig usb0 down <span class="nu0">2</span><span class="sy0">&gt;/</span>dev<span class="sy0">/</span>null<br />
<span class="co0"># Remove USB client modules</span><br />
rmmod g_file_storage g_ether pxa27x_udc <span class="nu0">2</span><span class="sy0">&gt;/</span>dev<span class="sy0">/</span>null<br />
<span class="co0"># Load USB master module</span><br />
modprobe ohci-hcd
  </div>
  
  </div>
</p>


	<a name='chapter_4'></a>
  <h2>Soucis d'installation sur la partition /home</h2>
	
<p>
Lors de l'utilisation de la syntaxe <kbd>ipkg install -d home abiword</kbd>, ipkg installe bien abiword sur la seconde partition mais l'utilitaire ipk-link n'est pas appelé pour créer les liens avec le système racine. Et pour cause, il n'est pas présent... Donc en attendant que ce soit inclus par défaut, voici le source de l'utilitaire à utiliser après ipkg, sous la forme <kbd>ipk-link add abiword</kbd> :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="co0">#!/bin/sh</span><br />
<span class="re2">COMMAND=</span>$<span class="nu0">1</span><br />
<span class="re2">PACKAGE=</span>$<span class="nu0">2</span><br />
setdest <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> i <span class="kw1">in</span> <span class="sy0">`</span><a target="blank" href="http://pwet.fr/man/linux/commandes/grep"><span class="kw2">grep</span></a> dest <span class="sy0">/</span>etc<span class="sy0">/</span>ipkg.conf <span class="sy0">|</span> <a target="blank" href="http://pwet.fr/man/linux/commandes/cut"><span class="kw2">cut</span></a> -d <span class="st0">' '</span> -f <span class="nu0">3</span><span class="sy0">`</span>; <span class="kw1">do</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#91;</span> -f <span class="re1">$i</span><span class="sy0">/</span>usr<span class="sy0">/</span>lib<span class="sy0">/</span>ipkg<span class="sy0">/</span>info<span class="sy0">/</span><span class="re1">$PACKAGE</span>.list <span class="br0">&#93;</span>; <span class="kw1">then</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re2">DEST=</span><span class="re1">$i</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fi</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">done</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#91;</span> <span class="st0">&quot;x$DEST&quot;</span> = <span class="st0">&quot;x&quot;</span> <span class="br0">&#93;</span>; <span class="kw1">then</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&quot;Can not locate $PACKAGE.&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&quot;Check /etc/ipkg.conf for correct dest listings&quot;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&quot;Check name of requested package: $PACKAGE&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">exit</span> <span class="nu0">1</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fi</span><br />
<span class="br0">&#125;</span><br />
addlinks <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; setdest;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <a target="blank" href="http://pwet.fr/man/linux/commandes/cat"><span class="kw2">cat</span></a> <span class="re1">$DEST</span><span class="sy0">/</span>usr<span class="sy0">/</span>lib<span class="sy0">/</span>ipkg<span class="sy0">/</span>info<span class="sy0">/</span><span class="re1">$PACKAGE</span>.list <span class="sy0">|</span> <span class="kw1">while</span> <a target="blank" href="http://pwet.fr/man/linux/commandes/read"><span class="kw2">read</span></a> LINE; <span class="kw1">do</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re2">SRC=</span><span class="re1">$LINE</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re2">DST=</span><span class="sy0">`</span><span class="kw3">echo</span> <span class="re1">$SRC</span> <span class="sy0">|</span> <a target="blank" href="http://pwet.fr/man/linux/commandes/sed"><span class="kw2">sed</span></a> <span class="st0">&quot;s|$DEST||&quot;</span><span class="sy0">`</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re2">DSTNAME=</span><span class="sy0">`</span><a target="blank" href="http://pwet.fr/man/linux/commandes/basename"><span class="kw2">basename</span></a> <span class="re1">$DST</span><span class="sy0">`</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re2">DSTDIR=</span><span class="sy0">`</span><span class="kw3">echo</span> <span class="re1">$DST</span> <span class="sy0">|</span> <a target="blank" href="http://pwet.fr/man/linux/commandes/sed"><span class="kw2">sed</span></a> <span class="st0">&quot;s|$DSTNAME<span class="es0">\$</span>||&quot;</span><span class="sy0">`</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">test</span> -f <span class="st0">&quot;$SRC&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#91;</span> <span class="re4">$?</span> = <span class="nu0">0</span> <span class="br0">&#93;</span>; <span class="kw1">then</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">test</span> -e <span class="st0">&quot;$DST&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#91;</span> <span class="re4">$?</span> = <span class="nu0">1</span> <span class="br0">&#93;</span>; <span class="kw1">then</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a target="blank" href="http://pwet.fr/man/linux/commandes/mkdir"><span class="kw2">mkdir</span></a> -p <span class="re1">$DSTDIR</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a target="blank" href="http://pwet.fr/man/linux/commandes/ln"><span class="kw2">ln</span></a> -sf <span class="re1">$SRC</span> <span class="re1">$DST</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&quot;Not linking $SRC to $DST&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&quot;$DST Already exists&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fi</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">test</span> -d <span class="st0">&quot;$SRC&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#91;</span> <span class="re4">$?</span> = <span class="nu0">0</span> <span class="br0">&#93;</span>; <span class="kw1">then</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">test</span> -e <span class="re1">$DST</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#91;</span> <span class="re4">$?</span> = <span class="nu0">1</span> <span class="br0">&#93;</span>; <span class="kw1">then</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a target="blank" href="http://pwet.fr/man/linux/commandes/mkdir"><span class="kw2">mkdir</span></a> -p <span class="re1">$DST</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&quot;directory already exists&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fi</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&quot;Source directory $SRC does not exist&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fi</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fi</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">done</span><br />
<span class="br0">&#125;</span><br />
removelinks <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; setdest;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <a target="blank" href="http://pwet.fr/man/linux/commandes/cat"><span class="kw2">cat</span></a> <span class="re1">$DEST</span><span class="sy0">/</span>usr<span class="sy0">/</span>lib<span class="sy0">/</span>ipkg<span class="sy0">/</span>info<span class="sy0">/</span><span class="re1">$PACKAGE</span>.list <span class="sy0">|</span> <span class="kw1">while</span> <a target="blank" href="http://pwet.fr/man/linux/commandes/read"><span class="kw2">read</span></a> LINE; <span class="kw1">do</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re2">SRC=</span><span class="re1">$LINE</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re2">DST=</span><span class="sy0">`</span><span class="kw3">echo</span> <span class="re1">$LINE</span> <span class="sy0">|</span> <a target="blank" href="http://pwet.fr/man/linux/commandes/sed"><span class="kw2">sed</span></a> <span class="st0">&quot;s|$DEST||&quot;</span><span class="sy0">`</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re2">DSTNAME=</span><span class="sy0">`</span><a target="blank" href="http://pwet.fr/man/linux/commandes/basename"><span class="kw2">basename</span></a> <span class="re1">$DST</span><span class="sy0">`</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re2">DSTDIR=</span><span class="sy0">`</span><span class="kw3">echo</span> <span class="re1">$DST</span> <span class="sy0">|</span> <a target="blank" href="http://pwet.fr/man/linux/commandes/sed"><span class="kw2">sed</span></a> <span class="st0">&quot;s|$DSTNAME<span class="es0">\$</span>||&quot;</span><span class="sy0">`</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">test</span> -f <span class="re1">$DST</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#91;</span> <span class="re4">$?</span> = <span class="nu0">0</span> <span class="br0">&#93;</span>; <span class="kw1">then</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a target="blank" href="http://pwet.fr/man/linux/commandes/rm"><span class="kw2">rm</span></a> -f <span class="re1">$DST</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">test</span> -d <span class="re1">$DSTDIR</span> <span class="sy0">&amp;&amp;</span> <a target="blank" href="http://pwet.fr/man/linux/commandes/rmdir"><span class="kw2">rmdir</span></a> <span class="re1">$DSTDIR</span> <span class="nu0">2</span><span class="sy0">&gt;/</span>dev<span class="sy0">/</span>null<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">test</span> -d <span class="re1">$DST</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#91;</span> <span class="re4">$?</span> = <span class="nu0">0</span> <span class="br0">&#93;</span>; <span class="kw1">then</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a target="blank" href="http://pwet.fr/man/linux/commandes/rmdir"><span class="kw2">rmdir</span></a> <span class="re1">$DST</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&quot;$DST does not exist&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fi</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fi</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">done</span><br />
<span class="br0">&#125;</span><br />
mountdest <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">test</span> -d <span class="re1">$PACKAGE</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#91;</span> <span class="re4">$?</span> = <span class="nu0">1</span> <span class="br0">&#93;</span>; <span class="kw1">then</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&quot;Mount point does not exist&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">exit</span> <span class="nu0">1</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fi</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> i <span class="kw1">in</span> <span class="re1">$PACKAGE</span><span class="sy0">/</span>usr<span class="sy0">/</span>lib<span class="sy0">/</span>ipkg<span class="sy0">/</span>info<span class="sy0">/*</span>.list; <span class="kw1">do</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="nu0">0</span> add <span class="sy0">`</span><a target="blank" href="http://pwet.fr/man/linux/commandes/basename"><span class="kw2">basename</span></a> <span class="re1">$i</span> .list<span class="sy0">`</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">done</span><br />
<span class="br0">&#125;</span><br />
umountdest <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">test</span> -d <span class="re1">$PACKAGE</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#91;</span> <span class="re4">$?</span> = <span class="nu0">1</span> <span class="br0">&#93;</span>; <span class="kw1">then</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&quot;Mount point does not exist&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">exit</span> <span class="nu0">1</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fi</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> i <span class="kw1">in</span> <span class="re1">$PACKAGE</span><span class="sy0">/</span>usr<span class="sy0">/</span>lib<span class="sy0">/</span>ipkg<span class="sy0">/</span>info<span class="sy0">/*</span>.list; <span class="kw1">do</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="nu0">0</span> remove <span class="sy0">`</span><a target="blank" href="http://pwet.fr/man/linux/commandes/basename"><span class="kw2">basename</span></a> <span class="re1">$i</span> .list<span class="sy0">`</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">done</span><br />
<span class="br0">&#125;</span><br />
<span class="kw1">case</span> <span class="st0">&quot;$COMMAND&quot;</span> <span class="kw1">in</span><br />
&nbsp; add<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; addlinks<br />
&nbsp; <span class="sy0">;;</span><br />
&nbsp; remove<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; removelinks<br />
&nbsp; <span class="sy0">;;</span><br />
&nbsp; <a target="blank" href="http://pwet.fr/man/linux/commandes/mount"><span class="kw2">mount</span></a><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; mountdest<br />
&nbsp; <span class="sy0">;;</span><br />
&nbsp; <a target="blank" href="http://pwet.fr/man/linux/commandes/umount"><span class="kw2">umount</span></a><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; umountdest<br />
&nbsp; <span class="sy0">;;</span><br />
&nbsp; <span class="sy0">*</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&quot;Usage: $0 &lt;cmd&gt; &lt;target&gt;&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&quot; &nbsp; &nbsp; &nbsp; Commands: add, remove, mount, umount&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&quot; &nbsp; &nbsp; &nbsp; Targets: &lt;package&gt;, &lt;mount point&gt;&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&quot;Example: &nbsp;$0 add kismet-server&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&quot;Example: &nbsp;$0 remove kismet-server&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&quot;Example: &nbsp;$0 mount /mnt/usb&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&quot;Example: &nbsp;$0 umount /mnt/usb&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">exit</span> <span class="nu0">1</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">;;</span><br />
<span class="kw1">esac</span><br />
<span class="kw3">exit</span> <span class="nu0">0</span>
  </div>
  <div class='caption'>/usr/bin/ipkg-link</div>
  </div>
</p>
<p>
Et pour installer tous les paquets d'un coup :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="co0">#! /bin/sh</span><br />
<span class="kw3">cd</span> <span class="sy0">/</span><br />
<span class="kw1">for</span> package <span class="kw1">in</span> $<span class="br0">&#40;</span><a target="blank" href="http://pwet.fr/man/linux/commandes/cat"><span class="kw2">cat</span></a> <span class="sy0">/</span>home<span class="sy0">/</span>packages<span class="sy0">/</span>usr<span class="sy0">/</span>lib<span class="sy0">/</span>ipkg<span class="sy0">/</span>status <span class="sy0">|</span> <a target="blank" href="http://pwet.fr/man/linux/commandes/grep"><span class="kw2">grep</span></a> Package <span class="sy0">|</span> <a target="blank" href="http://pwet.fr/man/linux/commandes/cut"><span class="kw2">cut</span></a> -d<span class="st0">&quot; &quot;</span> -f2<span class="br0">&#41;</span> ; <span class="kw1">do</span><br />
&nbsp; .<span class="sy0">/</span>ipk-link add <span class="re1">$package</span><br />
<span class="kw1">done</span>
  </div>
  <div class='caption'>/usr/bin/ipkg-link-all</div>
  </div>
</p>    ]]></content>
  </entry>
  <entry>
    <title>Installer une nouvelle ROM sur le Zaurus</title>
    <link rel="alternate" type="text/html" href="http://artisan.karma-lab.net/node/1098" />
    <id>http://artisan.karma-lab.net/node/1098</id>
    <published>2007-11-06T18:07:53+01:00</published>
    <updated>2008-10-01T14:33:19+02:00</updated>
    <author>
      <name>Ulhume</name>
    </author>
    <category term="Zaurus" />
    <category term="OK" />
    <category term="Planet Libre" />
    <category term="Tutoriel" />
    <summary type="html"><![CDATA[<p>
  Les installations de nouvelles ROM sont chose courante sur le Zaurus et pourtant les processus sont loin d'être simples à mettre en œuvre pour quelqu'un qui ne connaît pas encore bien cette machine. J'ai essayé dans ce tutorial de regrouper l'ensemble des modes d'emploi pour la majorité des ROM existantes sur le Zaurus. 
</p>
    ]]></summary>
    <content type="html"><![CDATA[<p>
  Les installations de nouvelles ROM sont chose courante sur le Zaurus et pourtant les processus sont loin d'être simples à mettre en œuvre pour quelqu'un qui ne connaît pas encore bien cette machine. J'ai essayé dans ce tutorial de regrouper l'ensemble des modes d'emploi pour la majorité des ROM existantes sur le Zaurus. 
</p>
<!--break-->


	<a name='chapter_1'></a>
  <h2>ROM ? kézako ?</h2>
	
<p>
  Tout d'abord, il est important de comprendre un peu comment se structure la ROM du Zaurus. En réalité, ROM ne veut pas dire grand chose, il s'agit de mémoire Flash (appelé aussi mémoire NAND). Sur un SL-C1000, il y a <a class='external' target='_blank' href='http://artisan.karma-lab.net/node/56' >128mo de mémoire flash</a> à ne pas confondre avec les 64mo de mémoire vive. Sur tous les Zaurus, hors la série des SL-C3100/3200, la mémoire Flash est utilisée comme un disque dur. D'ailleurs, pour les SL-C3100/3200, il y a très peu de mémoire flash car il y a ... un disque dur. Pour l'instant je n'ai pas une vue bien précise de ce qui se trouve dans cette fameuse Flash. Plutôt que d'écrire des bêtises, je vais donc aborder cela d'un point de vue fonctionnel. 
</p>
<p>
  Nous avons une zone contenant le bootoader (le bout de logiciel qui démarre le Zaurus) ainsi que le <b>menu de maintenance</b>, c'est celui qui s'affiche avec un Zaurus d'origine lorsque vous pressez la touche <b>OK</b> ou <b>ON</b> en démarrant. Il permet la mise à jour du linux et l'installation d'une bonne partie des ROM alternatives (cacko, pdaXrom avant la béta 4, etc.).
</p>
<p>
  Ensuite nous avons le <b>menu de Diagnostic</b>. C'est celui qui s'affiche en pressant <b>D</b> et <b>M</b> avant de brancher le Zaurus. Ce menu permet de vider toute la mémoire flash (sauf les 14mo dont nous parlons ici), de recharger une copie de la flash à partir d'une carte SD ou CF, faire une copie de la flash vers une carte CF ou SD, et plein d'autre chose que vous pouvez expérimenter à vos risques et périls... 
</p>
<p>
  Puis nous avons une <b>copie de sauvegarde du menu diagnostic</b>. Elle a toute son importance quant le Zaurus ne boot plus car elle, elle fonctionne toujours. Elle s'active en pressant <b>Fn</b> <b>D</b> et <b>M</b> avant de brancher le Zaurus.
</p>


	<a name='chapter_2'></a>
  <h2>Quelles ROM existent ?</h2>
	
<p>
  Pour faire simple, la réponse est... beaucoup mais il est possible de la classifier un peu pour pouvoir s'y retrouver. 
</p>
<p>
  Tout d'abord les ROM basées sur Qt/Qtopia et celles sur X11. Pour un béotien, la grosse différence entre ces deux modes d'affichage graphique, est que X11 permet d'utiliser sur le Zaurus virtuellement toutes les applications écrites pour les unix (y compris FireFox, AbiWord, etc) et Qt implique d'utiliser des applications spécifiquement conçues pour lui. Qt est censé être plus rapide que X11 en affichage et est souvent préféré pour l'utilisation d'un Zaurus en mode PDA. Il existe cependant un "pont", un logiciel permettant d'émuler un serveur X11 sous Qt. 
</p>
<p>
  L'autre différence entre les ROM se situe au niveau du kernel. La ROM d'origine de SHARP utilise un kernel 2.4 et la société a écrit un certain nombre de pilotes spécifiques pour le Zaurus qui n'existent pas dans le monde libre (ex. pilotes rapide pour les cartes SD). Une distribution basée sur un kernel 2.4 peut donc utiliser ces pilotes tandis que les kernels 2.6 ne le peuvent plus, ce sont des distributions totalement dé-corrélées de ce qu'avait fabriqué SHARP. 
</p>

<h3><a class='external' target='_blank' href='http://downloads.conics.net/pda/zaurus-sl-c700/service-menus/original-backups/' >ROM SHARP</a></h3>
<p>
C'est le point de départ, la ROM d'origine rêvée pour ceux qui veulent bosser leur japonnais, un enfer pour les autres qui ne comprennent rien au moindre menu. Cette ROM est basée sur un kernel 2.4 et sur un affichage Qt. Tous les pilotes sont écrits par les développeurs de SHARP et sont plutôt bien fait. C'est particulièrement vrai pour le pilote du lecteur de carte SD qui est 4 fois plus rapide que son homologue libre. La raison en est que le développeur qui a créé le pilote libre n'utilise qu'un bit sur 4 pour accéder au média. 
</p>
<p>
  J'en connais peu qui utilisent cette ROM, le but est généralement d'en changer le plus vite possible pour commencer à utiliser le Zaurus. Il est cependant parfois utile de l'utiliser pour "remettre à zéro" le Zaurus et ainsi repartir sur la version d'origine. 
</p>
<p>
  L'installation de cette ROM passe par la procédure de "restauration de la NAND" (voir plus bas). 
</p>

<h3><a class='external' target='_blank' href='http://www.trisoft.de/en_downloads.htm' >Trisoft</a></h3>
<P>
  C'est ici le distributeur Allemand de feu Zaurus qui propose ce remplacement de la ROM d'origine Japonaise par une version en Anglais en y ajoutant quelques logiciels (agenda, organizer, etc...). Ces ajouts exclus, cette ROM est strictement la même que celle d'origine. 
</P>
<p>
  L'installation de cette ROM passe par la procédure de "restauration de la NAND" (voir plus bas). 
</p>

<h3><a class='external' target='_blank' href='http://my-zaurus.narod.ru/cacko.html' >cacko</a></H3>
<P><image width="150" id="3"/>
  La ROM cacko est un petit bijou. Comme la TriSoft, elle est basée sur la version originale de Sharp (Kernel 2.4/Qt) mais s'en éloigne par une meilleur ergonomie, et une foule d'amélioration et d'applications bonus (netfront, opéra, etc.). En plus, en cherchant bien, il existe à travers le net un nombre important de paquet provenant de divers contributeurs pour cette distribution quasi-mythique.
</p>
<p>
  La fonction de mise en veille marche parfaitement sous la cacko, comme avec la trisoft et utilisant le pilote SD de SHARP, ce média est à plein capacité. C'est une distribution que je conseil à tous ceux qui débute avec un Zaurus et qui cherche plus un PDA  qu'un micro-laptop ou encore ceux qui veulent quelque chose de simplement fonctionnel où tout marche sans se poser de question. L'inconvénient de la cacko, comme de la Trisoft d'ailleurs, est que les logiciels inclus commencent à vieillir un peu. 
</P>
<p>
  La cacko s'installe simplement par la procédure de mise à jour "classique" (voir plus loin).
</p>

<h3><a class='external' target='_blank' href='http://www.pdaxrom.org/' >pdaXrom</a> (jusqu'à la béta 3 incluse) et <a class='external' target='_blank' href='http://www.tyrannozaurus.com/feed/pdaXii13/akita/' >pdaXii13</a></h3>
<p><image width="150" id="4"/>
Il s'agit là d'une ROM bien différente des précédentes car elle n'est plus basée sur Qt mais sur un petit serveur X11 transformant le Zaurus un véritable micro-laptop. En revanche cette distribution utilise un kernel 2.4 et bénéficie donc des pilotes SHARP. pdaXrom est passé en kernel 2.6 à partir de sa beta 4 mais la beta 3 garde ses aficionados qui ont décidé de créer leur propre distribution à partir de celle-ci, la pdaXii13. Il s'agit essentiellement d'une version debuggée de la beta 3, avec le même kernel mais utilisant le pilote SD libre, ce qui monte la capacité des cartes à plus de 2GO au détriment de la vitesse. Originellement conçue pour le SL-C3100 (Zaurus avec disque dur), cette distribution a été portée avec plus ou moins de succès sur le SL-C1000 (akita). Personnellement j'ai eu "quelques" soucis avec comme une mise en veille qui ne fonctionne pas...
</p>
<p>
  La pdaXrom beta 3 comme la pdaXii13 s'installent simplement par la procédure de mise à jour "classique" (voir plus loin).
</p>

<h3><a class='external' target='_blank' href='http://www.pdaxrom.org/' >pdaXrom</a> béta 4 et plus</h3>
<p>Cette ROM est la même que la précédente avec beaucoup d'améliorations liées à son passage au kernel 2.6. En contrepartie, cette mise à niveau la rend bien sur totalement incompatible avec les pilotes SHARP. Certains la trouvent moins stable que la béta 3 mais je la préfère pour sa robustesse en terme de gestion d'énergie. Cette mouture est globalement plus réactive que les distributions basées sur une 2.4, la raison en étant une meilleur gestion des processus (mode préemptif). A noter que certains outils wifi sont cassés en 2.6, il est par exemple devenu impossible avec ma Symbol d'énumérer les réseaux disponibles, un peu gênant. </td>
<p>
  La pdaXrom beta 4 et plus s'installe par la procédure de mise à jour "avancée" (voir plus loin).
</p>

<H3><a class='external' target='_blank' href='http://www.angstrom-distribution.org/' >Ångström</a></H3>
<p><image width="150" id="5"/>
  A l'origine il y avait OpenZaurus, une distribution issue du plus vase projet <a class='external' target='_blank' href='http://www.openembedded.org/' >OpenEmbeded</a>. Puis OpenZaurus est mort pour donner naissance à Ångström, une distribution générique à un grand nombre de plate-formes de poches, dont le Zaurus évidement. C'est une plate-forme très ambivalente fonctionnant sur un noyau linux 2.6. Elle existe en version X11/GPE (la version PDA de Gnome), Qt/OPIE (version pda de Kde) et même Enlightenment E17, le futuriste gestionnaire de fenêtre (Ceci dit, il existe aussi des paquets E17 sous pdaXrom). D'un point de vue fonctionnel, cette distribution est très proche de pdaXrom en se voulant plus professionnelle, et plus proche des dernières évolutions. La contrepartie est qu'elle est constamment en béta et souffre de bugs assez gênant, notamment dans les gestions des périphériques USB (les mode câble host n'est pas détecté), la gestion du plein écran impossible (dur pour les vidéos dans le métro), et une mise en veille parfois mortelle... Intéressante, pas sèche mais un avenir certain. A surveiller. 
</p>
<p>
  Ångström s'installe par la procédure de mise à jour "avancée" (voir plus loin).
</p>

<h3><a href='#' title='Avant de mourrir, ce lien pointait sur : http://www.oesf.org/index.php?title=Debian/Zaurus_installation_guide_%28for_all_C-series_models%29' >Debian pour Zaurus</a></h3>
    <p>Non testé</p>

<h3><a class='external' target='_blank' href='http://gentooforzaurus.opensistemas.com/' >Gentoo pour Zaurus</a></h3>
    <p>Non testé. Le projet ne semble pas très actif.</p>

<h3><a class='external' target='_blank' href='http://www.openbsd.org/zaurus.html' >OpenBSD pour Zaurus</a></h3>
<p>Non testé. Ne fonctionne que sur les modèles à disque dur.</p>

<h3><a class='external' target='_blank' href='http://pokylinux.org/' >Pokylinux</a></h3>
<p><image width="150" id="7"/>Non testé. Il s'agit là d'une autre distribution orientée PDA et basée sur Ångström. Un test peut être consulté <a class='external' target='_blank' href='http://dab.free.fr/wp/?p=42' >ici</a>.

<h3 style="clear:left"><a class='external' target='_blank' href='http://www.openmoko.org' >OpenMoko</a></h3> 
<p><image width="150" id="6"/>Non testé. Encore une distribution basée sur Ångström originellement crée en tant qu'OS libre pour les SmartPhones.</p>


	<a name='chapter_3'></a>
  <h2>Installation de la nouvelle ROM</h2>
	
<h3>Les règles de base</h3>
<p>Tout d'abord les règles d'OR pour que les mises à jour se passent le mieux possible :</p>
<p>Ne jamais, lors d'une mise à jour, avoir en même temps une carte SD et CF (mémoire ou pas). Faites un choix et tenez-y vous. Si vous utilisez une SD, enlever la CF pour tout le reste du processus, et vice versa.</p>
<p>Le media choisi (CF ou SD) doit être impérativement formaté en FAT16. Rien ne marchera sans cela. Vous pouvez formater une carte une fois pour toute et n'aurez pas à le faire à chaque fois mais il faut que ce soit ce formatage là et pas un autre (pas de FAT32 par exemple, ni NTFS).</p>
<p>Prenez plutôt une petite carte SD/CF de 256/512 mo car dans ces phases délicates de mise à jour, le Zaurus a quelques problèmes à comprendre les grosses cartes (ma Transcend SD 1Gb ne passe par exemple pas !). </p>
<p>Avant de commencer, sauvegardez vos données personnelles sur une carte, à l'abri. Les procédures de mise à jour qui suivent (notamment la restauration de la flash) détruisent TOUTES les données du Zaurus. Vous êtes prévenu...</p>
<p>Les combinaisons de touches sont un peu surprenantes mais la manière simple de les effectuer est simplement de poser le Zaurus sur une table, de presser les touches avec les doigts d'une main, ce qui maintient le Zaurus contre la table, et d'insérer le câble d'alimentation de l'autre main. C'est peut-être idiot comme conseil mais j'aurais aimé que l'on me le donne avant d'attraper des crampes <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>Toutes les manipulations qui suivent se font <b>batterie éjectée</b>, <b>alimentation externe débranchée</b>, <b>toutes les cartes éjectées</b> (CF et SD). Vous ne remettrez la batterie que lorsque tout fonctionnera.</p>


<h3>Backup de la mémoire NAND</h3>
<p>
Ce processus n'a en soit que l'intérêt de mettre une configuration à l'abri avant de faire une mise à jour un peu rodéo. Personnellement je n'ai jamais fait de sauvegarde autre que pour ce tutorial. J'utilise directement les backups existants pour remettre mon Zaurus à l'état d'origine. Je part du principe que toutes les règles de bases citées plus haut sont respectées : formatage en Fat16, batterie éjectée, alimentation externe débranchée, etc.
</p>
<ol>
    <li>Le Zaurus est éteint, batterie retirée, alimentation retirée et aucune carte n'est insérée (CF ou SD)</li>
  <li>Insérez la carte qui contiendra le backup dans votre Zaurus.</li>
  <li>Presser les touches <b>Fn</b>, <b>D</b> et <b>M</b> en même temps, et insérez la prise d'alimentation externe. Le menu de diagnostic doit apparaître. Vous pouvez relâcher les touches.</li>
  <li>Avec les flèches <b>Haut</b> et <b>Bas</b>, allez sur la page <b>SERVICE(3/3)</b></li>
  <li>Avec les flèches <b>Gauche</b> et <b>Droite</b> allez dans le menu <kbd>BACKUP RESTORE MENU</kbd>. Pressez <b>OK</b></li>
  <li>Descendez sur <b>NAND Flash Backup</b>, pressez <b>OK</b>.</li>
  <li>Le menu affiche <b>Execute Backup?</b> Pressez <b>OK</b>. Cela devrait afficher <b>Backup...</b> avec une barre de progression pouvant aller de 10 à 30 minutes.</li>
  <Li>Une fois fini, le menu affiche <b>OK</b>. Vous pouvez débrancher l'alimentation. Remettez la batterie et pressez <b>On</b> pour redémarrer le Zaurus. </li>
</ol>

<h3>Restauration de la NAND</h3>
<image id="1"/><p>Revenir à la ROM d'origine du Zaurus peut avoir plusieurs raisons. Tout d'abord pour repasser d'un version &gt;4 de pdaXrom à une version plus ancienne. Mais aussi s'il l'on décide finalement que la ROM d'origine nous convient mieux (du moins sa version traduite en anglais). </p>
<p>Une autre raison pouvant vous amener à restaurer une ROM d'origine est simplement que le Zaurus ne boot plus du tout. En effet, il est normalement toujours possible d'effectuer ce qui suit. J'utilise exprès la procédure d'urgence, c'est à dire la copie de sauvegarde du menu de maintenance qui est toujours sensé fonctionner.</p>
<p>Tout d'abord pour restaurer une image d'origine, il faut en posséder une. Des images sont disponibles sur le site de Trisoft à l'adresse <external href="http://www.trisoft.de/en_c1000howto.htm"/>http://www.trisoft.de/en_c1000howto.htm</external>. Je vous conseille de télécharger celle qui correspond à votre Zaurus et de la garder précieusement dans un coin. C'est une archive Zip qui doit contenir un seul fichier <kbd>SYSTC100.DBK</kbd>.
</p> 
<ol>
    <li>Le Zaurus est éteint, batterie retirée, alimentation retirée et aucune carte n'est insérée (CF ou SD)</li>
  <li>Copier sur la carte, à la racine, le fichier de backup qui doit se nommer <kbd>SYSTC100.DBK</kbd></li>
  <li>Insérez la carte dans le Zaurus</li>
  <li>Presser les touches <b>Fn</b>, <b>D</b> et <b>M</b> en même temps, et insérez la prise d'alimentation externe. Le menu de diagnostic doit apparaître. Vous pouvez relâcher les touches.</li>
  <li>Avec les flèches <b>Haut</b> et <b>Bas</b>, allez sur la page <b>SERVICE(3/3)</b></li>
  <li>Avec les flèches <b>Gauche</b> et <b>Droite</b> allez dans le menu <kbd>BACKUP RESTORE MENU</kbd>. Pressez <b>OK</b></li>
  <li>Descendez sur <b>NAND Flash Restore</b>, pressez <b>OK</b>.</li>
  <li>Presser <b>OK</b> à la question <kbd>Execute restore?</kbd></li>
  <li>Puis encore <b>OK</b> à la question <kbd>Delete all flash data?</kbd></li>
  <li>Le menu affiche <b>Restore...</b>La restauration devrait s'effectuer avec une barre de progression verte en bas de l'écran.</li>
  <Li>Une fois fini, le menu affiche <b>OK</b>. Vous pouvez débrancher l'alimentation. Remettez la batterie et pressez <b>On</b> pour redémarrer le Zaurus. </li>
</ol>

<h3>Mise à jour "classique"</h3>
<image id="2"/>  <p>
  Le Zaurus est donc à son état d'origine (voir chapitre précédent). Nous allons installer la rom ancienne génération <b>pdaXrom béta 3</b> (La procédure pour <kbD>OpenZaurus</kbD> est à peu près la même). Il faut d'abord télécharger sur le site de <a class='external' target='_blank' href='http://mail.pdaxrom.org' >pdaXrom</a> le fichier <kbd>kathrin-1.1.0beta3-akita.zip</kbd>. Il contient trois fichiers : <kbd>initrd.bin  tools.tar  updater.sh</kbd>. 
  <ol>
    <li>Le Zaurus est éteint, batterie retirée, alimentation retirée et aucune carte n'est insérée (CF ou SD)</li>
    <LI>Copier à la racine de la carte les fichiers initrd.bin  tools.tar  et updater.sh</LI>
    <li>Insérez la carte dans le Zaurus</li>
    <li>Insérez la batterie (et la verrouiller) et insérez l'alimentation externe</li>
    <li>Pressez la touche <b>OK</b> et en la maintenant appuyée, pressez le bouton <kbd>ON</kbd>.</li>
    <li>Le menu de maintenance doit apparaître (en Japonais). </li>
    <li>Descendez avec les touches <b>haut</b> et <b>bas</b> sur la ligne n°4 et pressez <b>OK</b></li>
    <li>Si vous avez inséré une carte CF, restez sur la ligne n°1, sinon, allez sur la ligne n°2. Pressez <b>OK</b></li>
    <li>En japonais, le menu vous demande poliment si vous êtes sûr de ce que vous faites. Pressez la touche <b>Y</b>.</li>
    <li>Le processus de mise à jour démarre.</li>
    <li>L'installateur de pdaXrom vous propose son menu, sélectionnez <kbD>Install a new ROM</kbD> puis pressez <kbd>OK</kbd>.</li>
    <li>L'installateur commence à flasher la ROM. </li>
    <li>L'installateur vous demande s'il doit flasher la zone utilisateur, pressez <kbd>OK</kbd></li>
    <li>Une fois son travail terminé, l'installateur vous re-propose son menu, descendez jusqu'à <kbD>Reboot</kbD>, pressez <kbd>OK</kbd></li>
    <li>Si tout c'est bien passé, le Zaurus boot correctement et affiche au bout d'un temps l'invite de connexion <kbd>pdaXrom 1.1.0r3 "Kathrin"</kbd>.</li>
  <li>Tapez <kbd>root</kbd> puis <kbd>OK</kbd>. Vous êtes connecté, une invite s'affiche <kbd>#</kbd></li>
  <li>Pour démarrer le mode graphique tapez <kbd>startx</kbd> puis <kbd>OK</kbd>. La serveur graphique démarre, et vous demande de calibrer le stylet. C'est terminé.</li>
</ol>
</p>

<h3>Mise à jour "étendue" (pdaXrom beta 4 et plus)</h3>
<div class='inline-box attention'>
Attention, ce qui suit ne fonctionne pas avec une carte Compacte Flash !!!
</div>
<ol>
  <li>Le Zaurus est éteint, batterie retirée, alimentation retirée et aucune carte n'est insérée (CF ou SD)</li>
  <li>Télécharger le fichier <kbd>pdaXrom-1.1.0r121-Kathrin-u-boot-akita-current.zip</kbd> (4/5mo) qui se trouve <a href='#' title='Avant de mourrir, ce lien pointait sur : http://www.pdaxrom.org/download/1.1.0r121/Zaurus-Cxx00/' >ici</a>. </li>
  <li>Vider le contenu de votre carte SD et décompressez à sa racine le contenu de l'archive téléchargée : <kbd>autoboot.sh emergenc.img u-boot.bin  updater.pro  updater.sh</kbd></li>
  <li>Insérez la carte SD dans votre Zaurus.</li>
  <li>Presser les touches <b>C</b> et <b>D</b> en même temps, et insérez la prise d'alimentation externe.</li>
  <li>Les leds verte et jaune vont s'allumer en même temps. Vous pouvez relâcher les touches. Les leds vont rester allumer pendant une vingtaine de secondes. Attention l'écran ne dis rien et c'est normal ! Si les deux leds ne s'éteignent jamais, vérifier que vous n'avez pas une CF de type WIFI (ou autre) dans le Zaurus en même temps que la SD. Si les deux Leds se mettent à clignoter c'est que quelque chose ne va pas avec votre carte, que vous n'avez pas formaté en FAT16 ou encore que vous avez laissé insérée une CF et une SD, il faut faire un choix <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/wink2.gif" title="Wink" alt="Wink" class="smiley-content"/>.</li>
  <li>Lorsque les Leds s'éteignent, débranchez l'alimentation. C'est terminé.</li>
</ol>
<p>
 Le bootloader et le menu emergency sont installés. Notez qu'une fois ceci fait, l'installation d'une ROM d'ancienne génération est impossible car il n'y a plus de menu de maintenance. Vous devez donc passez par la restauration de la ROM d'origine. Ceci dit, si vous n'installez plus que des ROM nouvelle génération, l'installation que vous venez de faire n'est pas à recommencer à chaque fois. C'est fait une fois pour toute, du moins jusqu'à ce que u-boot change de version ou soit remplacé par autre chose... 
</p>
<p>
Une chose importante à comprendre au sujet du menu emergency est qu'il s'agit d'un vrai linux. EN fait, lorsque vous passez en mode emergency (en pressant <kbd>ON</kbd> avant allumage du Zaurus), le bootloader (u-boot) va démarrer non pas sur le kernel standard, mais sur ce kernel emergency de secours. Une fois que celui-ci a démarré, il va regarder le lecteur SD (et seulement lui !!) s'il existe un fichier nommé <kbd>autoboot.sh</kbd>. Si ce fichier existe, il va être exécuté, sinon, le linux de maintenance donne la main à l'utilisateur pour saisir des commandes d'urgence. Il s'agit donc à la fois d'un système de mise à jour et d'un système de "démarrage sans échec" en cas de gros problème. 
</p>

<p>
  Maintenant que le bootloader est installé, il faut passer à l'installation de pdaXrom lui-même.
</p>

<ol>
  <li>Le Zaurus est éteint, batterie retirée, alimentation retirée et aucune carte n'est insérée (CF ou SD)</li>
  <li>Télécharger l'archive <kbd>pdaXrom-1.1.0r121-Kathrin-akita-current.zip</kbd> (45/50mo)</li>
  <li>Effacer tous les fichiers sur votre carte SD.</li>
  <li>Décompresser à la racine de la carte mémoire le contenu de l'archive : <kbd>autoboot.sh kernel.img  rootfs.img</kbd></li>
  <li>Insérez la carte dans votre Zaurus.</li>
  <li>Presser les touches <b>OK</b> et en même temps, insérez la prise d'alimentation externe.</li>
  <li>Lorsque quelque chose s'affiche à l'écran, vous pouvez relâcher la touche <kbd>OK</kbd>. Au bout d'un temps, le menu <kbd>pdaXrom emergency system</kbd> apparaît et s'arrête sur une question <kbd>Proceed with pdaxrom installation or boot to emergency system</kbd>. </li>
  <li>Tapez <kbd>y</kbd> puis <kbd>OK</kbd></li>
  <li>L'installateur procéde au flashage de la nouvelle ROM</li>
  <li>L'installateur va rebooter le Zaurus.</li>
  <li>Si tout c'est bien passé, le Zaurus boot correctement et affiche au bout d'un temps l'invite de connection <kbd>pdaXrom 1.1.0r121 "Kathrin"</kbd>.</li>
  <li>Tapez <kbd>root</kbd> puis <kbd>OK</kbd>. Vous êtes connecté, une invite s'affiche <kbd>#</kbd></li>
  <li>Pour démarrer le mode graphique tapez <kbd>startx</kbd> puis <kbd>OK</kbd>. La serveur graphique démarre, et vous demande de calibrer le stylet. C'est terminé.</li>
</ol>
    ]]></content>
  </entry>
  <entry>
    <title>Fabriquer sa rom pdaXrom</title>
    <link rel="alternate" type="text/html" href="http://artisan.karma-lab.net/node/1110" />
    <id>http://artisan.karma-lab.net/node/1110</id>
    <published>2006-12-06T23:16:41+01:00</published>
    <updated>2008-10-01T02:19:24+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>
   Je voulais depuis un certain temps déjà construire ma propre ROM, basée sur la distribution pdaXrom. Pourquoi faire ? pour y inclure mes paquets préférés, ne pas avoir à tout reconfigurer à chaque installation, mais aussi être plus indépendant vis à vis des auteurs de la distribution et par exemple construire des ROM intermédiaires avant les sorties officielles. La procédure normale pour reconstruire une ROM est de booter sur l'iso de pdaXrom pour i86 et d'utiliser un outil, appelé <kbd>builder</kbd>. Le problème est que je n'ai aucune envie de booter sur un CD, de dédier une machine à cela, ni même perdre de la ressource et du temps à utiliser vmware. Ce tutorial est donc une manipulation du processus d'origine pour utiliser ces deux mêmes outils mais directement sous Mandriva...
</p>  
    ]]></summary>
    <content type="html"><![CDATA[<p>
   Je voulais depuis un certain temps déjà construire ma propre ROM, basée sur la distribution pdaXrom. Pourquoi faire ? pour y inclure mes paquets préférés, ne pas avoir à tout reconfigurer à chaque installation, mais aussi être plus indépendant vis à vis des auteurs de la distribution et par exemple construire des ROM intermédiaires avant les sorties officielles. La procédure normale pour reconstruire une ROM est de booter sur l'iso de pdaXrom pour i86 et d'utiliser un outil, appelé <kbd>builder</kbd>. Le problème est que je n'ai aucune envie de booter sur un CD, de dédier une machine à cela, ni même perdre de la ressource et du temps à utiliser vmware. Ce tutorial est donc une manipulation du processus d'origine pour utiliser ces deux mêmes outils mais directement sous Mandriva...
</p>  
<!--break-->


	<a name='chapter_4'></a>
  <h2>Création du mini-linux</h2>
	
<p>
  La première phase consiste à extraire de l'image ISO de pdaX86, un l'environnement de compilation complet pour pdaXrom. L'idée est de créer dans un dossier, un mini-linux <a class='external' target='_blank' href='http://artisan.karma-lab.net/node/1055' >chrooté</a> à partir du contenu de l'image ISO originale. Attention cependant, compiler une ROM prends beaucoup de place, et il faut prévoir au minimum 10Go à l'endroit que vous choisissez de travailler (/home dans mon cas). 
  
  <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> ~<span class="sy0">/</span>zaurus<br />
<span class="kw3">cd</span> &nbsp;~<span class="sy0">/</span>zaurus
  </div>
  
  </div>
</p>

<p>
  La première chose à faire est donc de télécharger la <a href='#' title='Avant de mourrir, ce lien pointait sur : http://www.pdaxrom.org/download/1.1.0r121/pdaX86/pdaXrom.iso' >dernière version de pdaXrom.iso</a>.
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <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>pdaX86<span class="sy0">/</span>pdaXrom.iso
  </div>
  
  </div>
</p>

<p>
  Ceci fait, nous allons <a class='external' target='_blank' href='http://artisan.karma-lab.net/node/9' >monter cette image iso</a>. Elle contient un fichier nommé <kbd>boot/rootfs.bin</kbd>. C'est un fichier formatté en <kbd>squashfs</kbd> qu'il va falloir monter à son tour pour obtenir les fichiers de notre mini-linux. 
  
  <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> tmp.iso<br />
<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/mount"><span class="kw2">mount</span></a> pdaXrom.iso tmp.iso -o loop<br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/mkdir"><span class="kw2">mkdir</span></a> tmp.rootfs<br />
<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/mount"><span class="kw2">mount</span></a> -t squashfs tmp.iso<span class="sy0">/</span>boot<span class="sy0">/</span>rootfs.bin tmp.rootfs -o loop
  </div>
  
  </div>
</p>

<p>
  Nos fichiers sont maintenant dans <kbd>tmp.rootfs</kbd>. Nous alors les transférer sur le disque dur physique pour créer le mini-linux. J'utilise <kbd>sudo</kbd> car certains fichiers contenus dans rootfs ne sont manipulables que par root. 
  
  <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> pdaXrom<br />
<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/rsync"><span class="kw2">rsync</span></a> -av tmp.rootfs<span class="sy0">/*</span> pdaXrom<span class="sy0">/*</span>
  </div>
  
  </div>
</p>

<p>
  Les fichiers ainsi copiés, il ne nous reste plus qu'à démonter nos images et à enlever les points de montage :
  
  <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/umount"><span class="kw2">umount</span></a> tmp.rootfs<br />
<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/umount"><span class="kw2">umount</span></a> tmp.iso<br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/rm"><span class="kw2">rm</span></a> -rf tmp.rootfs tmp.iso
  </div>
  
  </div>
</p>

<p>
  Nous allons avoir besoin d'internet dans notre chroot. Il faut donc configurer le fichier <kbd>pdaXrom/etc/resolv.conf</kbd> comme celui du linux hôte (ce fichier est responsable de la résolution des noms de domaine et son contenu pointe sur vos serveurs DNS) :
  
  <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/cp"><span class="kw2">cp</span></a> <span class="sy0">/</span>etc<span class="sy0">/</span>resolv.conf pdaXrom<span class="sy0">/</span>etc<span class="sy0">/</span>resolv.conf
  </div>
  
  </div>
</p>

<p>
  Il va maintenant falloir récupérer la dernière version du builder de pdaXrom. En effet, si pdaXrom.iso contient un pdaXrom pour i86, il ne contient pas pour autant l'outil capable de fabriquer pdaXrom. Cet outil c'est le builder et l'on peut simplement le récupérer via la commande <kbd>svn</kbd> (subversion) :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  svn <a target="blank" href="http://pwet.fr/man/linux/commandes/co"><span class="kw2">co</span></a> https:<span class="sy0">//</span>mail.pdaXrom.org<span class="sy0">/</span>svn<span class="sy0">/</span>pdaXrom-builder<span class="sy0">/</span>trunk<br />
<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/mv"><span class="kw2">mv</span></a> trunk pdaXrom<span class="sy0">/</span>root<span class="sy0">/</span>builder
  </div>
  
  </div>
</p>

<p>
  Notez le numéro de release subversion logiquement supérieur à 121 (dans mon cas, 165). En effet, depuis la béta 121 de pdaXrom, les numéros de version sont justement les numéros de release qui s'affiche ici. Cela nous indique donc qu'il  a eu 44 modifications depuis la dernière béta.  Si subversion ne vous plaît pas (ou ne marche pas), vous pouvez toujours vous rabattre sur un téléchargement d'une version tar.bz2 sur le site de pdaXrom. 
</p>

<p>
  Il est maintenant temps de lancer notre mini-linux. La commande utilisé est bien évidement <kbd>chroot</kbd> auquel nous passons en paramètre le dossier racine (pdaXrom) ainsi que le nom du shell à lancer (bash). Les options accolées à bash permettent d'ouvrir un shell interactif qui va avant de vous donner la main, exécuter le script <kbd>pdaXrom/etc/profile</kbd>. Ceci nous permet d'avoir les bonnes variables d'environnement. Le chroot est quant à lui lancé via la commande <kbd>su -c</kbd> pour que ce soit l'utilisateur <kbd>root</kbd> qui soit utilisé. En effet, pdaXrom a été ainsi développé que tout se passe en tant que root. Enfin, la commande <kbd>su</kbd> est lancée via la commande <kbd>sudo</kbd> pour vous éviter de vous logger en tant que root. Ouf ! Cela nous donnes :
  
  <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> -c <span class="st0">&quot;chroot pdaXrom /bin/bash --rcfile /etc/profile -i&quot;</span>
  </div>
  
  </div>
</p>


	<a name='chapter_5'></a>
  <h2>Correction de l'environnement</h2>
	
<p>
  Normalement vous êtes maintenant dans pdaXrom. Il reste cependant quelques bidules à paufiner. Tout d'abord un bug (en tout cas sous mandriva) dans le builder. Très simple à régler, il s'agit de modifier ligne 46 le fichier <kbd>~/builder/configure</kbd> pour remplacer <kbd>f0</kbd> par <kbd>f1</kbd>. Ceci fait, il faut aussi générer un fichier manquant en lançant la commandes suivante :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  gdk-pixbuf-query-loaders <span class="sy0">&gt;</span> <span class="sy0">/</span>etc<span class="sy0">/</span>gtk<span class="nu0">-2.0</span><span class="sy0">/</span>gdk-pixbuf.loaders <br />
<span class="co0"># pour plus tard : pango-querymodules &gt; /etc/pango/pango.modules</span>
  </div>
  
  </div>
</p>


	<a name='chapter_6'></a>
  <h2>Construction de la tool-chain</h2>
	
<p>
  Une tool-chain, c'est un ensemble d'utilitaires permettant de construire un linux à partir de rien. Cela comprends bien évidement gcc, mais aussi flex, bison, automake, etc... Bref, tout ce qu'il faut pour compiler du code binaire pour le Zaurus (processeur ARM). Le builder va faire cela pour nous très simplement. Il suffit tout d'abord de lui demande ce qu'il est capable de fabriquer :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="kw3">cd</span> ~<span class="sy0">/</span>builder<br />
.<span class="sy0">/</span>configure <span class="sy0">|</span> <a target="blank" href="http://pwet.fr/man/linux/commandes/grep"><span class="kw2">grep</span></a> xtools
  </div>
  
  </div>
</p>
<p>
  Là, on découvre que pdaXrom ne se limite pas au Zaurus. Pour mieux décrypter cela il faut connaitre les races de Zaurus (en effet, chaque modèle de zaurus est désigné par une race de... chien <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/wink2.gif" title="Wink" alt="Wink" class="smiley-content"/> :
</p>
<table>
<tr><th>Modèle</th><th>Race</th></tr>
<tr><td>SL-5000D</td><td>Collie</td></tr>
<tr><td>SL-5600</td><td>Poodle</td></tr>
<tr><td>SL-C700</td><td>Corgi</td></tr>
<tr><td>SL-C750</td><td>Shepherd</td></tr>
<tr><td>SL-C760</td><td>Husky</td></tr>
<tr><td>SL-C860</td><td>Boxer</td></tr>
<tr><td>SL-6000</td><td>Tosa</td></tr>
<tr><td>SL-C3000</td><td>Spitz</td></tr>
<tr><td>SL-C1000</td><td>Akita</td></tr>
<tr><td>SL-C3100</td><td>Borzoi</td></tr>
<tr><td>SL-C3200</td><td>Terrier</td></tr>
</table>
<p>
  Si vous ne trouvez pas votre modèle dans les configurations, tentez la plus proche. Dans mon cas, c'est <kbd>akita</kbd>, je vais donc rechercher les configuration pour cette machine :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  .<span class="sy0">/</span>configure <span class="sy0">|</span> <a target="blank" href="http://pwet.fr/man/linux/commandes/grep"><span class="kw2">grep</span></a> akita<br />
<span class="co0"># &nbsp; akita-kernel-2.6-rom</span><br />
<span class="co0"># &nbsp; akita-kernel-2.6-rom_no_gui</span><br />
<span class="co0"># &nbsp; akita-kernel-2.6-xtools</span><br />
<span class="co0"># &nbsp; akita-kernel-2.6-initrd-rom</span><br />
<span class="co0"># &nbsp; akita-kernel-2.6-initrd-xtools</span>
  </div>
  
  </div>
</p>
<p>
  Deux configurations nous intérèssent particulièrement : <kbd>xtools</kbd> (c'est la fameuse tool-chain) et <kbd>rom</kbd> (c'est pdaXrom installable). Nous allons donc demander à configure de nous créer une tool-chain pour akita :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  .<span class="sy0">/</span>configure akita-kernel<span class="nu0">-2.6</span>-xtools ~<span class="sy0">/</span>myAkita http:<span class="sy0">//</span>mail.pdaXrom.org<span class="sy0">/</span>src
  </div>
  
  </div>
</p>
<p>
  Lorsque <kbd>./configure</kbd> a terminé, il a crée un dossier <kbd>~/myAkita</kbd> qui sera notre environnement de travail à partir de maintenant. Nous lui avons aussi spécifié une url pour trouver les sources des paquets à compiler, nous y reviendrons. Maintenant, nous pouvons aller dans notre nouvel environnement pour construire notre tool-chain :
 
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="kw3">cd</span> ~<span class="sy0">/</span>myAkita<br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/make"><span class="kw2">make</span></a> virtual-xchain_install
  </div>
  
  </div>
</p>
<a name="3"></A><p>
  Au fur et à mesure de la progression, le builder va télécharger les sources de chacun des éléments à compiler (gcc, automake, etc...). Ces sources sont stockés dans <kbd>~/myAkita/src</kbd>. Le problème est que parfois... souvent... le site de pdaXrom tombe en panne. Le téléchargement ne peut donc se faire. Pour régler cela, il suffit d'indiquer au builder de ne plus aller chercher les tarballs sur le site de pdaXrom mais sur l'URL d'origine. Pour se faire, il suffit de supprimer le fichier <kbd>~/myAkita/.clone</kbd> et de relancer le <kbd>make world</kbd>.</p>
<p>Si cependant, même le site d'origine ne fonctionne pas, la solution ultime consiste simplement à copie le nom du fichier que lui builder tente de télécharger (par exemple, gcc-3.4.6.tar.bz2), de coller ce nom dans google qui doit logiquement vous renvoyer une page où trouver le paquet (par exemple http://gcc.fyxm.net/releases/gcc-3.4.6/gcc-3.4.6.tar.gz). Il suffit alors d'arrêter le builder (CTRL-C) et de taper :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="kw3">cd</span> src<br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/wget"><span class="kw2">wget</span></a> http:<span class="sy0">//</span><a target="blank" href="http://pwet.fr/man/linux/commandes/gcc"><span class="kw2">gcc</span></a>.fyxm.net<span class="sy0">/</span>releases<span class="sy0">/</span><a target="blank" href="http://pwet.fr/man/linux/commandes/gcc"><span class="kw2">gcc</span></a><span class="nu0">-3.4</span><span class="nu0">.6</span><span class="sy0">/</span><a target="blank" href="http://pwet.fr/man/linux/commandes/gcc"><span class="kw2">gcc</span></a><span class="nu0">-3.4</span><span class="nu0">.6</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> ..<br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/make"><span class="kw2">make</span></a> virtual-xchain_install
  </div>
  
  </div>
</p>

<p>
  Et la compilation peut alors se poursuivre...
</p>

<p>
  Au bout d'une bonne demi-heure (sur un Sempron 2400+ qui ne fait pas que cela), la tool-chain est compilée. Cela veut dire que dans votre dossier pdaXrom/opt a été créé un dossier <kbd>cross</kbd> qui contient toute la tool-chain de compilation pour le Zaurus. Pour éviter d'avoir à refaire cela, nous pouvons demander à créer une archive de cette toolchain :
  
  <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> archive-toolchain
  </div>
  
  </div>
</p>

<p>
  Cela ne va rien enlever de ce qui a été fait mais juste faire un fichier <kbd>.tar.bz2</kbd> à la racine du compte (en ~ donc). 
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <a target="blank" href="http://pwet.fr/man/linux/commandes/ls"><span class="kw2">ls</span></a> ~<br />
<span class="co0"># armv5tel-cacko-linux-3.4.6-2.16-2.2.5-softfloat-10.20_06.12.06.tar.bz2 &nbsp;builder &nbsp;myAkita</span>
  </div>
  
  </div>
</p>

<p>
  Nous allons maintenant passer à la compilation de la ROM, mais avant, un peu de ménage s'impose. Cela va juste enlever les artefacts de compilations (dans le dossier build). Cela n'enlève ni les sources (qui ne seront donc plus à télécharger), ni la toolchain (en /opt/cross). 
  
  <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> clean
  </div>
  
  </div>
</p>


	<a name='chapter_7'></a>
  <h2>Compilation de la ROM</h2>
	
<p>
  Le builder de pdaXrom est en réalité un projet développé par la société <a class='external' target='_blank' href='http://www.pengutronix.de/software/ptxdist/index_en.html' >pengutronix</a>. Il est basé sur des fichiers de configuration (comme vu plus haut) qui fonctionnent un peu comme ceux d'un kernel linux. Pour compiler la toolchain, nous avons chargé la configuration <kbd>akita-kernel-2.6-xtools </kbd> en spécifiant un dossier de travail <kbd>~/myAkita</kbd> et une url pour les sources. Nous avons pour cela utilisé le <kbd>./configure</kbd> du dosser <kbd>builder</kbd> (celui récupéré de SVN). Nous allons maintenant reproduire cette procédure pour changer de configuration mais cette fois à partir du dossier <kbd>~/myAkita</kbd>. Comme tout a déjà été configuré, nous n'avons besoin de donner à <kbd>./configure</kbd> que le nom de la configuration à exécuter. Tout d'abord, pour connaitre ce nom pour un modèle akita :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  &nbsp; <span class="kw3">cd</span> ~<span class="sy0">/</span>myAkita<br />
&nbsp; .<span class="sy0">/</span>configure <span class="sy0">|</span> <a target="blank" href="http://pwet.fr/man/linux/commandes/grep"><span class="kw2">grep</span></a> akita <span class="sy0">|</span> <a target="blank" href="http://pwet.fr/man/linux/commandes/grep"><span class="kw2">grep</span></a> rom<br />
<span class="co0"># &nbsp; &nbsp;akita-kernel-2.6-rom</span><br />
<span class="co0"># &nbsp; &nbsp;akita-kernel-2.6-rom_no_gui</span><br />
<span class="co0"># &nbsp; &nbsp;akita-kernel-2.6-initrd-rom</span>
  </div>
  
  </div>
</p>

<p>
  C'est la première configuration qui nous interesse
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  &nbsp; &nbsp;.<span class="sy0">/</span>configure akita-kernel<span class="nu0">-2.6</span>-rom<br />
<span class="co0"># &nbsp; &nbsp;Setup for SHARP ZAURUS SL-C1000/C3100 pdaXrom with kernel 2.6, target rom</span>
  </div>
  
  </div>
</p>

<p>
   Maintenant, nous pouvons faire une chose très interessante, à savoir personnaliser pdaXrom. Dans un premier temps, je vous conseil de ne pas le faire et de sauter cette étape. Sinon, il suffit, comme pour un kernel, de taper :
  
  <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> menuconfig
  </div>
  
  </div>
</p>
<p>
<image id="1"/>
   Là, s'affiche un menu très conviviale en mode texte. La partie la plus intéressante se trouve dans <kbd>Ipk packages</kbd> qui nous permet de choisir les packages que l'on cherche à compiler et si oui ou non, ces paquets doivent être installés par défaut. Faites bien attention à ce que vous faites <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/wink2.gif" title="Wink" alt="Wink" class="smiley-content"/> Une fois terminé, il suffit de sortir en demandant à sauvegarder la configuration. Cette configuration est un fichier texte stocké en <kbd>~/myAkita/.config</kbd>. Vous pouvez donc en faire une sauvegarde pour la prochaine fois. 
</p>

<p>
  Maintenant il est temps de compiler notre ROM et d'aller voir s'il fait beau dehors....
  
  <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> world
  </div>
  
  </div>
</p>

<p>
  Une fois que la compilation est terminée, l'ensemble des nouveaux paquets sont dans le dossier <kbd>bootdisk/feed</kbd>. Nous pouvons maintenant créer l'image de la ROM :
  
  <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> image
  </div>
  
  </div>
</p>

<p>
  Lorsque c'est fini, il suffit de prendre les fichiers <kbd>autoboot.sh</kbd>, <kbd>kernel.img</kbd> et <kbd>rootfs.img</kbd> qui se trouvent dans le dossier <kbd>bootdisk</kbd> et de les mettres, comme d'habitude sur une carte SD. De rebooter le Zaurus, maintenir <kbd>OK</kbd> pressé pour passer en mode <kbd>emergency</kbd>, répondre <kbd>y</kbd> et regarder avec angoisse les blocks défiller. Ensuite le système reboote, et miracle, ça marche !! Je me logue sans souci, lance X sans soucis, et je n'ai plus de bluetooth (le retirer était ma seule modification à la configuration) preuve que je suis bien sur MA rom <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/wink2.gif" title="Wink" alt="Wink" class="smiley-content"/>
</p>
<a name="1"></A>
	<a name='chapter_8'></a>
  <h2>Paramétrage du kernel</h2>
	
<p>
Paramétrer le kernel permet de comprendre quelques aspects interne du builder. Jusqu'à maintenant nous avons compiler <kbd>world</kbd>, mais là, nous n'allons compiler QUE le kernel en le modifiant pour nos besoins. Dans la mesure où tout est déjà compilé, le builder ne cherchera pas à reconstruire le reste. La première chose à faire est donc de modifier la configuration du kernel, pour cela, aller dans le dossier <kbd>/root/myAkita/build/linux-2.6.16</kbd> et taper :

  <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> <span class="re2">ARCH=</span>arm menuconfig
  </div>
  
  </div>
</p>
<p>
  Là s'affiche le menu classique de configuration d'un kernel. Pour notre test, nous allons ajouter le logo linux au boot du Zaurus. Pour cela, aller dans la section <kbd>Device Drivers</kbd>, puis <kbd>Graphics Support</kbd>, <kbd>Logo Configuration</kbd>, et appuyez sur <kbd>Espace</kbd>. Une étoile devrait apparaître ainsi que des sous-options pré-activées. Maintenant faites <kbd>exit</kbd> plusieurs fois jusqu'à ce que vous soit proposé la sauvegarde, et dites <kbd>yes</kbd>. Dans la mesure où l'on cherche à compiler un kernel pour ARM et que menuconfig vient de compiler des choses pour i86, il est sage à ce stade de taper un <kbd>make clean</kbd>. Ensuite, il faut retourner dans <kbd>~/myAkita</kbd> pour relancer une compilation, mais pas de world cette fois, du kernel seulement.
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="kw3">cd</span> ~<span class="sy0">/</span>myAkita<br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/touch"><span class="kw2">touch</span></a> state<span class="sy0">/</span>kernel.prepare<br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/make"><span class="kw2">make</span></a> kernel_compile
  </div>
  
  </div>
</p>
<p>
  la commande <kbd>touch</kbd> est utilisé ici pour mettre à la date et à l'heure courante le fichier <kbd>state/kernel.prepare</kbd>. Cela indique au builder que toutes les étapes suivantes doivent être refaite. Ensuite la commande <kbd>make</kbd> demande au  builder de construire (compile) spécifiquement le kernel. C'est un aspect très intéressant du builder car il permet d'effectuer sur un paquet spécifique une action spécifique sans toucher à ce qui a déjà été fait. La syntaxe générale est <kbd>make PAQUET_ACTION</kbd>. Pour avoir une liste des paquets utilisable, tapez simplement <kbd>make help</kbd>.  
</p>
<p>
  Une fois la construction terminée, il suffit de reprendre la procédure au <kbd>make image</kbd> et installer notre nouvelle ROM dans le Zaurus. Et normalement, au démarrage, le logo devrait apparaître. 
</p>
<p>
  Personnellement j'utilise ce type de paramétrage pour réduire la taille du noyau à ce qui m'intéresse réellement. PdaXRom a été conçu pour un maximum de gens, moi par exemple je n'utilise pas l'ipv6, je peux donc l'enlever et alléger ainsi le kernel (idem pour bluetooth, irda, etc...). Après chacun peut faire à peu près ce qu'il désire. 
</p>

<A name="2"></A>
	<a name='chapter_9'></a>
  <h2>Monter la nouvelle ROM</h2>
	
<p>Avant de l'installer sur le Zaurus, il peut  être utile de monter la ROM "à la main" pour vérifier qu'elle contient bien ce que nous y avons voulu. Cette même technique peut être appliquée à une version non custom de la ROM. Pour cela nous allons simuler la mémoire flash du Zaurus sur notre PC et y monter notre fichier <kbd>rootfs.img</kbd> fraîchement créé dans le dossier <kbd>bootdisk</kbd>.  Les manipulations qui suivent peuvent être réalisée au sein du <kbd>chroot</kbd> mis à part les <kbd>modprobe</kbd> qui ne fonctionneront qu'à l'extérieur. 
</p>
<p>
  Nous allons maintenant créer une "fausse" mémoire flash pour simuler celle du Zaurus et y transférer le fichier initrd.bin. Une sorte de flashage en quelque sorte <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>
  Pour info, mtd veut dire Memory Technology Device. Le module mtdblock est là pour offrir une vision périphérique de type "block" à la mémoire flash (qui n'est ni block, ni caractère). On va donc commencer par fabriquer ce périphérique (version majeur 31, si quelqu'un sait pourquoi ?).
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="kw3">cd</span> bootdisk<br />
modprobe mtdblock &nbsp;<br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/mknod"><span class="kw2">mknod</span></a> fausse_flash b <span class="nu0">31</span> <span class="nu0">0</span>
  </div>
  
  </div>
</p>
<p>
  Maintenant nous allons allouer 64m de ram à notre périphérique, la valeur est donc 64*1024=65535
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  modprobe mtdram <span class="re2">total_size=</span><span class="nu0">65535</span>
  </div>
  
  </div>
</p>
<p>
  Ensuite nous allons recopier notre fichier initrd.bin dans la fausse flash
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <a target="blank" href="http://pwet.fr/man/linux/commandes/dd"><span class="kw2">dd</span></a> <span class="re2">if=</span>rootfs.img <span class="re2">of=</span>fausse_flash <span class="re2">bs=</span><span class="nu0">16</span> <span class="re2">skip=</span><span class="nu0">1</span>
  </div>
  
  </div>
</p>
<p>
  Une fois la copie effectué, il suffit juste de monter notre nouveau disque en jffs version 2
  
  <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> rootfs<br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/mount"><span class="kw2">mount</span></a> -t jffs2 fausse_flash rootfs
  </div>
  
  </div>
</p>
<p>
  Et voilà, un petit ls pour vérifier que tout est bien là 
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <a target="blank" href="http://pwet.fr/man/linux/commandes/ls"><span class="kw2">ls</span></a> rootfs
  </div>
  
  </div>
</p>
<p>  Bon, une fois les vérifications terminées, un peu de ménage s'impose
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <a target="blank" href="http://pwet.fr/man/linux/commandes/umount"><span class="kw2">umount</span></a> rootfs<br />
rmmod jffs2<br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/rm"><span class="kw2">rm</span></a> -rf rootfs<br />
rmmod mtdram mtdblock<br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/rm"><span class="kw2">rm</span></a> -rf fausse_flash
  </div>
  
  </div>
</p>

	<a name='chapter_10'></a>
  <h2>Conclusion</h2>
	
<p>
  Pour l'instant notre nouvelle ROM n'est n'est ni plus rapide, ni plus belle, ni plus quoi que ce soit que l'originale. Elle présente cependant deux avantages. Déjà elle nous rends indépendant des releases de pdaXrom du kernel aux applications. De plus, le builder permet d'ajouter d'autres applications et donc d'étendre les paquets générés dans <kbd>bootdisk/feed</kbd>. Cela permet de ne plus ré-inventer la roue (comme jel'ai fait jusqu'à maintenant) et donc de bénéficier d'un outil qui semble à première vue aussi puissant que bitbake pour openZaurus. A creuser...
</p>

    ]]></content>
  </entry>
  <entry>
    <title>Comprendre les paquets IPK</title>
    <link rel="alternate" type="text/html" href="http://artisan.karma-lab.net/node/60" />
    <id>http://artisan.karma-lab.net/node/60</id>
    <published>2006-11-24T12:57:00+01:00</published>
    <updated>2008-10-01T14:05:46+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>
   <kbd>ipkg</kbd> est le gestionnaire de package utilisé sur toutes les ROM que j'ai eues entre les mains. C'est une version light de <kbd>dpkg</kbd> à ce que j'en ai compris (je ne suis pas sous debian). techniquement ce sont des archives tgz qui contiennent elles-mêmes des archives tgz <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/smile.gif" title="Smiling" alt="Smiling" class="smiley-content"/>
</p>
    ]]></summary>
    <content type="html"><![CDATA[<p>
   <kbd>ipkg</kbd> est le gestionnaire de package utilisé sur toutes les ROM que j'ai eues entre les mains. C'est une version light de <kbd>dpkg</kbd> à ce que j'en ai compris (je ne suis pas sous debian). techniquement ce sont des archives tgz qui contiennent elles-mêmes des archives tgz <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/smile.gif" title="Smiling" alt="Smiling" class="smiley-content"/>
</p>
<!--break-->

	<a name='chapter_1'></a>
  <h2>Philosophie de base</h2>
	
<p>
  Comme tous les systèmes d'installation de logiciels dans le monde *nix, ipkg est bas sur un système de paquets et de sources. Les paquets sont des fichiers archive qui contiennent les binaires à installer pour une application donnée. Généralement dans le nom d'un tel fichier est indiqué le nom de l'application, son numéro de version, l'architecture pour laquelle elle a été compilée et éventuellement une notion de sous-paquet. 
</p>
<p>
  Dans le monde Zaurus, les paquets sont des fichiers .ipk. Sans rentrer dans le détail de leur structure, ce sont basiquement des archives tar compressées. Si l'on prend l'exemple d'abiword, son paquet ipk sera par exemple nommé <kbd>abiword-plugins_2.4.5_armv5tel.ipk</kbd>. <kbd>abiword</kbd> pour le nom de l'application, <kbd>2.4.5</kbd> pour sa version et <kbd>armv5tel</kbd> pour indiquer que ce paquet est compilé pour un processeur ARM (et marchera donc difficilement sur un PC <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/smile.gif" title="Smiling" alt="Smiling" class="smiley-content"/> 
</p>
<p>
  C'est le paquet "principal" d'AbiWord, celui qui contient le coeur de l'application. Mais il peut y avoir aussi des sous-paquets qui dépendent du paquet principal, par exemple <kbd>abiword-plugins-wikipedia_2.4.5_armv5tel.ipk</kbd> qui est le plugin wikipedia d'AbiWord 2.4.5.  
</p>
<p>
  Le concept de dépendance a son importance car si les paquets sont bien faits (les miens le sont rarement <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/wink2.gif" title="Wink" alt="Wink" class="smiley-content"/> ils contiennent une série d'informations qui indique s'ils dépendent d'un autre paquet. Ainsi, lorsque vous installez un logiciel A qui dépend de B qui lui-même dépend de C, l'installateur va télécharger les 3 paquets et les installer. Avouez que c'est un peu plus pratique que les installations à la mode Windows... La question que l'on se pose alors c'est "où l'installateur va chercher B et C" ? C'est là qu'interviennent les sources (les feeds en langage Zaurus). 
</p>
<p>
  Une feed est un dossier local ou distant contennant de nombreux paquets .ipk et un fichier nommé <kbd>Packages</kbd>. Ce fichier est en quelque sorte le botin de la feed, il contient la liste de tous les paquets .ipkg disponibles dans ce répertoire. Ainsi, il est facile pour l'installateur, une fois que nous lui avons proprement indiqué le chemin d'une feed, de télécharger ce fichier en premier lieu pour lui servir d'index. C'est grâce à lui qu'il est capable de résourdre les dépendances manquantes. Vous pouvez vous convaincre de l'existence de ce fichier "caché" en allant directement le regarder dans une feed standard de pdaXrom b121.
</p>
<p>
  Bien évidemment, un installateur digne de ce nom est capable de connaître un nombre illimité de sources différentes. Et s'il est très bien fait (ce qui n'est pas le cas d'ipkg <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/wink2.gif" title="Wink" alt="Wink" class="smiley-content"/>, il est capable de mettre à jour votre système avec les versions les plus récentes. 
</p>
<p>
  En bref, pour notre Zaurus, ipkg doit être configuré pour y ajouter toutes les sources/feed dont nous avons besoin. Ce qui n'est pas le cas lorsque pdaXrom vient d'être installé, malheureusement... 
</p>


	<a name='chapter_2'></a>
  <h2>Paramétrage de ipkg</h2>
	
<p>
   Même s'il existe un frontal graphique à <kdd>ipkg</kdd>, il est formateur de savoir l'utiliser en ligne de commande pour en comprendre le fonctionnement. Et la première chose qui va donc nous intéresser est de modifier la liste des feeds pour ajouter des sources nouvelles ou simplement réparer les sources éronnées.
</p>
<p>
 Le fichier de configuration d'ipkg est <kbd>/etc/ipkg.conf</kbd>. Prenez votre éditeur de texte préféré (vi évidement <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/wink2.gif" title="Wink" alt="Wink" class="smiley-content"/> et regardez à quoi il ressemble. Vous verrez deux sections distinctes. Tout d'abord la liste des feeds. Une ligne par source au format suivant :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  src NOM URL
  </div>
  
  </div>
</p>
<p>
  Le prefix <kbd>src</kbd> indique que ce qui suit est une feed. <kbd>NOM</kbd> est n'importe quel nom de votre choix, tant qu'il est utilisé une et une seule fois, par exemple <kbd>maSource</kbd>. <kbd>URL</kbd> est l'adresse du dossier contenant les fichiers .ipk et le fameux fichier Packages (voir plus haut). Comme je le disais, la feed peut être locale, en ce cas l'URL est de la forme <kbd>http://un.site.web/dossier/feed</kbd> ou local, en écrivant <kbd>file:///chemin/vers/ma/feed/locale</kbd>. Ce qui nous donne les deux exemples suivants, le premier est la feed standard de pdaXrom pour la béta 121 modèle CX00, le second une feed locale sur ma carte compact flash :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  src pdaXrom http://www.pdaxrom.org/download/1.1.0r121/Zaurus-Cxx00/feed<br />
src maFeed &nbsp;file:///mnt/cf/maFeed
  </div>
  
  </div>
</p>
<p>
  Une fois que les feeds sont configurées, nous pouvons regarder la deuxième section d'ipkg.conf concernant les destinations. En effet, la commande ipkg installe par défaut les applications à la racine. Mais pour des raisons évidentes de place, il est parfois intéressant de stoquer les grosses applications (kdepimpe, firefox, etc..) sur une carte SD par exemple. Le format de chaque ligne est le suivant :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  dest NOM CHEMIN
  </div>
  
  </div>
</p>
<p>
  Le prefix <kbd>dest</kbd> indique que ce qui suit est une destination d'installation. <kbd>NOM</kbd> est n'importe quel nom de votre choix, comme pour les feeds. Attention cependant, autant prendre un nom facile à taper car vous l'utiliserez à chaque fois que vous voulez installer quelque chose sur cette destination. <kbd>CHEMIN</kbd> est quant à lui le chemin local (interne au Zaurus) où ipkg doit installer le binaire. Cela peut être un autre dossier de la racine (ex. /opt pour les possesseurs de disque dur), une carte SD (/mnt/SD/mesInstallations), etc... 
</p>
<p>
  Une fois les modifications effectuées, vous pouvez sauver le fichier ipkg.conf et mettre à jour la base des paquets par la commande :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  ipkg update
  </div>
  
  </div>
</p>
<AR/p>
L'utilitaire va alors télécharger chaque fichier Packages de chaque feed que vous lui avez indiquée. Ensuite pour installer une application la syntaxe est la suivante :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  ipkg -dest DESTINATION <a target="blank" href="http://pwet.fr/man/linux/commandes/install"><span class="kw2">install</span></a> PAQUET
  </div>
  
  </div> 
</p>
<p>
Si l'argument <kbd>-dest DESTINATION</kbd> est ommis, c'est la première destination du fichier ipkg.conf qui sera utilisée (généralement la /). <kbd>PAQUET</kbd> quant à lui est le nom du paquet ipk à installer, sans numéro de version, architecture et .ipk à la fin. Par exemple pour installer AbiWord sur la carte SD :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  ipkg -dest SD <a target="blank" href="http://pwet.fr/man/linux/commandes/install"><span class="kw2">install</span></a> abiword
  </div>
  
  </div>
</p>


	<a name='chapter_3'></a>
  <h2>Fonctionnement d'ipkg</h2>
	
<p>
  Lorsque vous lancez un <kbd>ipkg update</kbd>, l'ensemble des fichiers Packages de chaque feed lue par ipkg est sauvée sous le nom de la feed que vous avez indiquée via <kbd>/etc/ipkg.conf</kbd> dans le dossier <kbd>/usr/lib/ipkg/lists</kbd>. 
</p>
<p>
  Quant vous lancez une installation, ipkg, écrit une entrée dans le fichier <kbd>/usr/lib/ipkg/status</kbd> indiquant le nom du paquet et la mention <kbd>not-installed</kbd>. C'est intéressant à savoir car si vous arrêtez une installation en cours de route (ou si vous essayer d'installer un paquet qui n'existe pas), cette entrée est conservée et du coup ipkg vous redemande à chaque appel s'il doit retenter l'installation. S'il s'agit d'une erreur, il suffit au préalable de modifier le fichier  <kbd>/usr/lib/ipkg/status</kbd> et d'enlever les enregistrements marqués <kbd>not-installer</kbd>. C'est le contenu de ce fichier qui est lu lorsque vous tapez <kbd>ipkg status</kbd>.
</p>
<p>
   Ensuite ipkg va écrire ses fichiers dans un dossier temporaire <kbd>tmp</kbd> placé en dessous du dossier de destination. Par exemple en /home/tmp (pour une destination par défaut) ou /mnt/sd/tmp (pour la destination SD). C'est important à savoir lorsqu'une install plante et que l'on doit virer les packets téléchargés et non installés. 
</p>
<p>
  Lorsque vous installez dans une destination qui n'est pas la racine, ipkg va tricher avec Linux en créant un lien symbolique entre le fichier réel (par exemple /mnt/car/usr/bin/monApplication) et le dossier où Linux s'attend à trouver un tel fichier (/usr/bin). 
</p>
<p>
  Enfin, une fois l'installation terminée, la liste, par paquet, des fichiers installés est stockée par ipkg dans le dossier <kbd>/usr/lib/ipkg/infos</kbd> sous le nom <kbd>nom_paquet.list</kbd>. Par exemple pour abiword, sera crée un fichier <kbd>/usr/lib/ipkg/infos/abiword.list</kbd>.  Il va aussi mettre à jour le fichier <kbd>/usr/lib/ipkg/status</kbd> en remplaçant <kbd>not-installed</kbd> par <kbd>installed</kbd>.
</p>



	<a name='chapter_4'></a>
  <h2>Utilisation de frontal graphique qpkg</h2>
	
<p>
  <kbd>ipkg</kbd> est un outil en ligne de commande qui dispose d'un frontal graphique nommé <kbd>qpkg</kbd>. Cet outil permet visuellement d'obtenir la liste des paquets disponibles, de rajouter des feeds et de faire des mises à jour. 
</p>
<p>  
  Pour plus de confort, il est aussi possible d'utiliser <kbd>qpkg</kbd>) via SSH avec redirection X11 (voir <a href="node/53">Installation du réseau USB</a>). Pratique pour voir les paquets en plein écran et se balader avec la roulette <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/wink2.gif" title="Wink" alt="Wink" class="smiley-content"/>
</p>



	<a name='chapter_5'></a>
  <h2>Créer son propre paquet IPK</h2>
	
<p>
  Pour distribuer notre magnifique binaire fraîchement compilée un peu de packaging s'impose. Il nous faut donc le mettre dans un fichier .ipk.
</p><!--break-->


	<a name='chapter_6'></a>
  <h2>Structure des fichiers ipk</h2>
	
<p>
  Un fichiers .ipk est une simple archives <kbd>tar</kbd> compressée par <kbd>gzip</kbd> qui contient elle-même 2 autres archives : <kbd>data.tar.gz</kbd> et <kbd>control.tar.gz</kbd>. 
</p>
<p>
  Le fichier <kbd>data.tar.gz</kbd> contient les fichiers à décompresser dans le Zaurus, à partir de la racine. Dans notre cas, il contiendra de tous les fichiers contenus dans le dossier <kbd>dist</kbd> que nous avons créé par <kbd>make install</kbd>.
</p>

<p>
  Le fichier <kbd>control.tar.gz</kbd> peut contenir quatre scripts et deux fichiers de contrôles.
</p>

<p>
  Les scripts sont optionnels et seront lancés au court de la vie du paquet :
  <dl>
    <dt>preinst</dt><dd>Exécuté avant la décompression</dd>
    <dt>postinst</dt><dd>Exécuté après la décompression</dd>
    <dt>prerm</dt><dd>Exécuté avant la désinstallation</dd>
    <dt>postrm</dt><dd>Exécuté après la désinstallation</dd>
  </dl>
</p>

<p>
  Les deux fichiers sont de contrôle quant à eux :
  <dl>
    <dt>control</dt><dd>
      Fichier obligatoire contenant la description du package. Dans le cas de xinetd, ce serait :
      
  <div class='code-block code-block-fragment'>
  <div class='container'>
  Package: xinetd&lt;strong&gt; (Le nom du paquet)&lt;/strong&gt;<br />
Installed-Size: 332K &lt;strong&gt;(La taille une fois installé)&lt;/strong&gt;<br />
Filename: ./xinetd_2.3.14_arm.ipk&lt;strong&gt; (Le nom du fichier ipk)&lt;/strong&gt;<br />
Version: 2.3.14 &lt;strong&gt;(La version du paquet)&lt;/strong&gt;<br />
Depends: &lt;strong&gt;(Les éventuelles paquets dont dépends ce paquet)&lt;/strong&gt;<br />
Priority: optional &lt;strong&gt;(Je n'en sais rien du tout)&lt;/strong&gt;<br />
Section: system &lt;strong&gt;(La catégorie du paquet)&lt;/strong&gt;<br />
Maintainer: Mukti &lt;strong&gt;(La personne en charge de la mise à jour de ce paquet)&lt;/strong&gt;<br />
Architecture: arm &lt;strong&gt;(L'architecture de ce paquet, ARM pour le Zaurus)&lt;/strong&gt;<br />
Description: xinetd has access control mechanisms, extensive logging capabilities, <br />
the ability to make services available based on time, can place limits on the number of <br />
servers that can be started, and has deployable defence mechanisms to protect against port <br />
scanners, among other things.
  </div>
  
  </div>
    </dl>
    <dt>conffiles</dt><dd>Optionnel. Une liste de fichier ne devant pas être écrasée lors d'une mise à jour</dd>
  </dl>
</p>


	<a name='chapter_7'></a>
  <h2>Préparation de la distribution</h2>
	
<p>
  Tout d'abord ne pas oublier que les Zaurus n'ont pas de ressources illimitées. Un des premiers travaux à faire dans le dossier <kbd>dist</kbd> est d'enlever tout ce qui ne sert "à rien" : documentations, exemples, tests, etc... jusqu'à obtenir quelque chose de minimum. 
</p>
<p>
  Une fois ceci fait, il faut créer dans <kbd>dist</kbd> un dossier <kbd>CONTROL</kbd> qui va contenir l'ensemble des fichiers de contrôle dont nous avons parlé plus haut et donc, au minimum, le fichier <kbd>control</kbd>. Pensez à bien renseigner ce fichier et y indiquer les dépendances avec d'autres paquets.
</p>

	<a name='chapter_8'></a>
  <h2>Création de l'ipk</h2>
	
<p>
  Le meilleur moyen pour fabriquer rapidement un fichier .ipk est d'utiliser l'utilitaire <kbd>mkipkg</kbd> fourni avec le cross-compiler. 
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  mkipkg dist
  </div>
  
  </div>
  pour produire le fichier .ipk correctement formé et vérifié. Il ne reste plus qu'à l'envoyer dans le Zaurus pour le tester.
</p>


	<a name='chapter_9'></a>
  <h2>Mettre de l'ordre dans les dépots</h2>
	
<p>
  ipkg est l'outil utilisé pour installer des paquets sur pdaXrom. C'est aussi lui qui est utilisé par qpkg, sa version graphique. Or, quelles que soient les versions de pdaXrom, le fichier de configuration d'ipkg est faux. Il faut donc commencer par le remettre en place...
</p>
<!--break-->
<p>Pour cela, en tant que root, utilisez <kbd>Office</kbd>/<kbd>Leafpad</kbd> ou plus simple <kbd>vi</kbd> et ouvrez le fichier <kbd>/etc/ipkg.conf</kbd> que vous remplacerez par le contenu suivant (décommentez ce qui correspond à votre version) :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  # à décommenter si vous êtes en béta 3<br />
# src main http://mail.pdaxrom.org/download/1.1.0beta3/Zaurus-Cxx00/feed/<br />
# src 7x0 http://mail.pdaxrom.org/contrib/1.1.0beta3/Zaurus-7x0-860/feed/<br />
<br />
# à décommenter si vous êtes en béta 3<br />
# src main &nbsp;http://mail.pdaxrom.org/download/1.1.0beta4/Zaurus-Cxx00/feed/<br />
# src karmaLab http://www.karma-lab.net/zaurus<br />
# src old http://mail.pdaxrom.org/download/1.1.0beta1/Zaurus-C1000-C3100/feed/<br />
<br />
# à décommenter si vous êtes en béta 121<br />
# src karmaLab http://www.karma-lab.net/zaurus/stable<br />
# src karmaLab-lab http://www.karma-lab.net/zaurus/not-tested<br />
# src main &nbsp;http://www.pdaxrom.org/download/1.1.0r121/Zaurus-Cxx00/feed<br />
# src other &nbsp;http://www.pdaxrom.org/download/1.1.0r121/Zaurus-7x0-860/feed<br />
# src old http://mail.pdaxrom.org/download/1.1.0beta1/Zaurus-C1000-C3100/feed<br />
# src beta4 http://mail.pdaxrom.org/download/1.1.0beta4/Zaurus-7x0-860/new/feed<br />
<br />
<br />
dest root /<br />
dest cf /mnt/cf<br />
dest sd /mnt/card<br />
dest net /mnt/net<br />
dest user /mnt/user<br />
dest ide /mnt/ide<br />
dest ide2 /mnt/ide2<br />
dest ide3 /mnt/ide3<br />
dest usbstorage /mnt/usbstorage<br />
dest tmpinst /home/tmp/ipkg/inst
  </div>
  
  </div>
  Sauvez puis fermez leafPad. Cette opération donne les bonnes sources de paquets à ipkg en ajoutant les deux sources de paquets de la béta 2. 
</p>
<p>
  Il faut maintenant mettre à jour la base de paquets soit en ligne de commande
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  ipkg update
  </div>
  
  </div> soit via <kbd>System Tools</kbd>/<kbd>Package Manager</kbd> et pressez le bouton <kbd>update</kbd> (le 2ième). Au bout d'un temps, les descriptions de paquet seront téléchargées.
</p>
    ]]></content>
  </entry>
  <entry>
    <title>Contrôler le Zaurus avec VNC</title>
    <link rel="alternate" type="text/html" href="http://artisan.karma-lab.net/node/63" />
    <id>http://artisan.karma-lab.net/node/63</id>
    <published>2006-11-18T20:56:26+01:00</published>
    <updated>2008-10-01T01:35:11+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>
  VNC permet la prise à distance d'une machine et, dans le cas du Zaurus, c'est très pratique pour effectuer du travail de fond sur la machine.
</p>    ]]></summary>
    <content type="html"><![CDATA[<p>
  VNC permet la prise à distance d'une machine et, dans le cas du Zaurus, c'est très pratique pour effectuer du travail de fond sur la machine.
</p><!--break-->


	<a name='chapter_11'></a>
  <h2>Installation</h2>
	
<p>Le paquet est disponible dans le feed stable. Pour l'installer (une fois ipkg configuré) il suffit de taper :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  ipkg <a target="blank" href="http://pwet.fr/man/linux/commandes/install"><span class="kw2">install</span></a> x11vnc
  </div>
  
  </div>

<p>
<image id="1"/>   Ensuite, il suffit de taper dans une console du Zaurus :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  x11vnc -nopw -forever
  </div>
  
  </div> 
</p>
<p>
  L'argument <kbd>nopw</kbd> demande juste au serveur d'arrêter de nous casser les pieds avec les mots de passe (pas très utile pour contrôler le Zaurus). <kbd>-forever</kbd> permet quant à lui d'empécher le serveur de terminer son travail dès que le client s'est déconnecté. 
</p>
<p>
  Pour se connecter au Zaurus, il vous faut un client VNC. Par exemple <kbd>tight VNC</kbd> (pour les linuxiens le paquet est disponible dans toutes les distros) ou <kbd>krdc</kbd> sous KDE. Si l'on utilise tightVnc, les meilleurs performances sont obtenues par la commande :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  vncviewer -encodings <span class="st0">'copyrect tight zrle hextile'</span> zaurus
  </div>
  
  </div> 
</p>
<p>
  Où <kbd>zaurus</kbd> correspond à l'adresse IP du .. zaurus <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_12'></a>
  <h2>Intégration dans xinetd</h2>
	
<p>
  Le paquet contient un fichier de configuration pour <a class='external' target='_blank' href='//node/88' >xinetd</a>. Pour l'activer, modifier donc <kbd>/etc/xinetd.d/xinetd-vnc</kbd> pour changer la valeur <kbd>disabled=yes</kbd> par <kbd>no</kbd>. Il suffit ensuite de relancer xinetd (<kbd>/etc/rc.d/init.d/xinetd restart</kbd>) pour que l'utilitaire prenne le contrôle du port 5900 et lance automatiquement x11vnc à chaque demande de connection client.  
</p>
    ]]></content>
  </entry>
  <entry>
    <title>Changer le click droit et central sous pdaXrom</title>
    <link rel="alternate" type="text/html" href="http://artisan.karma-lab.net/node/1100" />
    <id>http://artisan.karma-lab.net/node/1100</id>
    <published>2006-11-09T11:18:02+01:00</published>
    <updated>2008-02-05T08:15:47+01:00</updated>
    <author>
      <name>Ulhume</name>
    </author>
    <category term="Zaurus" />
    <category term="Aucun" />
    <category term="OK" />
    <category term="Tutoriel" />
    <summary type="html"><![CDATA[<p>
  Une petite surprise qui m'a fait perdre pas mal de temps est que le menu contextuel (click droit) de la béta 121 qui était jusqu'à maintenant accessible par la touche Fn + tap_ecran a été déplacé sur la touche "shift". Croyant à un bug, j'ai chercher à savoir quel fichier régissait ce comportement. 
</p>    ]]></summary>
    <content type="html"><![CDATA[<p>
  Une petite surprise qui m'a fait perdre pas mal de temps est que le menu contextuel (click droit) de la béta 121 qui était jusqu'à maintenant accessible par la touche Fn + tap_ecran a été déplacé sur la touche "shift". Croyant à un bug, j'ai chercher à savoir quel fichier régissait ce comportement. 
</p>
<!-- break -->
<p>
Il s'agit en fait du fichier <kbd>/etc/sysconfig/x11mousebutts</kbd> qui ne contient que deux lignes bien explicites pour le bouton du millieu et le bouton droit. La deuxième colonne correspond au <a class='external' target='_blank' href='//node/1009' >scancode</a> de la touche concernée. Il suffit donc de modifier ces valeurs pour placer ces deux comportements sur n'importe quelle touche. Par exemple pour revenir au comportement d'origine (Fn pour droit, et Shift pour Milieu) :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  middle_button 50<br />
right_button 69
  </div>
  
  </div>
</p>
<p>
  Voilà, prochaine étape, si quelqu'un a une idée, transformer tous les double-clicks en clicks simples, autrement plus maniable avec un stylet...
</p>
    ]]></content>
  </entry>
  <entry>
    <title>Lorsque gnuMeric part en vrille...</title>
    <link rel="alternate" type="text/html" href="http://artisan.karma-lab.net/node/1096" />
    <id>http://artisan.karma-lab.net/node/1096</id>
    <published>2006-11-09T10:52:43+01:00</published>
    <updated>2007-09-19T09:16:16+02:00</updated>
    <author>
      <name>Ulhume</name>
    </author>
    <category term="Zaurus" />
    <category term="Aucun" />
    <category term="OK" />
    <category term="Article" />
    <summary type="html"><![CDATA[<p>
  Là il s'agit peut être là d'une malédiction (en béta 3) qui m'est propre mais lorsque j'installe gnumeric, l'ensemble des liens (symlinks) sur les librairies a été zappé... Du coup, voici le petit bout de code qui m'a permis de fixer cela (désolé, pas de version graphique <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/wink2.gif" title="Wink" alt="Wink" class="smiley-content"/>
</p>    ]]></summary>
    <content type="html"><![CDATA[<p>
  Là il s'agit peut être là d'une malédiction (en béta 3) qui m'est propre mais lorsque j'installe gnumeric, l'ensemble des liens (symlinks) sur les librairies a été zappé... Du coup, voici le petit bout de code qui m'a permis de fixer cela (désolé, pas de version graphique <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/wink2.gif" title="Wink" alt="Wink" class="smiley-content"/>
</p>
<!-- break-->
<p>
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <a target="blank" href="http://pwet.fr/man/linux/commandes/ln"><span class="kw2">ln</span></a> -s libgoffice<span class="nu0">-1</span>.so libgoffice<span class="nu0">-1</span>.so<span class="nu0">.1</span><br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/ln"><span class="kw2">ln</span></a> -s libgsf<span class="nu0">-1</span>.so libgsf<span class="nu0">-1</span>.so<span class="nu0">.113</span><br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/ln"><span class="kw2">ln</span></a> -s libgnomeui<span class="nu0">-2</span>.so libgnomeui<span class="nu0">-2</span>.so<span class="nu0">.0</span><br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/ln"><span class="kw2">ln</span></a> -s libbonobo<span class="nu0">-2</span>.so libbonobo<span class="nu0">-2</span>.so<span class="nu0">.0</span><br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/ln"><span class="kw2">ln</span></a> -s libbonoboui<span class="nu0">-2</span>.so libbonoboui<span class="nu0">-2</span>.so<span class="nu0">.0</span><br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/ln"><span class="kw2">ln</span></a> -s libgnome<span class="nu0">-2</span>.so libgnome<span class="nu0">-2</span>.so<span class="nu0">.0</span><br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/ln"><span class="kw2">ln</span></a> -s libgnomevfs<span class="nu0">-2</span>.so libgnomevfs<span class="nu0">-2</span>.so<span class="nu0">.0</span><br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/ln"><span class="kw2">ln</span></a> -s libgconf<span class="nu0">-2</span>.so libgconf<span class="nu0">-2</span>.so<span class="nu0">.0</span><br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/ln"><span class="kw2">ln</span></a> -s libgconf<span class="nu0">-2</span>.so libgconf<span class="nu0">-2</span>.so<span class="nu0">.4</span><br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/ln"><span class="kw2">ln</span></a> -s libbonobo-activation.so libbonobo-activation.so<span class="nu0">.4</span><br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/ln"><span class="kw2">ln</span></a> -s libORBit<span class="nu0">-2</span>.so libORBit<span class="nu0">-2</span>.so<span class="nu0">.0</span><br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/ln"><span class="kw2">ln</span></a> -s libgsf-gnome<span class="nu0">-1</span>.so libgsf-gnome<span class="nu0">-1</span>.so<span class="nu0">.113</span><br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/ln"><span class="kw2">ln</span></a> -s libbz2.so libbz2.so<span class="nu0">.1</span><span class="nu0">.0</span><br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/ln"><span class="kw2">ln</span></a> -s libgnome-keyring.so libgnome-keyring.so<span class="nu0">.0</span><br />
<a target="blank" href="http://pwet.fr/man/linux/commandes/ln"><span class="kw2">ln</span></a> -s libORBitCosNaming<span class="nu0">-2</span>.so libORBitCosNaming<span class="nu0">-2</span>.so<span class="nu0">.0</span>
  </div>
  
  </div>
</p>
    ]]></content>
  </entry>
  <entry>
    <title>Développer en Java sous pdaXrom</title>
    <link rel="alternate" type="text/html" href="http://artisan.karma-lab.net/node/61" />
    <id>http://artisan.karma-lab.net/node/61</id>
    <published>2006-10-21T19:21:00+02:00</published>
    <updated>2007-10-20T00:35:54+02:00</updated>
    <author>
      <name>Ulhume</name>
    </author>
    <category term="Zaurus" />
    <category term="Aucun" />
    <category term="javafr" />
    <category term="OK" />
    <category term="Tutoriel" />
    <summary type="html"><![CDATA[<p>
  Dans la mesure où Java est mon langage fétiche, il fallait que je vois ce que cela donne avec le Zaurus... L'objectif (il en faut toujours un) est déjà bien sur de voir si Java est compatible avec cette petite plate-forme et, dans un second temps, tenter de faire un petit lecteur de média en combinant une interface graphique et l'excellent mplayer.
</p>    ]]></summary>
    <content type="html"><![CDATA[<p>
  Dans la mesure où Java est mon langage fétiche, il fallait que je vois ce que cela donne avec le Zaurus... L'objectif (il en faut toujours un) est déjà bien sur de voir si Java est compatible avec cette petite plate-forme et, dans un second temps, tenter de faire un petit lecteur de média en combinant une interface graphique et l'excellent mplayer.
</p> <!-- break -->


	<a name='chapter_1'></a>
  <h2>Trois mots sur Java</h2>
	
<p>
  Il en va de java pour le monde embarqué comme des autres langages. Il est possible soit de compiler directement sur la plateforme (le Zaurus), soit d'effectuer ce travail sur une machine plus puissante (une machine de bureau) et de n'exécuter que le binaire sur le module embarqué. Pour info, il existe un compilateur de bytecode java que l'on trouve dans les contributions (jikes) mais j'avoue ne pas bien voir l'intérêt et de loin préférer tout compiler sur une machine plus puissante. Cette stratégie est d'autant plus crédible que l'aspect multi-plateforme de Java permet d'oublier facilement à quelle machine le binaire est destiné.
</p>

<p>
  Pour comprendre comment fonctionne Java il faut distinguer trois aspects : Le langage Java , La machine Virtuelle Java (ou JVM) et les librairies de fonctions Java (ou JDK). 
</p>
<p>Le langage Java est un langage Objet. Tout ou presque en Java est objet. Sa syntaxe est héritée du C (et pas de C++) et a été conçue pour un maximum de lisibilité. Tout ce que l'on imagine d'un langage moderne est présent dans Java : héritages, interfaçage, exceptions,prototypes, etc... Les seules choses qui ont été exclues sont celle qui, de l'avis des concepteur du langage, compromettent la stabilité de la structure (ex. héritages multiples). 
<p>La machine virtuelle Java exécute le bytecode issue de la compilation du langage. Pour comprendre à quel point cette machine est indépendante du langage il suffit de regarder du côté de dotNet. Si C# est le langage de prédilection sur cette plateforme, l'éditeur propose aussi un compilateur Java qui fournit un bytecode exécutable sur une machine virtuelle dotNet. Il existe aussi des traducteurs qui permettent de lancer le bytecode dotNet sur une machine virtuelle Java. On peut même imaginer écrire en assembleur JVM sans passer par Java. Ces deux choses sont donc bel et bien indépendantes. </p>
<p>Les librairies java, appelé le JDK. Ce sont l'ensemble (très volumineux) de classes utilitaires fournis au développeur pour accéllerer son oeuvre. Il y a de tout là dedans, de l'interface graphique (nous y reviendrons) aux structures de stockages (tables de hashage, vecteurs, etc.) en passant par la gestion de la vidéo, de la 3D, du réseau, etc...</p>
<p>Sun étant en quelque sorte le mainteneur de Java, les 3 composants que je viens de citer sont généralement marqués d'un numéro de version commun. Par exemple Java 1.5 fait référence à l'évolution 1.5 du langage (apportant les prototypes et les annotations), l'évolution 1.5 de la machine virtuelle et de son langage bytecode (beaucoup plus rapide) et l'évolution du JDK 1.5 avec de nouvelles fonctions et librairies.</p>
<p>Mais comme, et c'est ce qui va nous intéresser pour le Zaurus, ces composants sont indépendant, on peut fort bien imaginer utiliser les librairies d'un éditeur tiers, la JVM d'un autre en compilant notre code Java avec le compilateur de Sun. Tant que chacun respecte les numéros de version et les spécifications associées, tout doit bien se passer.</p>
<p>Donc si nous allons, sur notre PC, compiler nous sources avec les paquets de Sun, sur le Zaurus, il seront exécuté par la machine virtuelle libre JamVM et les librairies libres GNU/Classpath. Et tout ce petit monde, nous allons le voire, va marcher en cadence.</p>


	<a name='chapter_2'></a>
  <h2>Discussion sur les performances</h2>
	
<p>
  Java joui d'une mauvaise réputation en terme de performances, ce qui est sommes toute ridicule. Java se classe dans la catégorie des langages semi-interprétés (bytecode exécuté dans une JVM). Ce n'est donc pas lent comme du Basic qui est interprété à partir du source lui-même mais évidement plus lent (en encore <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/wink2.gif" title="Wink" alt="Wink" class="smiley-content"/> que du C compilé directement assimilable par le micro processeur.</p>
<p>Dans la catégorie des langages semi-interprétés nous avons d'autres concurrents comme Python (en mode pyc) et dotNet. Et étant de la même catégorie, n'en déplaise aux esprits chagrins, les performances sont en moyenne les mêmes. Par exemple une application lancée avec un jdk 1.5 est exactement la même qu'une dotnet 2.0 équivalente (c'en est troublant d'ailleurs). En revanche, une fois lançée, une application Java est, d'experience, beaucoup plus rapide qu'une application Python mais consomme un peu plus de mémoire. Enfin une application Java sera en moyenne toujours, 2.5 fois plus lente qu'une appli en C compilée avec GCC (optimisation O2) mais aura exactement les mêmes performances qu'une application en C sans optimization. 
</p>
<p>
  En terme d'occupation mémoire aussi les choses sont comparables. J'ai comparé avec pmem une application python et son équivalent Java et l'occupation se bat à 1Mo près (en faveur de Python). 
</p>
<p>
  Bref, utiliser un semi-interprété présente l'avantage d'un langage souvent plus évolué (dit langages managés), de plus de facilités de développement, mais aussi a un coût en performances quel que soit le langage choisi. Une fois ceci dit, j'avoue largement préférer un langage Java que je trouve plus mature qu'un dotnet (je n'ai pas testé dotNet après la 1.1) ou Python. Mais ce n'est qu'une histoire de goûts. 
</p>


	<a name='chapter_3'></a>
  <h2>Préparation du PC</h2>
	
<p>
  La première chose à installer est donc le J2EE (pour Java 2 Entreprise Edition) 1.5 release 6 à partir du site <a class='external' target='_blank' href='http://www.javasoft.com' >JavaSoft (Sun)</a> ainsi que l'excellent EDI, <a class='external' target='_blank' href='http://www.eclipse.org' >Eclipse 3.2</a>. 
</p>  
<p>
  Nous pourrions évidement écrire nos applications Java avec un simple NotePad mais ce n'est pas bien pratique et la plate-forme de développement <kbd>Eclipse</kbd> semble plus indiqué pour ce type d'opération. Pour ceux qui ne connaissent pas, Eclipse est un projet libre initié (et offert) par IBM, destiné à construire un environnement de développement ultra-complet. Et même si ce projet était originellement destiné à Java, il est aujourd'hui capable de prendre en charge à peu prés tous les langages : C, Python, php, dotnet, etc... Eclipse peut aussi être mis en oeuvre facilement sur de nombreuses plate-formes (y compris macOS).
</p>
<p>
  Une fois le J2EE et Eclipse installés, il suffit de lancer Eclipse et de créer le nouveau projet <kbd>ZaurusJava</kbd>. 
  <ol>
    <li><kbd>File</kbd>/<kbd>New</kbd>/<kbd>Project</kbd>/<kbd>JavaProject</kbd>, Appelezle <kbd>Zaurus</kbd> puis Finish</li>
  </ol>
  Avant d'aller plus loin, il convient de modifier les propriétés du projet pour qu'il utilise le JDK 1.4 et non pas le 1.5 qui nous sert à lancer Eclise :
  <ol>
    <li>Sélectionner le projet dans l'explorateur et clique-droit <kbd>Properties</kbd></li>
    <li>Aller en section <kbd>Java Build Path</kbd>, onglet <kbd>Source</kbd></li>
    <li>Cliquer sur <kbd>Add Folder</kbd> et tapez <kbd>Sources</kbd> puis valider</li>
    <li>Changer la valeur de <kbd>Default Output Folder</kbd> pour <kbd>zaurus/classes</kbd></li>
    <li>Aller dans l'onglet <kbd>Libraries</kbd>, SSélectionnezle <kbd>JDK 1.5</kbd> puis <kbd>Remove</kbd></li>
    <li>Cliquez sur <kbd>Add Library</kbd>, puis <kbd>Next</kbd>, puis <kbd>Alternate JRE</kbd>, <kbd>Installed JRE</kbd>, <kbd>Add</kbd>, et <kbd>Browse</kbd></li>
    <li>Sélectionner le chemin où se trouve le jdk 1.4 (sous linux en /usr/java/jdk1.4.2)</li>
    <li>Changer la valeur <kbd>jre Name</kbd> en jdk14 puis <kbd>OK</kbd> et encore <kbd>OK</kbd></li>
    <li>De retour sur <kbd>Alternate JRE</kbd>, sélectionnez le nouveau <kbd>jdk14</kbd> puis <kbd>Finish</kbd></li>
    <li>Aller dans la section <kbd>Java Compiler</kbd></li>
    <li>Cliquer sur <kbd>Enable Project Specific Settings</kbd></li>
    <lI>Modifier <kbd>Compiler Compliance Level</kbd> à la valeur <kbd>1.4</kbd></lI>
    <li>Valider par <kbd>OK</kbd></li>
  </ol>
  Voilà qui en fait, il suffit maintenant faire un click-droit dans l'explorateur Java sur la branche <kbd>sources</kbd> et sélectionner <kbd>new</kbd>/<kbd>Class</kbd>. Taper dans la zone <kbd>name</kbd> le nom <kbd>HelloWolkd</kbd> et cliquer sur <kbd>Finish</kbd>.  
</p>
<p>
  A ce stade, vous avez un squelette de la classe HelloWorld dans l'éditeur. On va le modifier pour afficher la bienvenue chère à nos vieux amis Kernighan et Ritchie. Pour corser la tache de la JVM et vérifier par le fait la compatibilité avec les dernières extension du langage Java, nous allons faire le HelloWord le plus idiot du monde, sous forme de prototype :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">class</span> HelloWorld<br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; <span class="kw1">public</span> <span class="kw1">static</span> <span class="kw1">class</span> SayWhatEver<span class="sy0">&lt;</span>E<span class="sy0">&gt;</span><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">private</span> E content<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">public</span> SayWhatEver<span class="br0">&#40;</span>E value<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; content<span class="sy0">=</span>value<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">void</span> sayIt<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <a target="blank" href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span>content<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; <span class="br0">&#125;</span><br />
&nbsp; <span class="kw1">public</span> <span class="kw1">static</span> <span class="kw4">void</span> main<span class="br0">&#40;</span><a target="blank" href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a><span class="br0">&#91;</span><span class="br0">&#93;</span> args<span class="br0">&#41;</span> <br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; SayWhatEver<span class="sy0">&lt;</span>String<span class="sy0">&gt;</span> t <span class="sy0">=</span> <span class="kw1">new</span> SayWhatEver<span class="sy0">&lt;</span>String<span class="sy0">&gt;</span><span class="br0">&#40;</span><span class="st0">&quot;Hello World!!&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; t.<span class="me1">sayIt</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span>
  </div>
  
  </div>
  Pour vérifier que tout fonctionne, dans l'explorateur Java, cliquer droit sur le fichier <kbd>HelloWorld.java</kbd> et sélectionnez <kbd>run as</kbd> puis <kbd>Java Application</kbd>. Le message de bienvenue doit s'afficher dans la console en dessous de l'éditeur. Fin de la première étape.  
</p>


	<a name='chapter_4'></a>
  <h2>Paramétrage du Zaurus</h2>
	
<p>
  Côté Zaurus, un contributeur, Cortez, que je félicite au passage, a compilé pour pdaXrom la librairie GNU/Java <a class='external' target='_blank' href='http://www.gnu.org/software/classpath/' >Classpath</a> et la machine virtuelle <a class='external' target='_blank' href='http://jamvm.sourceforge.net/' >JamVM</a>. Classpath est un projet GNU qui c'est fixé comme objectif de fournir une implémentation libre de l'ensemble des classes de base du JDK de Sun. Cela peut paraître idiot de tout refaire ainsi mais c'est loin d'être le cas pour des raisons de licences que je n'approfondirais pas ici.
</p>
<p>
  JamVM est quant à elle une extraordinaire petite machine virtuelle Java dont la taille d'exécutable frise le ridicule (110ko sur une plateforme Intel).</p>

<p>
  Ceci fait vous pouvez vérifier que la vm est installé en tapant
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  jamvm -h
  </div>
  
  </div>
</p>
  Tout vas bien donc, sinon, il faut me prévenir car j'aurais surement fait une erreur dans la création du paquet <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>
  Il faut maintenant remonter le binaire HelloWorld compilé par Eclipse sur le Zaurus pour tester tout cela. Comme nous l'avons paramétré, tous les binaires compilés par Eclipse sont sur votre PC dans le dossier <kbd>zaurus/classes</kbd>. Il suffit donc de recopier ce dossier sur une SD et de la mettre dans le Zaurus. Une autre méthode plus rapide consiste à utiliser ssh en tapant :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <a target="blank" href="http://pwet.fr/man/linux/commandes/scp"><span class="kw2">scp</span></a> -r <span class="sy0">/</span>home<span class="sy0">/</span>mon_home<span class="sy0">/</span>workspace<span class="sy0">/</span>zaurus<span class="sy0">/</span>classes root<span class="sy0">@</span>zaurus:<span class="sy0">/</span>mnt<span class="sy0">/</span>card
  </div>
  
  </div>
  Cela me permet de recopier rapidement tous les fichiers compilés sur la SD insérée dans le le Zaurus. 
</p>
<p>
  D'une manière ou d'une autre, votre dossier <kbd>classes</kbd> est sur la SD en <kbd>/mnt/card/classes</kbd>. Normalement il y a un deux fichiers dans ce dossier, le java compile <kbd>HelloWorld.class</kbd> et celui de sa classe interne. Pour l'exécuter tapons "simplement" :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="sy0">/</span>usr<span class="sy0">/</span>java<span class="sy0">/</span>jamvm<span class="sy0">/</span>bin<span class="sy0">/</span>jamvm -cp <span class="sy0">/</span>mnt<span class="sy0">/</span>card<span class="sy0">/</span>classes HelloWorld
  </div>
  
  </div>
  <pre class='sample'>Hello World !!!</pre>
  C'est gagné <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/smile.gif" title="Smiling" alt="Smiling" class="smiley-content"/> Un premier pas de fait et la vérification au passage de la compatibilité avec la norme 1.5 du langage, en tout cas pour les prototypes ce qui est déjà plus que pas mal !</p>
<p>Maintenant ajoutons la couche graphique à cet édifice bien prometteur...</p>
</p>

	<a name='chapter_5'></a>
  <h2>Premier essai en SWING</h2>
	
<p>
  Il y a 3 toolkit graphique sous Java. AWT, l'ancêtre dont le crédo est "le plus petit dénominateur commun". AWT ne connaît donc que les composants qui existent sur toutes les platef-ormes (X11, Windows et Mac OS). N'y cherchez par exemple pas de composant "arborescence", il n'y en a pas. En revanche c'est très rapide car ce sont directement les composants natif qui sont affichés.</p>
<p>Fort de cette pauvreté est apparu JFC (Java Foundation Classes) qui jette les bases de composants graphiques entièrement écrits en Java. Cela va s'appeler plus tard SWING et être intégré aux J2EE 1.3. C'est très beau, très très riche et complet mais aussi très lent. Car chaque pixel de chaque bouton est écrit en Java, en bytecode donc, en interprété quoi... Au fil des versions Swing a prodigieusement gagné en vitesse. Aujourd'hui, sans sa version 1.6, Swing est très abouti et parfaitement utilisable pour une machine un tant soit peu puissante. Mais il reste à mon sens un peu trop lourd pour notre pauvre Zaurus. </p>
<p>Dernière arrivé, SWT se veut la synthèse, le meilleur des deux mondes. Son crédo c'est utiliser le natif à chaque fois que possible, sinon, au pire cas, émuler en java. L'IHM d'Eclipse est écrite en SWT. Les SWT reposent sur des wrappers qui encapsulent des toolkits natif comme Win32, GTK ou Quartz. C'est très léger et c'est surtout très rapide. 
<p>
  Commençons donc par SWING, pour déjà voir si notre VM sais ce que c'est qu'une fenêtre. Nous allons modifier notre HelloWorld sous Eclipse :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="kw1">import</span> <span class="co2">java.awt.Dimension</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">java.awt.event.ActionEvent</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">java.awt.event.ActionListener</span><span class="sy0">;</span><br />
<br />
<span class="kw1">import</span> <span class="co2">javax.swing.JButton</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">javax.swing.JFrame</span><span class="sy0">;</span><br />
<br />
<span class="kw1">public</span> <span class="kw1">class</span> HelloWorld<br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="kw1">public</span> <span class="kw1">static</span> <span class="kw4">void</span> main<span class="br0">&#40;</span><a target="blank" href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a><span class="br0">&#91;</span><span class="br0">&#93;</span> args<span class="br0">&#41;</span><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <a target="blank" href="http://www.google.com/search?hl=en&amp;q=allinurl%3AJFrame+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">JFrame</span></a> frame <span class="sy0">=</span> <span class="kw1">new</span> <a target="blank" href="http://www.google.com/search?hl=en&amp;q=allinurl%3AJFrame+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">JFrame</span></a><span class="br0">&#40;</span><span class="st0">&quot;Hello World&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <a target="blank" href="http://www.google.com/search?hl=en&amp;q=allinurl%3AJButton+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">JButton</span></a> button <span class="sy0">=</span> <span class="kw1">new</span> <a target="blank" href="http://www.google.com/search?hl=en&amp;q=allinurl%3AJButton+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">JButton</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; button.<span class="me1">setText</span><span class="br0">&#40;</span><span class="st0">&quot;Quitter&quot;</span><span 