Utiliser le compilateur GCC (1/2)

Un article de GuruMed.

Sommaire

Installation du compilateur GCC

Par Corto

Cet article en deux parties est d'abord paru dans le célèbre aMiGa=PoWeR :) Il se voit enrichi de quelques corrections et ajouts ... et le voici :

GCC est le compilateur universel d'un langage qui l'est autant : le noble C. Présent sur un nombre incalculable de systèmes, GCC vient compléter une longue liste sur Amiga : DICE, SAS/C, StormC, VBCC (dont nous reparlerons sans doute), HiSoftC, Maxon, ... Il possède beaucoup d'avantages comme sa gratuité, sa rigueur à la compilation, sa plus grande compatibilité Unix au niveau des sources, ...

Nous allons donc voir comment s'effectue une installation propre et guidée de cet environnement de développement. Vous pourrez ensuite compiler vos programmes en ligne de commande dans une fenêtre Shell ou grâce aux scripts makefile (nous pourrons aussi revenir dessus).


La bonne archive

Bien, commencez par laisser tomber la version 2.7.0 disponible sur Aminet, puisqu'on en est à la 2.95.2. Mais la 2.95.1 fera très bien l'affaire parcequ'elle est stabilisée et éprouvée (des bugs d'optimisation auraient fait leur apparition dans la version 2.95.2). Elle se trouve en libre téléchargement sur le site FTP de GeekGadgets à : ftp.geekgadgets.org/pub/geekgadgets/amiga/m68k/alpha/misc/snapshot/990529/ Vous pouvez vous plonger dans la documentation officielle présente à : http://www.geekgadgets.org/docs/GG_7.html Certains packages (dont celui de GCC) ne sont présents que dans le répertoire alpha. C'est donc là qu'on y récupèrera tous les fichiers nécessaires, à savoir :

GG-misc-bin.tgz *
binutils-X.X-bin.tgz *
bison-X.X-bin.tgz
diffutils-X.X-bin.tgz
fd2inline-X.X-bin.tgz
fifolib-X.X-bin.tgz
fileutils-X.X-bin.tgz
findutils-X.X-bin.tgz
flex-X.X-bin.tgz
gcc-X.X-bin.tgz *
gcc-X.X.X.diffs.gz *
grep-X.X-bin.tgz
gzip-X.X-bin.tgz
ixemul-X.X-bin.tgz *
ixemul-X.X-env-bin.tgz *
ixemul-X.X-inc-bin.tgz *
libamiga-bin.tgz *
libg++-X.X-bin.tgz
libm-X.X-bin.tgz
libnix-X.X-bin.tgz *
make-X.X-bin.tgz *
patch-X.X-bin.tgz
pdksh-X.X-bin.tgz
sed-X.X-bin.tgz
sh-utils-X.X-bin.tgz
tar-X.X-bin.tgz
termcap-X.X-bin.tgz
textutils-X.X-bin.tgz

Les fichiers marqués d'un astérisque indiquent ceux qui m'ont suffit a avoir un environnement fonctionnel, mais peut-être insuffisant à l'usage. Vous pourrez cependant retrouver tous ces fichiers sur un CDROM sous le titre ADE, ce qui peut vous épargner un long téléchargement.


Faites place !

Avant de les désarchiver, nous devons préparer le terrain. Vous vous réserverez un espace suffisamment grand sur votre disque dur où vous créerez un répertoire "gg". Vous pourriez l'appeler "gcc" mais il contiendra de nombreux outils, au-dela de GCC, faisant partie de l'environnement GeekGadgets,sur lequel nous ne nous étendrons pas. Dans le répertoire "gg", créez-en un nouveau nommé "os-include" destiné à recevoir les fichiers d'entête de ressources système.

Pour exploiter ces archives au format TGZ (tar + gzip), le plus simple est de se munir de l'outil "untgz" que vous utilisez comme suit, pour chaque package :

untgz -d

Sinon, les outils nécessaires sont prévus, et vous devrez juste télécharger en plus le fichier "BOOT.lha". Utilisez la commande tar avec la syntaxe "tar xvzf " pour obtenir le contenu décompressé.


L'arborescence se présente ainsi :

info (dir)
m68k-amigaos (dir)
guide (dir)
os-include (dir)
Sys (dir)
man (dir)
ib (dir)
bin (dir)
include (dir)
etc (dir)
dvi (dir)
html (dir)
lib (dir)
ps (dir)

A ce niveau, l'installation est physiquement correcte, vous ne devriez avoir aucun problème. Il reste cependant à ce que GG prenne sa place dans le système, par le biais des célèbres commandes "assign" et "path" à ajouter à la fin de la user-startup sont :

; BEGIN GCC
Assign GG: Work:Prog/gg
;Assign LIBS: GG:Sys/Libs ADD
Path GG:bin ADD
Assign bin: GG:bin
; END GCC

A la place de "Work:Prog/" vous indiquerez bien sûr le chemin dans lequel se trouve votre répertoire "gg". J'ai enlevé l'assign des "libs" car j'avais copié la ixemul 48 dans LIBS:. L'assign LIBS: est également utilisé pour la library libnix qui est utilisée lorsque l'on compile avec l'option -noixemul (ces termes seront détaillés dans le prochain article traitant des particularités de GCC). Pour certains packages, issus du CD ADE2 par exemple, il peut être nécessaire d'ajouter les assigns "ADE:" et "GCC:" qui pointent sur le même répertoire que "GG:".

Les includes

Tout est installé du côté GG. Il reste à adapter pour pouvoir se lancer dans la programmation AmigaOS. Voici donc comment installer les indispensables includes du système :

Le CD Developer contient toutes les includes, jusqu'à la version 3.5. Vous allez copier dans "os-include" les fichiers présents dans le NDK (Native Development Kit)

ndk/ndk_3.5/include/include_h

Ces fichiers include spécifiques au système sont à copier dans le répertoire "gg:os-include". Vous pouvez ensuite effacer si vous le souhaitez les protos et pragmas (répertoires proto, pragma et pragmas) car GCC ne les utilise pas (ou plutôt, il utilise les siens contenus dans gg:include, tout comme les fichiers inline). Vous pouvez aussi retirer les fichiers icônes (.info) qui n'apportent rien et peuvent gêner la lisibilité.


Vérification

Après redémarrage, vous pouvez aussitôt vérifier que tout se passe pour le mieux.

  • dans une fenêtre Shell, tapez juste la commande "assign" seul qui va lister la totalité des assign du système : vous devez y retrouver celles concernant GCC.
  • contrôlez la version de la bibliothèque ixemul en tapant "version libs:ixemul.library". Le résultat doit faire appaître une version 48.0 ou supérieure (la version 48.2 est présente sur ftp.geekgadgets.org/pub/geekgadgets/amiga/m68k/alpha/ixemul/cross).
  • compilez un code avec appels au système : en effet, la compilation d'un simple Hello World pourrait ne pas mettre en évidence des failles dans l'installation.

Voici le source que je vous propose et que vous pourrez appeler "testdate.c". A partir de valeurs en dur pour signifier la date, on réseverve des chaînes pour recevoir le résultat en clair grâce à la fonction système DateToStr :

	
#include <stdio.h>
#include <dos/dos.h>
#include <clib/dos_protos.h>

int main(){
  // Déclarations
  int jours = 2412;  // 8 sept. 84
  int mins = 602;    // 10h02
  int ticks = 850;   // 17 secs
  char day[15];
  char date[10];
  char str[10];

  struct DateStamp ds;
  struct DateTime dt;

  // Remplissage de la structure DateStamp
  ds.ds_Days = (ULONG)jours;
  ds.ds_Minute = (ULONG)mins;
  ds.ds_Tick = (ULONG)ticks;

  // Traitement et affichage
  dt.dat_Stamp = ds;
  dt.dat_Format = FORMAT_USA;
  dt.dat_StrDay = day;
  dt.dat_StrDate = date;
  dt.dat_StrTime = str;

  if (DateToStr(&dt)){
    printf("%s\n%s\n%s\n",dt.dat_StrDay,dt.dat_StrDate,dt.dat_StrTime);
  }else{
    printf("Echec de conversion\n");
  }

  return(0);
}

Pour la compilation : "gcc -o testdate testdate.c". En cas de soucis, essayez l'option -v qui permet par exemple de voir où GCC cherche ses includes.

Il peut être conseillé de compiler en RAM: pour éviter d'invalider votre partition de travail FFS si un problème survient lors de la compilation. Une telle anomalie lors de la compilation peut provenir d'une taille de pile trop faible. Forcez-la à 200000 (en fait, cela dépend de la taille du projet) avec la commande "stack 200000". GCC est un portage du monde UNIX et requiert une pile élevée, telle que 200000 octets.


Dernières recommandations

N'oubliez pas que le C comporte de nombreux pièges et demande vigilance et rigueur. Avant la diffusion de vos programmes, pensez bien à toujours compiler avec l'option -Wall. Cela demande à GCC d'afficher tous les warnings quels qu'ils soient. Une compilation sans aucune ligne d'erreur/warning avec cette option doit garantir une programmation stricte (pas d'utilisation de pointeur sans initialisation, ...) et par conséquent sera moins sujette aux bugs (en théorie ;-) Un autre article sera consacré aux outils qui permettent d'aller plus loin pour traquer les accès mémoires, les appels illicites, ... et d'obtenir un code sain et propre.

Nous nous retrouvons en attendant avec la suite de cet article pour connaître un peu plus ce qui caractérise GCC.