Obligement - L'Amiga au maximum

Vendredi 23 mai 2025 - 18:13  

Translate

En De Nl Nl
Es Pt It Nl


Rubriques

Actualité (récente)
Actualité (archive)
Comparatifs
Dossiers
Entrevues
Matériel (tests)
Matériel (bidouilles)
Points de vue
En pratique
Programmation
Reportages
Quizz
Tests de jeux
Tests de logiciels
Tests de compilations
Trucs et astuces
Articles divers

Articles in English


Réseaux sociaux

Suivez-nous sur X




Liste des jeux Amiga

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z,
ALL


Trucs et astuces

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Glossaire

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Galeries

Menu des galeries

BD d'Amiga Spécial
Caricatures Dudai
Caricatures Jet d'ail
Diagrammes de Jay Miner
Images insolites
Fin de jeux (de A à E)
Fin de Jeux (de F à O)
Fin de jeux (de P à Z)
Galerie de Mike Dafunk
Logos d'Obligement
Pubs pour matériels
Systèmes d'exploitation
Trombinoscope Alchimie 7
Vidéos


Téléchargement

Documents
Jeux
Logiciels
Magazines
Divers


Liens

Associations
Jeux
Logiciels
Matériel
Magazines et médias
Pages personnelles
Réparateurs
Revendeurs
Scène démo
Sites de téléchargement
Divers


Partenaires

Annuaire Amiga

Amedia Computer

Relec


A Propos

A propos d'Obligement

A Propos


Contact

David Brunet

Courriel

 


En pratique : Utilisation du compilateur GCC sur AmigaOS 68k (deuxième partie)
(Article écrit par Mathias Parnaudeau et extrait de GuruMed.net - janvier 2003)


L'installation du compilateur GCC effectuée, il reste à voir quelles sont ses différences avec les autres et comment en tenir compte. Ceci vous évitera de perdre votre temps dans de nombreuses recherches.

Nous avions uniquement évoqué la dernière fois le besoin important en pile (stack) et l'organisation de l'environnement GeekGadgets de GCC (les répertoires des fichiers d'en-tête notamment).

Think different

Chaque compilateur présente ses particularités, par exemple SAS/C possède un fichier d'en-tête nommé "dos.h" (en plus d'un qui lui est propre). Mais les différences les plus importantes viennent de la manière dont sont construits et gérés les appels de fonctions (via les inlines ou les pragmas). Pour sa part, GCC utilise les inlines, tout comme vbcc et StormC 4, au contraire de SAS/C qui préfère les pragmas. Avec l'outil fd2pragma, vous pourrez d'ailleurs obtenir les deux types de fichiers à partir de fichiers FD et clib, souvent fournis dans les paquets destinés aux développeurs.

Il peut être nécessaire de prendre en compte les différences entre les compilateurs. Ou au moins faut-il comprendre un source écrit dans ce but. Ainsi les inclusions doivent faire appel aux directives de condition du précompilateur. Ces adaptations sont un bon point de départ pour rendre le code indépendant du compilateur :

// A utiliser pour vos programmes MUI
#ifdef __GNUC__
#include <inline/muimaster.h>
#else
#include <clib/muimaster_protos.h>
#endif

// Adapter des directives propres à SAS/C
#ifdef __SASC
#define ASM     __asm
#define SAVEDS  __saveds
#else
#define ASM
#define SAVEDS
#endif

Tout ceci peut vite devenir un casse-tête. Pour clarifier les choses, il semble bon d'envisager l'utilisation d'un environnement multicompilateur : cela permet d'apprendre beaucoup de notions nouvelles, de tester plus sévèrement son code car aucun outil ne laisse passer les mêmes alertes, de comprendre le comportement du compilateur ou encore de ne pas dupliquer les fichiers d'en-tête pour chaque nouveau compilateur.

Si vous avez installé StormC (pour son ensemble éditeur, débogueur, gestionnaire de projets) suite à l'achat du CD Amiga Developer puis GCC après le précédent article, cette préparation vous servira (et que diriez-vous de profiter du gratuit vbcc ?).

GCC semble être le seul à proposer plusieurs répertoires pour contenir les fichiers d'en-tête, qu'on sépare ainsi :
  • gg:m68k-amigaos/include (les versions GCC de proto/, inline/, etc.).
  • gg:os-include (fichiers d'en-tête du NDK, indépendante du compilateur : retirer les pragmas et protos).
  • gg:include (fichiers d'en-tête standards de GCC).
  • gg:local/os-include (non standard, pour un usage particulier, l'ajout de nouveaux paquets).
Ainsi, le répertoire des fichiers d'en-tête standards (provenant du NDK) d'un autre compilateur peut pointer sur "gg:os-include" : ils partageront ainsi la même ressource. Pour GCC, vous pouvez effacer tous les fichiers d'icônes et ceux des répertoires pragma, pragmas et proto de ce répertoire car GCC ne semble pas les utiliser, au profit de ses propres fichiers qu'il fournit. Par contre, si vous utilisez un autre compilateur en plus, il faudra déplacer ces répertoires à un endroit qui lui est propre.

Pour rebondir sur les inclusions de fichiers spécifiques décrites plus haut, et afin de les concilier, on emploiera de préférence les fichiers de type proto qui font appel aux fichiers inline ou pragma suivant le compilateur. Il peut être conseillé d'inclure uniquement le proto dans les programmes qui pourront aisément être recompilés avec d'autres compilateurs que le vôtre. Ça permet aussi d'alléger le code en le déplaçant dans les fichiers de proto.

Just do it

Après cette évocation d'une solution pluricompilateurs, revenons à celui qui nous concerne pour l'instant. GCC provient du monde Unix, aussi il faut parfois quelques accommodations pour AmigaOS. Comme il utilise par défaut des notions Unix, il joindra automatiquement la bibliothèque ixemul : il s'agit d'une bibliothèque d'émulation des bibliothèques standards d'Unix. Elle permet de recompiler (généralement simplement) des applications Unix pour qu'elles fonctionnent sous AmigaOS, car bien qu'il utilise les bibliothèques ANSI, il n'en est pas pour autant conforme POSIX. Sans ixemul, il faudrait réécrire une partie du programme.

Pour des développements AmigaOS, vous n'aurez certainement pas toujours besoin d'utiliser l'ixemul.library. Si tel est le cas, ajouter l'option "-noixemul" au moment du lien :

gcc -noixemul

En liant ainsi, vous bénéficiez de l'ouverture automatique des bibliothèques système. Si vous souhaitez garder ce petit confort en utilisant ixemul, ajoutez alors l'option "-lauto" au lien.

gcc -lauto

Important : utilisez toujours la ligne de compilation dans cet ordre, ça peut complètement influencer le résultat !

L'amiga.lib

Vous pourrez aussi avoir besoin de la joindre à votre projet. Elle contient des fonctions diverses facilitant la programmation système. Implémentée différemment selon le compilateur, l'amiga.lib doit en théorie contenir les mêmes fonctions (quitte à ne pas être implémentées de la même façon). Elle peut elle aussi avoir des spécificités : l'amiga.lib de vbcc contient les bouchons ("stubs") pour toutes les fonctions du système d'exploitation qui appellent automatiquement Run68k() avec les paramètres appropriés. Elle procède à un enrobage des appels système, une bibliothèque possédant une adresse de base, par rapport à laquelle se réfère les adresses relatives des fonctions.

A propos de l'édition de liens, sachez que les formats d'objets de GCC lui sont propres. Il est donc impossible de lier directement des objets (fichiers ".o") générés par SAS/C et par GCC. Remarque : il semble que vbcc s'accommode aisément de presque tous les types de formats.

Un dernier mot concernant la compilation : si vous utilisez, et je vous le conseille, les fichiers makefile, sachez que GCC demande absolument une tabulation à la ligne suivant la cible. Si vous utilisez un éditeur de texte qui remplace les tabulations par des espaces, ça ne fonctionnera pas (voir messages d'erreur). Souvenez-vous donc que le Workbench propose un Emacs rudimentaire mais suffisant pour ce travail. GCC est sensible à la casse dans les fichiers d'en-tête, pas comme certains compilateurs permissifs qui se vendent pourtant très bien. Il n'accepte pas les noms de variables ou de fonctions contenant des accents (oui, j'avais osé ! ;-)).

MUI sans douleur

Beaucoup ont eu autant de problèmes pour installer GCC que pour utiliser MUI avec lui ! Ça pourrait en devenir décourageant. Après quelques explications...

Avec MUI, des ennuis peuvent apparaître, tout d'abord parce qu'il définit des macros dans un format que ne reconnaît pas forcément GCC, suivant les fichiers inlines utilisés. Si on génère ces fichiers avec l'outil fd2pragma dans son mode 41 ("old style"), les problèmes sont résolus. Si la conversion a lieu en mode "new style", le message d'erreur "unterminated macro call" devrait apparaître à la compilation. Ceci est apparemment causé par les règles d'indentation des fichiers de développement de MUI. Dans ce cas, il faut ajouter un "End" à chaque appel qui crée un objet, ce qui n'a rien à voir avec les macros Child ou WindowContents. Des objets comme HGroup, VGroup, WindowObject, RectangleObject sont toutes terminées par un "End". Mettre une macro Child ou WindowContents devant et sur la même ligne semble être bon mais cela corrompt en fait le code. Le "End" correspond au Child alors qu'en fait il est destiné à l'objet à la droite de Child.

La compilation de programmes avec GCC ne devrait donc plus poser de problèmes. Il reste encore à profiter des outils de développement annexes qui permettent de gagner du temps dans la réorganisation du code, dans le débogage ou l'optimisation.

Si vous programmez en C uniquement, vbcc pourrait bien vous plaire, c'est le compilateur qui monte : il est gratuit, accepte de nombreux formats à l'édition de liens et génère du code pour toutes les variantes d'Amiga (68k, WarpOS, PowerUp, MorphOS).


[Retour en haut] / [Retour aux articles] [Article précédent]