La compilation en C pour PowerPC (MorphOS, WarpOS, PowerUp)

Un article de GuruMed.

Sommaire

Compilation avec VBCC et GCC pour MorphOS, WarpOS, PowerUP

Par StAn

Note : cet article a été écrit avant que le SDK officiel de MorphOS ne soit disponible avec tout le nécessaire pour programmer (notamment GCC et les includes).

Le problème

Programmer pour MorphOS semble compliqué au premier abord: il faut installer GeekGadgets PPC, GCC, appliquer des patchs aux includes de l'OS 3.1, les copier au bon endroit... (ça peut sembler simple dit comme ça, mais quand on n'a que les docs du SDK actuel de MorphOS et qu'on n'a pas l'habitude de GCC, je vous assure qu'on peut perdre beaucoup de temps). Heureusement, certaines de ces étapes ne sont pas indispensables.


Solution 1: utiliser VBCC

Tout d'abord, vous pouvez utiliser VBCC, qui est plus simple à installer que GCC (mais son générateur de code PPC n'est malheureusement pas encore parfait et des bugs peuvent parfois apparaitre; dans ce cas il peut être utile d'avoir un GCC en état de fonctionnement pour savoir d'où vient le bug: de votre programme, de VBCC ou de MorphOS). VBCC est très intéressant pour la cross-compilation AmigaOS 68k/WOS/PUP/MorphOS, car il suffit d'utiliser une option du type "+morphos_xxx" pour compiler un programme MorphOS, xxx pouvant être "m68k", "warpos", "powerup" ou "morphos", selon le système en cours d'utilisation (voir mon article sur l'installation de VBCC).

Solution 2: ne pas patcher les includes

Note: valable aussi pour WarpOS et powerUP (pUP non testé)

D'autre part, et c'est là le point principal de cet article, il n'est pas indispensable de patcher les includes de l'OS pour MorphOS. Premier point positif: ça permet de continuer à utiliser les includes v44 ou v45, et d'utiliser des caractéristiques de l'OS 3.5/3.9 dans ses programmes. Deuxième point positif: inutile de se prendre la tête à essayer de comprendre la doc du SDK de MorphOS ;). Troisième point positif: ça évite d'avoir plusieurs répertoires d'includes à différents endroits sur son système (pour GCC, il suffit de faire un lien de /GG/os-include vers son répertoire d'includes habituel).

Le patch des includes recommandé dans le SDK de MorphOS sert principalement à aligner les structures de l'AmigaOS sur 2 octets (le standard sur Amiga) au lieu des 4 octets habituels en code PPC. Il se trouve qu'il existe des pragma faisant la même chose et évitant cette modification:

Pour VBCC il s'agit de #pragma amiga-align et #pragma default-align. Pour GCC il s'agit de #pragma pack(2) et #pragma pack().

Ainsi, il suffit d'entourer dans votre source les lignes #include par ces pragmas pour obtenir le même résultat. Par exemple, pour GCC:


	
#include <stdio.h>
#pragma pack(2)
#include <proto/exec.h>
#include <proto/intuition.h>
#include <intuition/intuition.h>
#pragma pack()
#include "MyProgram.h"

Comme vous le voyez, seules les includes de l'OS (et autres bibliothèques partagées comme par exemple Warp3D) ont besoin d'être alignées; pas les includes du compilateur ou celles de votre propre programme. Je ne crois pas non plus que ce soit utile pour les protos, car ils ne contiennent normalement aucune structure, mais cela ne coute rien de les inclure.

Il existe une autre possibilité avec VBCC: donner l'option "-amiga-align" à vc sur la ligne de commande; mais ce n'est pas un très bon choix car toutes les données sont alors alignées sur 2 octets, ce qui réduit les performances du code PPC. Cela peut-être utile pour tester un programme rapidement sans modifier son source.

Afin de se simplifier la tache si on veut pouvoir compiler avec VBCC et GCC, je vous propose de créer les deux petits fichiers suivant dans votre répertoire d'includes:

amiga-align.h:

#if defined __VBCC__
#pragma amiga-align
#elif defined __GNUC__
#pragma pack(2)
#endif

et default-align.h:

#if defined __VBCC__
#pragma default-align
#elif defined __GNUC__
#pragma pack()
#endif

Maintenant, l'exemple précédent devient ceci:

	
#include <stdio.h>
#include <amiga-align.h>
#include <proto/exec.h>
#include <proto/intuition.h>
#include <intuition/intuition.h>
#include <default-align.h>
#include "MyProgram.h"

C'est tout simple, et votre programme peut maintenant se compiler aussi bien avec VBCC que GCC, et pour 68k, WarpOS ou MorphOS sans aucun changement ! (à condition que le reste du code soit à la hauteur, bien sûr ;-))


Solution 3: Se passer de muicp

Un dernier point: si vous voulez compiler un programme MUI pour MorphOS, vous pouvez vous passer de la transformation de votre source par muicp si vous utilisez une stub lib pour MUI et non pas les inlines. Ce truc m'a été aimablement prêté par Zapek mais je n'ai pas encore eu l'occasion de le tester, alors n'hésitez pas à vous plaindre si ça ne marche pas ;).

En règle générale, l'utilitaire fd2pragma de Dirk Stoecker (sur Aminet dans dev/misc) permet de générer tous les formats de stub libs et inlines dont vous pouvez avoir besoin.


Conclusion

J'espère que cet article peut vous aider à démarrer dans la programmation PPC. Il n'est certes pas exhaustif, mais le "truc" du amiga-align.h/default-align.h m'est très utile et j'ai pensé que c'était une bonne idée de le diffuser. Et je pense (j'espère !) que cet article contraste agréablement avec la complexité de la doc officielle de MorphOS ;-].

D'autres contraintes à prendre en compte lors de la programmation pour MorphOS (et PPC en général !) peuvent se trouver à cette adresse:

http://zapek.meanmachine.ch/morphos/morphos.html (chapitre 2)