Perl dans le Nokia 770

Laurent GAUTROT

Red Hat

Nokia 770 ?

  • Tablette internet
    • Navigateur web basé sur Opera

    • Client de messagerie basé sur Sylpheed

    • Client de chat utilisant Google Chat + Jabber (et ses passerelles)

    • Client VoIP utilisant Google Talk + Jabber

    • Agrégateur de feeds RSS

    • Petits outils :

      • Écouter de la musique ;

      • Regarder des videos ;

      • Lire des documents PDF ;

      • Prendre des notes ;

      • Dessiner des croquis simples ;

    • Communication

      • Wifi 802.11{a,b,g}

      • Bluetooth

  • ARM92 à 200 MHz

    Avec autant de puissance, on peut faire tourner correctement un Doom

  • Debian + APT

    Le Nokia 770 est une boîte pas si noire que cela qui fonctionne à l'aide d'une mouture de Debian GNU/Linux

    Le système de gestion des paquets utilisé est APT, on peut donc configurer des dépôts en utilisant les sources /etc/apt/sources.list

    L'interface graphique n'utilise pas la vérification des signatures, alors que la ligne de commandes le permet

    Il n'est plus possible depuis la version 2006 de l'OS d'utiliser les paquets Debian génériques compilés pour l'ARM

    Avant juillet 2006, en utilisant la version 2005, on utilisait seulement dpkg et une gestion des dépendances manuelles

  • Osso-Xterm + Busybox

    La première application à installer est bien entenu un terminal

    Osso-Xterm est un Xterm intégré dans l'environnement du 770 (Hildon)

    Le shell utilisable par défaut est très limité mais on peut installer un bash

  • Python

    De nombreux programmes pour le Nokia 770 sont écrits en Python, les bibliothèques pour construire des interfaces graphiques ont été les premières à être portées et rendues disponibles

    D'autres langages de script peuvent être disponible, mais l'enthousiasme s'essouffle pour produire des paquets Debian de bonne facture

Vue de l'interface

Je veux Perl !

  • Pourquoi ?

    Parce que c'est plus agréable, et que j'y suis habitué

    Parce que par nature, le 770 est communicant et que Perl dispose dans le core de ce qu'il faut pour se connecter sur un réseau IP

  • Mais quel Perl ?

    Le choix d'une version stable ou de développement se pose quand on souhaite diffuser une distribution

    Bleadperl contient des améliorations notables (meilleures performances pour les expressions rationnelles, plein de nouveautés)

  • Mais comment ?

    Je n'ai accès qu'à du matériel x86

    Le 770 tourne sur une architecture ARM

  • Mais que garder ?

    La distribution de Perl fournit de nombreuses choses, entre la documentation, un moyen de lier dynamiquement des programmes externes qui utiliseraient la bibliothèque partagée Perl, des modules, des scripts, le CPAN, le support Unicode, etc.

    Tout cela occupe beaucoup de place, et en tout cas beaucoup plus qu'il n'y en a de disponible

OK, juste fais-le.

  • OK, juste fais-le.

    Tout est dit

Chaîne de compilation : installation

  •  sudo apt-get install \
         scratchbox-core scratchbox-devkit-debian \
         scratchbox-devkit-cputransp \
         scratchbox-toolchain-cs2005q3.2-glibc-arm

    L'installation de la chaîne de compilation à proprement parler

  •  sudo addgroup sbox
     sudo adduser -g sbox user
     sudo /scratchbox/sbin/sbox_adduser user

    Création d'un groupe et d'un utilisateur dans ce groupe qui pourront utiliser l'environnement de compilation

    Le choix de l'utilisateur « user » n'est pas anodin. C'est le nom de l'utilisateur dans le 770

    Il y a un compte également dans scratchbox, que l'on crée avec une commande spécifique

  •  sudo su - user
     /scratchbox/login

    La scratchbox est un environnement dans l'environnement. Pour y entrer, il faut se connecter à l'aide de cette commande

Chaîne de compilation : utilisation

  •  [sbox-: ~] sb-conf setup n770 \
         --compiler=cs2005q3.2-glibc-arm \
         --devkits=cputransp,debian \
         --cputransp=/scratchbox/devkits/\
     cputransp/bin/qemu-arm-0.8.0-m2

    À cette étape, on prépare un environnement qui utilisera deux kits de développement, et qui utilisera qemu pour l'exécution des binaires générés pour l'architecture cible

    Si l'on préfère les interfaces interactives, il y a une commande sb-menu qui permet cette configuration dans des boîtes de dialogue ncurses

  •  [sbox-: ~] sb-conf select n770

    Après avoir défini l'environnement, on peut commencer à l'utiliser. Il s'appelle de manière assez prévisible « n770 » dans cet exemple, mais aurait aussi bien pu s'appeler « maemo », etc.

  •  [sbox-n770: ~] wget \
          http://repository.maemo.org/stable/2.0/armel/\
     Maemo_Dev_Platform_v2.0_armel-rootstrap.tgz
     
     [sbox-n770: ~] sb-reinstall \
         Maemo_Dev_Platform_v2.0_armel-rootstrap.tgz
     
     [sbox-n770: ~] sb-conf se n770

    Toujours dans la scratchbox, on télécharge la plate-forme de développement Maemo, qui contient toutes les bibliothèques nécessaires pour la compilation des applications à utiliser dans le 770

    La dernière commande permet juste de recharger l'environnement parce qu'il a été sévèrement modifié

Récupération des sources de Perl

  • Perl expérimental, même pas peur
     rsync -avz \
      rsync://ftp.linux.activestate.com/perl-current/ \
      current

    La récupération des sources de bleadperl à partir du site d'activestate est décrite dans la perle 4

  • La configuration et la compilation
     cd current
     
     ./Configure
     
     make
     
     make test
     
     make install-strip

    On a tout ce qu'il y a de plus classique. Le choix de l'install-strip est judicieux dans notre cas, parce que la plate-forme cible a un espace de stockage limité et de toute façon n'a rien pour le débogage nativement

La purge

  • L'installation comprend :
    • des binaires
    • des scripts
    • des modules
    • de la documentation
  • Trop, c'est trop !
     [sbox-n770: ~ ] du -sh .
     . 49M

Aux grands maux, ...

  •  find . -name "*.pl" | xargs rm
     find . -name "*.h" | xargs rm
     find . -name "*.pod" | xargs rm

    La plupart de ces scripts .pl sont des exemples. Ils n'occupent pas une place énorme

    Les entêtes ne serviront à rien, puisque le 770 n'a pas de compilateur

    La documentation représente une partie très importante, près de 10 Mo

  •  rm -fr man

    Après suppression des pages, on a une coquille vide

  •  rm -fr lib/perl5/5.9.5/arm-linux/CORE
     rm -fr lib/perl5/5.9.5/arm-linux/auto/Encode
     rm -fr lib/perl5/5.9.5/unicore
     rm -fr lib/perl5/5.9.5/pod
     rm -fr lib/perl5/5.9.5/CPAN.pm
     rm -fr lib/perl5/5.9.5/CGI.pm

    Le support Unicode n'est pas à proprement parler indispensable à cet endroit

    CGI ne me sera pas vraiment utile (il y a un paquet avec un serveur HTTP pour le 770) et CPAN n'est pas utilisable

  • rm -f bin/{piconv,perldoc,perlbug,pod,cpan}5.9.5

    Compte tenu de ce qui a été supprimé, les binaires permettant la lecture de la documentation Pod ne sont plus vraiment indispensables

Résultat

  • Ha ouais, quand même !
     [sbox-n770: ~ ] du -sh .
     . 7.8M
  • Petit retour arrière
      scp Config_heavy.pl ...

    Ce script a été supprimé lors de la purge mais est utilisé par Memoize :(

Copie sur le 770 (TIMTOWTDI)

  • Envoi par SSH sur /usr/local

    /usr/local n'est pas utilisé en standard, on ne pollue que « peu » le 770

  • Utilisation de fuse

    Fuse est une manière d'implanter un système de fichiers en espace utilisateur

  • Utilisation d'une image jffs2

    Le problème est que le busybox du 770 ne contient pas la commande losetup.

    Il faudrait soit compiler un nouveau busybox en remplacement, soit compiler un nouveau losetup. Berk.

  • Partitionnement de la carte externe avec une partition jffs2

    Cette méthode permet d'utiliser l'espace de la carte mais avec les attributs qui nous intéressent : r-x pour tout le monde (c'est la tournée !)

Ce qu'il reste à faire

  • Préparer un paquet propre

    La diffusion de ceci n'est pas envisageable en l'état, parce que l'écriture dans la mémoire flash est en dehors de tout contrôle.

    La mise à jour de paquetage n'est pas gérée non plus. Il faut supprimer l'intégralité de /usr/local et redéployer une arborescence

  • Proposer des options

    Un paquet contenant l'interpréteur seul

    Un paquet avec les modules du Core

    Un paquet qui contient la doc (perldoc + *.pod)

    Un paquet avec le support unicode

    Un paquet avec CGI ? Un pour CPAN ?

KISS

  • On s'est déjà posé ces questions

    De nombreux distributeurs de Perl (distributions GNU/Linux) existent

  • Le 770 tourne sous une mouture de Debian

    dpkg est disponible, et APT depuis la version 2006 de l'OS

  • Les sources du paquet Perl de Debian sont accessibles

    Il suffit d'aller sur packages.debian.org

On prend les mêmes (ou presque) ...

  •  /scratchbox/login
  •  wget \
      http://ftp.debian.org/debian/pool/main/p/perl/perl_5.8.8.orig.tar.gz
     
     tar xvzf perl_5.8.8.orig.tar.gz
     
     wget \
      http://ftp.debian.org/debian/pool/main/p/perl/perl_5.8.8-6.1.diff.gz
     
     zcat perl_5.8.8-6.1.diff.gz | patch -p0
  •  cd perl-5.8.8
     debian/rules

Conclusion

  • Peu importe le flacon ...

    pourvu que l'on ait l'ivresse. Le but étant d'utiliser Perl sur cette architecture, la méthode pour le rendre disponible importe peu. Les binaires sont accessibles

  • configure / make / make test / make install_strip fonctionne incroyablement bien

    Pourtant, tout a été réalisé par la chaîne de compilation qui émule un système Linux sur une architecture ARM et qui permet de tester à la volée les binaires produits par qemu-arm

  • Une moindre satisfaction concernant la génération des paquets Debian

    Soyons honnête, ça ne marche pas du premier coup pour générer les paquets Debian. Les tests ne passent pas intégralement, et cela empêche la suite des opérations, dont la gérération des paquets

  • Maintenant, je peux m'exprimer

    Application avec la pyramide de chiffres (Memoize est dans le core). La seule précaution indispensable est de spécifier dasn ses scripts le chemin de l'interpréteur. Le perl dans le 770 est un 5.8.3 sans aucun module. Si l'on exécute quelque chose comme :

     #!/usr/bin/perl
     use strict;
     use warnings;
     use Memoize;
     memoize('fib');
     my $arg = shift || 25;
     sub fib {
        my $n = shift;
        return $n if $n < 2;
        fib( $n - 1 ) + fib( $n - 2 );
     }
     print &fib($arg), "\n";

    Alors on aurait un résultat comme.

     [user@Nokia770-26 bin]$ fib3
     Can't locate Memoize.pm in @INC (@INC contains: /etc/perl
     /usr/local/lib/perl/5.8.3 /usr/local/share/perl/5.8.3 /usr/lib/perl5
     /usr/share/perl5 /usr/lib/perl/5.8 /usr/share/perl/5.8 /usr/local/lib/site_perl
     .) at /home/user/bin/fib3 line 5.
     BEGIN failed--compilation aborted at /home/user/bin/fib3 line 5.

    Et c'est vrai. Mais si l'on spécifie avec la ligne shebang un /usr/localbin/perl alors on aurait le résutat attendu

     [user@Nokia770-26 bin]$ fib2
     75025

    Autre application avec un testeur de ports TCP (IO::Socket est aussi dans le core)

    Un moteur d'expressions rationnelles optimisé

La preuve

Merci

  • À notre président

    Pour le coup de pied au derrière concernant cette présentation

    Pour spod5 http://search.cpan.org/dist/spod5/

    Pour la musique

    Pour la bière

  • À Nokia

    Excellent appareil, qui s'améliore continuellement dans les fonctionnalités et l'ergonomie

    Utiliser Debian GNU/Linux, et d'autres logiciels libres et rendre toute la plate-forme de développement disponible

  • À tout ceux qui en ont marre que je fasse de la retape pour cette machine

    Vous m'aidez à devenir meilleur ;)

Références