Construire l'environnement de Cross-Compilation pour pdaXrom
Le 13 octobre 2006, à 0:0 par Ulhume...

Le cross-compiler fournit avec pdaXrom est un vrai bonheur. Il permet de récupérer des sources d'applications manquantes dans la distribution et de les compiler de sort à être exécutable directement sur le Zaurus. Le "petit" tutorial suivant permet de mettre cela en oeuvre.

Historique (tout afficher)
  • v4 - Suppression de liens morts (2008-10-01 00:36)
  • v3 - Passage à la vitesse au dessus avec un environnement permettant de compiler (presque) tout (mis à part le noyau en fait) (2007-11-05 08:14)

Qu'est-ce donc qu'une cross-compilation ?

Tout d'abord, prérequis de base, tout ce qui suit ne fonctionne que sous Linux. Quelques aventureux peuvent tenter l'équivalent sous cygwin mais je n'ai aucune idée sur la viabilité d'une telle chose. Pour ma part, j'utilise une Mandriva 2007.1 qui contient tout ce qui me sera nécessaire.

La cross-compilation permet dans sur une machine spécifique (hôte) de fabriquer des binaires pour une autre machine spécifique (cible). L'hôte est donc ici la Mandriva sur architecture i586 et la cible pdaXrom sur architecture ARM (le cpu du Zaurus). Pour pouvoir effectuer une telle opération, il faut donc disposer d'un compilateur (gcc) et l'ensemble des outils qui va avec (appelé tool-chain) qui s'exécute sur un i586 mais qui fabrique des binaire ARM. Une telle tool-chain est généreusement fournit avec pdaXrom . Il contient gcc, les utilitaires associés mais aussi toutes les librairies de base pour compiler une application moderne (gtk, qt, X, etc.).

Dans la majorité des cas, un système linux est installé avec sa propre tool-chain et ses propres librairies. C'est le cas de la Mandriva et l'on comprends sans peine qu'un des "danger" de la cross-compilation, est que le compilateur s'emmêle les pattes entres les librairies i586 de l'hôte et celles de pdaXrom (binaires ARM). La résolution de ce problème passe d'abord par une habile manipulation des variables d'environnements pour tromper le systèmes (PATH, LD_LIBRARY_PATH, etc...). Le plus gros de la magie est ensuite pris en charge par l'utilitaire de configuration fournit avec les sources qui va générer les scripts de construction qui vont bien (chaîne automake, autoconf). C'est grâce à cela qu'une application qui n'avait jamais été pensée pour cela peut finir sur l'écran de notre Zaurus préféré.

Installation du kit de cross-compilation de pdaXrom

La première chose à faire est d'installer cross-sdk-armv5tel-cacko-linux-3.4.6-2.2.5-softfloat.tar.bz2 (le lien est mort..) dédié à la cross-compilation. Ce paquet est à décompresser à la racine, donc en tant que root. Les commandes suivantes vont se charger de cette tâche et le cross-compiler pdaXrom sera installé en /opt/cross.

sudo su -
cd /
wget http://www.pdaxrom.org/download/1.1.0r121/Zaurus-7x0-860/cross-sdk-armv5tel-cacko-linux-3.4.6-2.2.5-softfloat.tar.bz2
tar -jxvf sources/cross-sdk-armv5tel-cacko-linux-3.4.6-2.2.5-softfloat.tar.bz2
chmod gou+rX /opt/cross -R
exit
Voilà, nous avons maintenant en /opt/cross un ensemble assez important de fichiers comprenant toutes les librairies ainsi que le fameux compilateur de binaire pour architecture ARM. Il ne reste plus qu'à passer à l'action Smiling

Création de l'environnement de compilation

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

# création de la racine
mkdir ~/pdaXrom
cd ~/pdaXrom

# dossier contenant les tarballs
mkdir sources

# dossier contenant les ipk
mkdir feed

# dossier contenant les sources en cours de compilation
mkdir build

# nos futurs scripts d'automatisation
mkdir script  

Création du script d'initialisation

Pour éviter de se perdre dans les commandes à taper, un petit script à lancer avant toute compilation va nous être bien utile. Il va initializer un certain nombre de variable d'environnement et nous placer dans un sous-shell nous permettant de nous concentrer sur le seul portage. Une fois votre session de compilation terminé, il suffira de tape exit pour revenir à votre environnement normale.

Le script est à stocker dans le fichier ./script/start.sh :

    # recherche de la racine de notre builder
    pushd $(dirname $0)/.. > /dev/null
    export BUILDER_HOME=$PWD
    popd > /dev/null

    # Définition des divers variables de compilation
    export CROSS_COMPILER_HOME=/opt/cross/arm/3.4.6-xscale-softvfp
    export PATH=$CROSS_COMPILER_HOME/bin:$PATH
    export QTDIR=$CROSS_COMPILER_HOME/armv5tel-cacko-linux/qt
    export KDEDIR=$CROSS_COMPILER_HOME/armv5tel-cacko-linux/qt
    export X11INC=$CROSS_COMPILER_HOME/armv5tel-cacko-linux/include
    export X11LIB=$CROSS_COMPILER_HOME/armv5tel-cacko-linux/lib
    export PKG_CONFIG_PATH=$CROSS_COMPILER_HOME/armv5tel-cacko-linux/lib/pkgconfig:/usr/lib/pkgconfig
    export CPPFLAGS="-O3"
    export CFLAGS="-O3"
    export LD_LIBRARY_PATH=$CROSS_COMPILER_HOME/lib:$CROSS_COMPILER_HOME/i686-host-linux-gnu/armv5tel-cacko-linux/lib
    export LDFLAGS="-Wl,-rpath-link,$CROSS_COMPILER_HOME/armv5tel-cacko-linux/X11R6/lib,-L/usr/lib"
    export DEFAULT_CONFIGURE_OPTIONS="-host=armv5tel-cacko-linux --build=i686-linux --x-includes=$CROSS_COMPILER_HOME/armv5tel-cacko-linux/X11R6/include --x-libraries=$CROSS_COMPILER_HOME/armv5tel-cacko-linux/X11R6/lib --oldincludedir=$CROSS_COMPILER_HOME/armv5tel-cacko-linux/include"
    export QMAKESPEC="$CROSS_COMPILER_HOME/armv5tel-cacko-linux/qt/mkspecs/default"
    export CC=$CROSS_COMPILER_HOME/bin/armv5tel-cacko-linux-gcc
    export ac_cv_func_getpgrp_void=yes
    export ac_cv_func_setpgrp_void=yes
    export ICONV="/usr/bin/iconv"

    # fin du script, lancement d'un shell imbriqué
    echo "Taper exit pour sortir de l'environnement de cross-compilation."
    export PS1='pdaXrom/ARM [\W] $ '
   /bin/bash --noprofile --norc

Une fois ce fichier créé, lui donner l'attribut "exécutable" et le lancer :

chmod +x script/start.sh
./script/start.sh

Une invite vous indique que vous êtres dans l'environnement de cross-compilation, vous êtes maintenant près à compiler votre première application pour Zaurus...

Récupération des sources à compiler

L'exemple que je vais prendre est la dernière version d'OpenBox que nous allons créer de toute pièce :

La première étape est donc de récupérer les deux paquets de source :

cd sources
wget http://icculus.org/openbox/releases/openbox-3.4.4.tar.gz
cd ../build
tar -zxvf ../sources/openbox-3.4.4.tar.gz

Compilation

Cette étapes est somme toute classique pour qui a déjà compilé une application sous linux. Elle consiste en la classique trinité config/make/make install.

cd openbox-3.4.4
./configure $DEFAULT_CONFIGURE_OPTIONS --prefix=$PWD/dist/usr

Un ensemble de test va alors s'afficher pendant un certain temps. L'utilitaire est en train de vérifier que toutes les librairies nécessaire à la compilation sont bien présente sur la machine. Il va ensuite fabriquer les scripts de compilation. Notez le $DEFAULT_CONFIGURE_OPTIONS qui est une variable initialisée par notre script de démarrage. Elle contient un tas d'option permettant à la compilation de se passer correctement et à vous d'en taper le moins possible Wink

Autre détail important, le paramètre --prefix. Nous allons grâce à lui forcer l'installation de la librairie à se faire dans le sous dossier ./dist/usr. C'est très important car sinon l'installation des librairies se feraients dans votre linux (en /usr...) et là, bonjour l'horreur Wink

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

Il est maintenant temps de compiler notre application:

Avec une machine rapide, cette opération ne prends qu'une grosse minute pour se terminer (espérons le Wink sans erreurs. Il ne reste alors plus qu'à générer une installation :

L'opération est rapide. Une fois que l'utilitaire vous rends la main, vous pouvez vérifier que la compilation s'est correctement déroulée en tapant :

  file  dist/usr/lib/libobrender.so.16.0.1
  > dist/usr/lib/libobrender.so.16.0.1: ELF 32-bit LSB shared object, ARM, version 1, not stripped
  ls -la dist/usr/lib/libobrender.so.16.0.1
  > -rwxr-xr-x 1 ulhume ulhume 94762 aoû 11 16:24 dist/usr/lib/libobrender.so.16.0.

Nos fichiers sont donc bien installés. Essayons d'optimiser un peu tout cela.

Optimisation de l'installation

Enlever les fichiers qui ne \"servent à rien\"

Avant toute chose, nous devons penser à optimiser l'espace occupé par nos paquets Zaurus. La place y est grandement comptée. Pour cela deux opérations. D'abord enlever ce qui n'est pas absolument utile, ici le manuel :

rm -rf dist/usr/share/man

Il y aurait encore du ménage à faire dans le même dossier, je vous laisse optimiser cela à votre goût mais faite attention de ne rien enlever de \"vitale\"

Optimisation des binaires

Ensuite nous pouvons optimiser la taille des binaires eux-même. C'est le rôle de la commande strip que nous pouvons efficacement combiner avec la commande find :

find dist -perm /u=x,g=x,o=x -exec armv5tel-cacko-linux-strip {} \;

Ne pas tenir compte des erreurs dans la mesure où strip râle lorsque je lui passes des fichiers non binaires Smiling

Nous pouvons vérifier le résultat en retappant les commande précédentes :

  file  dist/usr/lib/libobrender.so.16.0.1
  > dist/usr/lib/libobrender.so.16.0.1: ELF 32-bit LSB shared object, ARM, version 1, stripped
  ls -la dist/usr/lib/libobrender.so.16.0.1
  > -rwxr-xr-x 1 ulhume ulhume 80100 aoû 11 16:24 dist/usr/lib/libobrender.so.16.0.

Nous constatons alors que la commande files qui donnait le fichier comme non stripped, le donne maintenant comme stripped. Et que sa taille a perdu plus de 14ko, ce qui n'est pas mal du tout !!

Séparation des packages

Vous l'avez déjà remarqué, une même application est souvent déclinée en plusieurs paquets ayant chacun son rôle. Généralement nous avons le paquet de l'application elle-même, celui des documentations, celui de développement. L'objectif étant de n'installer que le stricte minimum. Nous allons donc faire de même et créer deux paquets, l'un pour l'application openBox, l'autre pour les fichiers qui permettent de compiler des applications utilisant openbox.

Nous alons partir du principe que ./dist contiendra les fichiers de l'application seule. Nous allons donc créer un dossier au même niveau nommé dist-devel dans lequel nous allons déplacer les fichiers liés au développement.

mkdir -p dist-devel/usr
mv dist/usr/include dist-devel/usr/

Voilà, nous avons maintenant deux dossiers dist. Nous pourrions aller beaucoup plus loin en créant par exemple un dossier dist par langue (/usr/share/locale/), un autre contenant les themes d'openBox, etc.

Création des packets IPK

Il ne reste plus qu'à fabriquer le fichier .ipk. Pour cela, créons dans le dossier dist, le dossier CONTROL dans lequel nous écrirons un fichier control contenant les informations suivantes :

Package: OpenBox
Installed-Size: 1.3M
Filename: ./openbox-3.4.4.ipk
Version: 3.4.4
Depends:
Priority: optional
Section: system
Maintainer: (remove _bad_ to send an email)
Architecture: armv5tel
Description: OpenBox le gestionnaire de fenêtres

Comme nous avons aussi un dist-devel, nous allons y répéter l'opération en mettant cette fois FileName: ./openbox-devel-3.4.4.ipk

Il ne reste plus qu'à lancer la commande mkipkg pour produire notre deux fichiers ipk dans le dossier ../../feed

mkipkg dist ../../feed
mkipkg dist-devel ../../feed

Et le tour est joué!! Vous pouvez vérifier dans le dossier feed, les deux paquets devraient y être. Il ne reste plus qu'à installer le nouvel ipk dans Zaurus.

Commentaires

pgas, le 31 March, 2006 - 06:54

Pour créer le .ipk il vaut mieux eviter de faire les tar.gz à la main.
Utiliser mkipkg permet d'eviter des problèmes de nom de paquets et de fichier CONTROL foireux...et il sont sensibles ces bêtes là

La version dans le sdk actuel a un petit problèmes avec le tar récent, cette version marche bien:
dead://mail.pdaxrom.org/contrib/misc/mkipkg

(voir dead://www.oesf.org/index.php?title=Pdaxrom:_Create_An_Ipk_Howto )

pgas, le 31 March, 2006 - 06:59

aargh, je vais poster mes commentaires en anglais...au moins j'aurai une excuse pour les fôtes.

Ulhume, le 31 March, 2006 - 09:45

Non, il suffit que tu de créer un compte,comme cela tu peux éditer tes commentaires Wink

Ulhume, le 31 March, 2006 - 10:12

Je connaissais pas, je vais regarder cela ce soir

Dab, le 4 April, 2006 - 22:11

J'avais souvent ce msg d'erreur pour l'installtion de divers packages :
Par exemple pour ethereal:
tar: ./control: Cannot change ownership to uid 501, gid 501: Operation not permitted
tar: .: Cannot change ownership to uid 501, gid 501: Operation not permitted
tar: Error exit delayed from previous errors
ipkg_install_file: ERROR unpacking control.tar.gz from ethereal_0.10.9-1_armv5tel.ipk

En fait le package à dû être crée avec un utilisateur ayant un uid et gid = 501 (comme c'est souvent le cas pour un utilisateur 'normal')
Après décompression, changement des droits en root, recompression plus de pb.
Installing ethereal...Done.
*** Command: add
*** Locating package
*** Found package on /mnt/card/root
*** Adding ethereal
*** Done.

Peut-être faudrait-il l'ajouter dans ta doc ?
Nota: je n'ai pas cherché à savoir quel était le pb sur le fond.

Dab

Ulhume, le 5 April, 2006 - 01:38

Tu utilises pdaXrom en mode "user" ?

Dab, le 5 April, 2006 - 14:20

Ben non en root mais l'uid 501 n'existe pas et mm si je le créer ça me pose toujours pb Arf
Sinon ça marche impec avec le chown -R root.root indiqué ci-dessus.

Ulhume, le 5 April, 2006 - 14:23

C'est bizzare que je n'ai jamais eu le cas Arf

Dab, le 5 April, 2006 - 16:36

Ca se produit uniquement lorsque j'installe un pkg dans une destination autre que '/'. Bah ça me va comme ça.

Dab, le 5 April, 2006 - 17:42

Et pour le noyau, il est aussi possible d'en compiler un autre ?
Et si oui ou peut-on trouver le .config de celui de pdaxrom ?

Ulhume, le 5 April, 2006 - 17:43

Et bien là c'est ma quête du moment, je n'ai pas encore réussi Smiling Promis, dés que j'y arrive j'écris quelque chose Wink

Dab, le 5 April, 2006 - 17:47

Je vais surement m'y mettre aussi. just for the fun Wink
http://www.pdaxrom.org/index.php?showid=47&menuid=1

pgas, le 5 April, 2006 - 20:49

pour ton probleme de compilation de kernel je te propose te decrire ce que tu fais et quel est le pb sur dans un thread sur oesf.org/forums, parcque sur ton site c'est un peu complexe pour moi de bien suivre ce qui se passe....

Ulhume, le 5 April, 2006 - 23:08

Bein c'est sympa mais je connais. Je crois que je connais ce site juste par coeur Wink Mais cela ne m'est pas d'une grande aide.

Ulhume, le 5 April, 2006 - 23:09

C'est sur que les commentaires ne sont pas le lieu idéal pour cela si c'est ce que tu veux dire. Tu n'aurais pas plutôt un mail pour que je te pose mes questions en direct Wink Je suis sur que tu as 90% des réponses qui me manque.

pgas, le 6 April, 2006 - 05:06

bein si...il doit être dans ta base pour drupal Wink
pierre point gaston at gmail.com

(remarque les forums c'est bien aussi car les questions reponses peuvent aider d'autres personnes qui ont les meme problemes)

Dab, le 16 April, 2006 - 16:32

Alors ? résultat des courses
Vous avez créé un nouveau forum ? Je suis aussi intéressé par le tunning de mon zaurus et notamment par la création d'une ROM perso. J'ai surement dû louper des étapes, ça se termine toujours avec un ( de mémoire) machin.m4 manquant.

sifourquier , le 5 August, 2006 - 02:51

nouvelle adresse pour dll le cross-compiler dead://mail.pdaxrom.org/download/1.1.0beta1/Zaurus-7x0-860/cross-sdk-armv5tel-cacko-linux-3.4.5-2.2.5-softfloat.tar.bz2

Guillaume , le 3 October, 2006 - 00:30

Encore une nouvelle version?
Je poste au cas ou Wink

dead://mail.pdaxrom.org/download/1.1.0r121/Zaurus-7x0-860/cross-sdk-armv5tel-cacko-linux-3.4.6-2.2.5-softfloat.tar.bz2

@+

Ulhume, le 3 October, 2006 - 09:01

Merci Smiling

Il faudrait que je merge les pages de cross-compiling histoire de les maintenir d'un bloc Smiling

oxdot , le 1 November, 2007 - 07:09

Salut,

Je me suis amuser a compiler gentoo pour mon akita, ... si, si ... le gestionaire, pas (encore Glad) la distrib (si tu connais pas c'est ici : http://www.obsession.se/gentoo/ ) et je constate, (une foi de plus), que tes articles sont vraiment bien foutu ! Je m'y mets pour la première foi et c'est passer comme une lettre à la poste ... merci.

Par contre j'ai chercher de la documentation pour la génération des ipk's (symboles pour le bureau, fichier conf. pour l'utilisateur ...) et je n'ai pas trouver grand chose sur le site de pdaxrom, bon c'est vrai que j'ai pas chercher des heures non plus ... (au fait la sdk n'est plus sur le lien que tu mentionne, mais je l'ai trouver ici : http://distro.ibiblio.org/pub/linux/distributions/pdaxrom/download/1.1.0... )

Si tu as un lien pour la doc je suis preneur ...

Salutations

oxdot , le 4 November, 2007 - 15:51

Glad ... désoler, mais je suis tomber sur tellement de liens cassés vers oesf ces derniers temps, que j'ai du ignorer le lien que mentionne pgas dans sont premier commentaire, qui fonctionne encore.

Ulhume, le 4 November, 2007 - 18:43

Ah bon ben ça va alors Smiling Sinon, je ne sais pas si cela a le moindre intérêt pour quelqu'un mais j'ai pour pdaXrom un script qui "mime" bitbake (un fichier définition et un script qui l'utilise pour aller de l'url à l'ipkg), garanti 100% plein de bug mais ce que j'utilise pour faire tous mes paquets.

Lindows , le 22 November, 2008 - 14:35

Je déterre un article un peu ancien, mais bon.
J'utilise ubuntu 8.10. Je me demandais si on pouvait avoir plusieurs environnements de cross-compilation sur un même PC (même partition) dédiés à différents produits (téléphone portable , PSP etc..) sans interférences ? A+

Ulhume, le 22 November, 2008 - 14:57

Bof, c'est pas un forum, on peut "déterrer" ce que l'on veut Smiling

Oui, il n'y a aucun conflit possible, la chaîne de compilation est dans un dossier bien séparé. Et on peut encore améliorer cela par un chroot, donc pas de soucis à ce niveau là.

Lindows , le 22 November, 2008 - 15:19

Cool.Cool

Poster un nouveau commentaire

Le contenu de ce champ est gardé secret et ne sera pas montré publiquement.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • To highlight piece of code, just surround them with <code type="language"> Your code &tl;/code>>. Language can be java,c++,bash,etc... Everything Geshi support.
  • Les lignes et les paragraphes vont à la ligne automatiquement.
  • Textual smileys will be replaced with graphical ones.
  • Les adresses de pages web et de messagerie électronique sont transformées en liens automatiquement.

Plus d'informations sur les options de formatage

Chapitres
Connexion utilisateur
Les derniers bavardages...