Construction d'un environnement de cross-compilation
Un article de GuruMed.
Sommaire |
Créer son environnement de cross-compilation
Par Taz
Cet article explique en pratique comment construire un cross-compilateur Linux vers AmigaOS. Késako ? :) Lorsqu'on utilise un compilateur, le but est de transformer des fichiers sources (ici, écrits en C ou C++) en exécutables. En général, la compilation est faite sous le système d'exploitation (SE) de l'exécutable. Mais en fait, ce n'est pas une obligation : les fichiers sources sont de simples fichiers texte, l'exécutable est un simple fichier binaire. N'importe quel SE peut réaliser cette opération, mais ne pourra pas forcément exécuter le programme ainsi créé. On appelle ça la cross-compilation.
Quel est l'intérêt me direz-vous, puisqu'il faut :
- transférer les sources sous le SE de compilation
- cross-compiler
- transférer l'exécutable vers le SE d'exécution
soit un nombre non négligeable d'opérations, comparé au simple fait d'appuyer sur un bouton ou une touche dans StormC ? D'abord, ces opérations peuvent être nettement simplifiées ( cf. Proposition d'environnement ). Ensuite, l'intérêt est évident quand on a un PC plus ou moins récent ( > P100 ). Voyez les benchmarks pour en être convaincu.
Dans la suite, la machine autre que l'Amiga s'appellera 'PC', bien que cela puisse être une station IBM, Sun, Alpha, ou même un PC sous Windows.
Construction d'un compilateur amigaos-gcc sous Linux
Le miracle de la cross-compilation que l'on veut réaliser ici est possible grâce aux efforts de la Free Software Foundation ( www.fsf.org ), dont un des projets est le compilateur gcc, qui a le gros avantage d'être OpenSource, et d'être créé avec l'idée de portabilité. On utilise deux choses dans la suite :
- un compilateur fonctionnel sous Linux. C'est un compilateur natif Linux vers Linux. Il est normalement installé avec chacune des distributions.
- les sources de GCC (version AmigaOS), et d'autres petites choses que GeekGadgets nous a préparé et mis à disposition sur son site : http://www.geekgadgets.com
Tout ceci va nous permettre de créer notre cross compilateur. Pour compiler le compilateur, il va nous falloir de l'espace disque et de la patience. 210 Mo et quelques dizaines de minutes devrait suffire ( en fonction de la machine... ).
Il nous faut tout d'abord choisir où nous allons travailler, et où le cross-compilateur sera accessible. Ici, nous avons choisi le chemin /tmp/geekgadgets. Vous pouvez choisir un autre chemin. Attention, car il ne sera plus possible de déplacer les exécutables par la suite : les chemins seront codés en dur.
- Créer le répertoire : mkdir /tmp/geekgadgets
- Aller dans ce répertoire : cd /tmp/geekgadgets
- Créer les répertoires :
mkdir gg mkdir gg-build mkdir gg-src mkdir gg-archives mkdir gg/m68k-amigaos
- Dans gg-archives doivent se situer les fichiers suivants :
-rw-r--r-- 1 taz taz 5378634 May 15 17:51 binutils-2.9.1-src.tgz -rw-r--r-- 1 taz taz 11537008 May 15 18:05 egcs-1.1.2-src.tgz -rw-r--r-- 1 taz taz 63932 May 15 17:43 fd2inline-1.11-bin.tgz -rw-r--r-- 1 taz taz 1808450 May 15 17:43 ixemul-48.0-bin.tgz -rw-r--r-- 1 taz taz 751371 May 15 17:44 ixemul-48.0-env-bin.tgz -rw-r--r-- 1 taz taz 218010 May 15 17:43 ixemul-48.0-inc-bin.tgz -rw-r--r-- 1 taz taz 127977 May 15 17:44 libamiga-bin.tgz -rw-r--r-- 1 taz taz 274112 May 15 17:44 libnix-1.2-bin.tgz
Ils sont accessibles sur le site de GeekGadgets.
- cd gg/m68k-amigaos - tar -xzf /tmp/geekgadgets/gg-archives/fd2inline-1.11-bin.tgz - tar -xzf /tmp/geekgadgets/gg-archives/libamiga-bin.tgz - tar -xzf /tmp/geekgadgets/gg-archives/libnix-1.2-bin.tgz - tar -xzf /tmp/geekgadgets/gg-archives/ixemul-48.0-env-bin.tgz - tar -xzf /tmp/geekgadgets/gg-archives/ixemul-48.0-inc-bin.tgz - cd /tmp/geekgadgets/gg-src - tar -xzf /tmp/geekgadgets/gg-archives/binutils-2.9.1-src.tgz - cd cd /tmp/geekgadgets/gg-build - mkdir binutils - cd binutils - /tmp/geekgadgets/gg-src/fsf/binutils/configure -v --prefix=/tmp/geekgadgets/gg --target=m68k-amigaos --cache-file=config.cache
- éditez le fichier : /tmp/geekgadgets/gg-build/binutils/etc/Makefile
A la ligne 49, supprimez "info" et "guide". La ligne devient : "all: " tout court. A la ligne 51, supprimez "install-info" et "install-guide". La ligne devient : "install:" tout court.
- make - make install - cd /tmp/geekgadgets/gg-src - tar -xzf /tmp/geekgadgets/gg-archives/egcs-1.1.2-src.tgz - cd /tmp/geekgadgets/gg-build - mkdir gcc - cd gcc - /tmp/geekgadgets/gg-src/egcs/configure -v --prefix=/tmp/geekgadgets/gg --target=m68k-amigaos - ln -s /tmp/geekgadgets/gg-build/binutils/binutils/ /tmp/geekgadgets/gg-build/gcc/binutils
- editez le fichier : /tmp/geekgadgets/gg-build/gcc/gcc/Makefile
- A la ligne 43, ne laissez que c et c++. La ligne devient : "LANGUAGES = c c++"
- A la ligne 348, enlevez libgcc1-test. La ligne devient :"LIBGCC1_TEST ="
- A la ligne 3368, la ligne devient : "doc:"
- A la ligne 3531, supprimez "install-info". La ligne devient : "$(INSTALL_CPP) install-man install-info lang.install-normal \"
- make - make install
Le compilateur est prêt !
Editez un fichier de test ( /tmp/helloworld.c ), puis compilez-le : /tmp/geekgadgets/gg/bin/m68k-amigaos-gcc /tmp/helloworld.c -o /tmp/helloworld Transférez ce fichier sur l'Amiga, par FTP, disquette ou autre, et exécutez le. Si tout va bien, vous avez créé votre premier projet Amiga cross-compilé !
Nous pouvons maintenant compiler un projet un peu plus complexe. Récuperez brik-2.0-src.tgz, toujours dans /tmp/geekgadgets/gg-archives
- Vérifiez que vous utilisez un shell bash. Dans le doute, tapez 'sh'
- cd /tmp/geekgadgets/gg-src - tar -xzf /tmp/geekgadgets/gg-archives/brik-2.0-src.tgz - cd /tmp/geekgadgets/gg-build - mkdir brik - cd brik - CC=/tmp/geekgadgets/gg/bin/m68k-amigaos-gcc /tmp/geekgadgets/gg-src/contrib/brik/configure -v - make
Voir la rubrique 'Performance' pour quelques temps de compilation. Je vous laisse méditer sur ces chiffres :)
Le compilateur est capable de prendre en charge les programmes écrits en C ANSI, ainsi qu'en C++, mais pour le moment il ne prend pas en compte les spécificitées d'AmigaOS. Pour cela, il faut intégrer les fichiers d'entête d'AmigaOS, qui sont disponible sur le CD de GeekGadgets ou encore sur le CD développeur AmigaOS. Créons un répertoire pour ces fichiers, et copions-les à partir du CD ( ou toute autre source ) :
- mkdir /tmp/geekgadgets/gg/sys-include - cp -a /mnt/cdrom/amigaos/ready-to-run/os-include/* /tmp/geekgadgets/gg/sys-include
Eventuellement, copier aussi les fichiers nécessaires à la compilation de programmes MUI. L'archive développeur de MUI se trouve dans le répertoire dev/mui d'Aminet. Par exemple : ftp://de.aminet.net/pub/aminet/dev/mui/mui38dev.lha
Pour tester le tout, vous pouvez télécharger Sashi89, sur Aminet, qui contient les sources. Sashi89 est un outil de communication TI/Amiga, écrit par votre serviteur. Il a été au début developpé sous AmigaOS, avec GCC. Les sources sont composées d'environ une dizaine de fichiers, et le programme utilise MUI comme interface graphique. Il faut soit les décompresser sous Linux avec l'outil 'lha' qui s'utilise comme sous AmigaOS, soit les décompresser sous AmigaOS puis les transférer. Il faudra changer le Makefile.linux, en remplançant les lignes CC, INCS et LINK par ce qui convient aux chemins que vous avez choisi. Si vous avez utilisé le chemin /tmp/geekgadgets, alors il suffit de remplacer les /tmp/fnf par /tmp/geekgadgets. Allez dans le répertoire 'sources' de Sashi89, et tapez simplement : make -f Makefile.linux
Si tout va bien, le programme se compile...
Performances
Voici les performances à titre purement indicatif de GCC sur différentes machines, sur deux programmes différents. brik n'utilise pas les spécificités d'AmigaOS, tandis que Sashi89 utilise les librairies AmigaOS et MUI.
- brik
- Sur un A4000 040@40Mhz, cette compilation prend 20sec
- Sur un P166 : 3s
- Sur un PIII à 800Mhz : 0.5s
- Sashi89
- Sur Amiga, 060@50Mhz : 50s
- Sur un P100 : 15s
- Sur un PIII à 800Mhz : 1,5s !
Créer un environnement
C'est bien gentil tout ça, mais ça ne reste pas très pratique ! Cette section a pour but de vous permettre d'utiliser le cross-compilateur dans des conditions décentes. Il faut pouvoir tester le comportement de ses programmes régulièrement lorsqu'on développe, et l'environnement de compilation n'est pas capable pour le moment de réaliser cela. Tout va dépendre de ce dont vous disposez ...
Les solutions
en réseau TCP/IP
La solution la plus convenable est d'utiliser un partage de fichier ( les solutions telles le FTP ne se révèleront pas très pratiques ). Il s'agit de partager les fichiers entre l'Amiga et le PC. Le répertoire partagé permet soit à l'Amiga de trouver l'exécutable, soit à Linux de trouver les sources.
- sources sur l'Amiga : Lors de la compilation, les sources seront transférées par le réseau vers le PC. Pour de petits projets, quelques kilo-octets seront transférés.
- sources sur le PC : Il faut simplement transférer l'exécutable après la compilation vers l'Amiga, soit plusieurs dizaines de kilo-octets même pour de petits projets. Vous avez aussi la possibilité de choisir sur quel environnement vous éditerez vos fichiers ... Là aussi, il faudra éventuellement prévoir du transfert.
Cette solution ne s'applique donc en fait qu'aux personnes disposant d'un réseau suffisamment rapide : l'Ethernet va s'imposer. Par port série, il ne faut pas compter obtenir quelque chose de confortable, même si cela reste possible.
sans réseau
En excluant d'emblée certaines solutions ( disquette, recopie de l'hexa à la main,... ), il reste une éventuelle solution : installer l'émulateur UAE sur votre PC. Il faut ensuite générer l'exécutable dans un répertoire accessible à l'émulateur. L'avantage est que tout se fait sur un unique SE. Il faudra utiliser un éditeur sous Linux aussi. L'inconvénient est que tout n'est pas possible par rapport à un vrai Amiga, notamment en ce qui concerne le hardware et la rapidité d'exécution.
Proposition d'environnement
Je vous propose ici une architecture qui a plusieurs avantages :
- simple à mettre en oeuvre
- simple à l'utilisation
- rapide
- vous n'utilisez qu'AmigaOS, et le PC n'est qu'une boîte à compiler transparente !
Elle nécessite un réseau TCP/IP fonctionnel, un client NFS sur Amiga ( la version démo d'AmiTCP en propose un ), et un serveur NFS sur le PC. La réalisation d'un réseau TCP/IP nécessiterait un article à part entière, et je ne peux donc pas développer cela ici.
Les fichiers se trouvent dans votre répertoire personnel sur la machine Unix, disons dans le répertoire /home/login/sources. Il n'y a donc pas de problème pour la compilation, mais il faut par contre trouver un moyen d'accéder à l'exécutable à partir de l'Amiga. Pour cela, nous allons configurer le partage avec NFS.
Sur le serveur
Il faut vérifier que rpc.portmap, rpc.nfsd, rpc.mountd sont actifs. Pour cela, tapez par exemple : "ps aux | grep rpc". Il doit y avoir au moins 3 lignes, leur correspondant. Si ce n'est pas le cas, consultez l'aide de votre distribution afin d'activer le serveur NFS. Ensuite, il faut éditer le fichier /etc/exports. Tapez "man export" pour plus d'informations. Votre fichier exports devrait ressembler à cela : / amiga(rw) Relancez le serveur NFS : "killall -HUP rpc.nfsd rpc.mountd"
Sur le client
Il vous faut un client NFS, par exemple celui d'AmiTCP. Votre fichier AmiTCP:db/ch_nfstab devrait ressembler à cela : monpc:/ PC: USER login
Attention : votre userid doit être le même sur l'Amiga et sur le PC ! Le login n'a pas vraiment d'importance, l'identification est faite sur le userid en NFS !
Vous avez maintenant accès au système de fichier du PC à partir de l'Amiga. Admettons que vous ayez monté la racine du PC sous le disque PC: de l'Amiga, comme dans notre exemple. Dans PC:home/login/sources, vous avez accès aux sources, et vous pouvez donc les éditer avec votre éditeur Amiga préféré.
Trouvons un moyen simple de compiler à partir de l'Amiga maintenant. Tapez dans un shell : alias make rsh monpc "cd /home/login/sources ; make -f Makefile.linux"
( monpc correspond au nom d'hôte du PC, ou son adresse IP ) ( rsh est disponible dans la version démo d'AmiTCP )
Attention : il faut donner les droits d'exécution à distance pour votre login cf. le man rhosts : http://www.nevis.columbia.edu/cgi-bin/man.sh?man=rhosts Ajoutez une ligne contenant '+' à votre fichiers /home/login/.rhosts
A partir de maintenant, tout appel de "make" dans ce shell fera en fait appel au PC pour compiler ! Si la compilation est correcte, il suffit alors d'exécuter le fichier ainsi généré.
Conclusion
J'utilise l'environnement proposé depuis quelques temps déjà, à l'aide d'un vieux Pentium à 100Mhz, et cela m'a fait gagner énormément de temps, surtout sur les projets utilisant MUI et donc les fichiers d'entête à rallonge ... Il faut remercier la FSF, de l'équipe de GCC, et GeekGadgets pour les possibilités qu'ils nous offrent. Si votre environnement fonctionne, je ne peux que vous encourager à écrire un mail à l'adresse gg-feedback@geekgadgets.org, ne serait-ce que pour leur dire que leur travail sert réellement.
Pour toute question, vous pouvez me contacter à l'adresse suivante : ocroquette@free.fr
Les embûches sont nombreuses, et il ne m'est pas possible de développer tous les problèmes possibles et leur solution ici lors des manipulations. Cependant, je serai heureux de pouvoir vous aider en cas de blocage !
Remarques
- J'utilise ici egcs, mais il est possible de compiler gcc 2.95
- Les fichiers d'aide ne sont pas créés ici, il est possible de les créer, mais il faut vérifier d'abord que vous avez les outils pour le faire.
- Ce document est basé sur la documentation que l'on peut trouver sur le site de GeekGadgets
