<!doctype linuxdoc system>

 <article>

   <title>Conduite de projet en C sous Linux
   <author>Philippe Martin (<htmlurl url="mailto:feloy@wanadoo.fr"
   name="feloy@wanadoo.fr">)
   <date>v$Revision: 0.4 $ - $Date: 1998/04/29 19:33:14 $

   <abstract>
    Vous voulez (ou devez) vous lancer dans la conduite d'un projet sous Linux ?
    Vous ne savez pas trop par o&ugrave; commencer ? Alors lisez (et relisez) cette
    documentation. Elle vous apportera, je l'esp&egrave;re, une aide pr&eacute;cieuse pour
    d&eacute;marrer votre projet et des conseils et astuces tout au long de celui-ci.
   </abstract>

  <toc>

  <sect>Introduction

   <p>
    Cette documentation est surtout destin&eacute;e &agrave; un d&eacute;butant en mati&egrave;re de
    conduite de projet. Il devra par contre avoir quelques connaissances en
    programmation, afin de pouvoir appliquer les conseils fournis ici.

   <p>
    J'ai &eacute;crit ce document tout en le destinant particuli&egrave;rement &agrave; un &eacute;tudiant
    qui aurait &agrave; conduire son premier projet de programmation. Ayant &eacute;t&eacute; dans
    cette situation il y a peu, j'esp&egrave;re avoir tir&eacute; profit de cette exp&eacute;rience
    et r&eacute;ussi &agrave; vous la faire partager.

   <sect1>Copyright
    <p>
     Copyright Philippe Martin 1998&nl;
     Vous pouvez redistribuer et/ou modifier ce document selon les conditions de
     la GNU General Public Licence, version 2 ou ult&eacute;rieure.
     
  <sect>Le langage C

   <sect1>Les diff&eacute;rents types de fichiers

    <p>
     Il faut conna&icirc;tre l'existence de plusieurs types de fichiers lorsque l'on
     programme en C.

     <descrip>
      <tag/Source C (.c)/
       C'est en g&eacute;n&eacute;ral sous ce format que vous &eacute;crirez vos programmes.

      <tag/Source C pr&eacute;compil&eacute; (.i)/Les fichiers sources C incluent d'autres
      fichiers et/ou contiennent des macros. Un fichier C pr&eacute;compil&eacute; est l'image
      d'un fichier source apr&egrave;s avoir inclus les fichiers sp&eacute;cifi&eacute;s et/ou apr&egrave;s
      avoir &eacute;tendu les macros.

      <tag/Source assembleur (.S) pr&eacute;compil&eacute; (.s)/Ce format contient du code
      source dans le langage assembleur (dit de bas niveau), qui d&eacute;crit le
      programme en une suite (presque) lin&eacute;aire d'op&eacute;rations ex&eacute;cut&eacute;es par le
      processeur de l'ordinateur.

       Ce format est de moins en moins utilis&eacute;, il se peut n&eacute;ammoins que vous
       ayiez &agrave; &eacute;crire certaines sources dans ce format, ou bien d'arr&ecirc;ter le
       processus de compilation &agrave; ce stade afin de mieux comprendre comment
       l'ordinateur ex&eacute;cute r&eacute;ellement une partie de votre programme.

      <tag/Fichier (source) d'ent&ecirc;te (.h)/Fichiers inclus dans les sources C ou
      assembleur, contiennent en g&eacute;n&eacute;ral les d&eacute;finitions de fonctions,
      variables, macros, ... Certains fichiers ent&ecirc;te contiennent la d&eacute;finition
      et la description d'images au format XPM ou XBM (formats d'image propres
      au syst&egrave;me X11) et ne portent non plus l'extension (.h) mais (.xpm) ou
      (.xbm).

      <tag/Fichier objet (.o)/Ces fichiers ne sont plus des fichiers texte comme
      les pr&eacute;c&eacute;dents, mais des fichiers binaires. Inutile donc de les &eacute;diter. Un
      fichier objet est l'image d'un (et d'un seul) fichier source C  ou
      assembleur, lisible non plus par nous mais par l'ordinateur (le syst&egrave;me
      d'exploitation - ici le noyau Linux - pour &ecirc;tre plus pr&eacute;cis).

      <tag/Fichier archive (.a)/Ce fichier est la r&eacute;union de plusieurs fichiers
      objet, sans aucun lien entre eux.

      <tag/Fichier ex&eacute;cutable/Enfin, nous y sommes, le programme que nous
      ex&eacute;cuterons pour faire marcher notre tout dernier programme. Ce dernier
      fichier est la r&eacute;union de tous les fichiers objet et archive n&eacute;cessaires &agrave;
      la bonne marche du programme.

       Mais cette fois, des liens sont cr&eacute;&eacute;s entre eux, afin qu'une partie du
       programme contenu dans un fichier objet puisse par exemple appeler une
       autre partie contenue dans un autre fichier objet (du point de vue de
       fichiers sources, que l'on puisse par exemple appeler d'un fichier une
       fonction &eacute;crite dans un autre fichier).

     </descrip>

   <sect1>Les biblioth&egrave;ques associ&eacute;es au langage

   <sect1>Le compilateur et outils associ&eacute;s

    <p>
     Le compilateur C (<tt>gcc</tt>) travaille en plusieurs &eacute;tapes. Par d&eacute;faut,
     la commande <tt>gcc</tt> ex&eacute;cute toutes ces &eacute;tapes sur les fichiers donn&eacute;s
     en param&egrave;tre. Il faut lui pr&eacute;ciser une option  pour qu'il s'arr&ecirc;te apr&egrave;s
     une de ces &eacute;tapes.

     <descrip>
      <tag/la pr&eacute;compilation/
       inclut les fichiers pr&eacute;cis&eacute;s et/ou &eacute;tend les macros dans un fichier
       source (C ou assembleur):&nl;
       Utilisez l'option <tt>-E</tt> de <tt>gcc</tt> pour qu'il s'arr&ecirc;te apr&egrave;s
       la pr&eacute;compilation.

      <tag/la compilation/
       transforme un fichier source C en un fichier source assembleur:&nl;
       Utilisez l'option <tt>-S</tt> de <tt>gcc</tt> pour qu'il s'arr&ecirc;te
       apr&egrave;s la compilation.

      <tag/l'assemblage/
       transforme un fichier source (C ou assembleur) en un fichier objet:&nl;
       Utilisez l'option <tt>-c</tt> de <tt>gcc</tt> pour qu'il s'arr&ecirc;te apr&egrave;s
       l'assemblage.

      <tag/l'&eacute;dition de lien/
       regroupe et relie plusieurs fichiers objet pour cr&eacute;er l'ex&eacute;cutable.

     </descrip>

    <sect2>Exemple

     <p>
      Vous avez &eacute;crit plusieurs fichiers C ou assembleur pour un programme de
      cartes: 

      <descrip>
       <tag/cartes.c et distribuer.c/Fichiers sources C
       <tag/dessiner.s/Fichier source assembleur avec inclusions et/ou macros.
       <tag/compter_points.S/fichier source assembleur sans inclusions ni macros.
      </descrip>

     <p>
      Si vous voulez directement obtenir l'ex&eacute;cutable &agrave; partir de tous ces
      fichiers sources, tapez la commande:
      <verb>
       gcc cartes.c distribuer.c dessiner.s compter_points.S -o cartes
      </verb>
      Le compilateur <tt>gcc</tt> va alors cr&eacute;er les fichier objets
      correspondants &agrave; chaque fichier source - <tt>cartes.o</tt>,
      <tt>distribuer.o</tt>, <tt>dessiner.o</tt> et <tt>compter_points.o</tt> -
      puis relier tous ces fichiers objets en un fichier ex&eacute;cutable
      <tt>cartes</tt>. 

     <p>
      Vous voulez arr&ecirc;ter <tt>gcc</tt> juste avant qu'il ne relie les fichiers
      objets ? Tapez alors:
      <verb>
       gcc -c cartes.c distribuer.c dessiner.s compter_points.S -o cartes
      </verb>

     <p>
      Vous voulez obtenir tous vos fichiers sources en assembleur:
      <verb>
       gcc -S cartes.c distribuer.c dessiner.s compter_points.S
      </verb>
      <tt>gcc</tt> cr&eacute;e alors les fichiers <tt>cartes.s</tt>,
      <tt>distribuer.s</tt>, et ne touche pas aux fichiers <tt>dessiner.s</tt>
      et <tt>compter_points.S</tt> qui sont d&eacute;j&agrave; en assembleur.

     <p>
      Vous voulez pr&eacute;compiler un de vos fichiers sources ? Pour voir par exemple
      comment sont &eacute;tendues les macros que vous utilisez. Attention,
      <tt>gcc</tt> ne prend en compte que le premier fichier pass&eacute; en param&egrave;tre
      et &eacute;crit le r&eacute;sultat sur la sortie standard, vous devez donc taper:
      <verb>
       gcc -E cartes.c > cartes.i
      </verb>

    <sect2>Les outils associ&eacute;s

     <p>
      Le gestionnaire d'archive (<tt>ar</tt>) permet de regrouper plusieurs
      fichiers objet.

     <p>
      Dans l'exemple pr&eacute;c&eacute;dent, vous pouvez d&eacute;cider d'archiver les fichiers
      objet <tt>dessiner.o</tt> et <tt>distribuer.o</tt>, par exemple pour les
      r&eacute;utiliser pour un autre jeu de cartes. La compilation se fait alors
      ainsi:

      <descrip>

       <tag/gcc -c dessiner.s distribuer.c/
	Cr&eacute;e les fichiers objet <tt>dessiner.o</tt> et <tt>distribuer.o</tt>.

       <tag/rm -f libcartes.a; ar q libcartes.a dessiner.o distribuer.o; ar s libcartes.a/
	Ajoute les deux fichiers dessiner.o et distribuer.o dans le fichier
	archive <tt>libcartes.a</tt>, puis cr&eacute;e un index dans cette archive.

       <tag/gcc cartes.c compter_points.S libcartes.a -o cartes/
	Cr&eacute;e les fichiers objet <tt>cartes.o</tt> et <tt>compter_points.o</tt>,
	puis relie ces derniers avec ceux inclus dans <tt>libcartes.a</tt>
	pour former l'ex&eacute;cutable <tt>cartes</tt>.

      </descrip>

  <sect>L'environnement de programmation

   <p>
    Un certain nombre de choix doivent &ecirc;tre fait au d&eacute;but
    du projet en mati&egrave;re d'environnement de programmation.

   <p>
    Ce choix devra se faire le plus astucieusement possible, car l'utilisation
    d'un environnement confortable vous fera gagner de pr&eacute;cieux moments ou vous
    &eacute;vitera m&ecirc;me de voir votre projet s'envoler (par une grave erreur de
    manipulation par exemple) quelques heures avant le moment fatidique o&ugrave; vous
    devez le pr&eacute;senter.

   <p>
    Enfin, gardez bien &agrave; l'esprit le titre de ce document: Conduite de projet
    sous <bf>Linux</bf>. Oui, Linux, et sachez que, contrairement &agrave; d'autres
    syst&egrave;mes plus co&ucirc;teux, celui-ci dispose en <it>standard</it>, et
    gratuitement, d'un choix important du point de vue de la programmation
    (Linux ayant &eacute;t&eacute; d&eacute;velopp&eacute; sous Linux, les outils de programmation furent
    des premiers indispensables sur ce syst&egrave;me). Ainsi, je vous conseille de ne
    pas vous borner dans le choix de votre environnement de programmation:
    prenez un moment pour bien y r&eacute;fl&eacute;chir et croyez-moi, la pratique vous le
    rendra au centuple.

   <p>
    Cet environnement de programmation est compos&eacute; d'un grand nombre de
    composants. En voici, d'apr&egrave;s moi, les principaux:


   <sect1>Le gestionnaire de compilation

    <p>
     Le gestionnaire de compilation <tt>make</tt> permet d'automatiser la phase
     de compilation, celle de votre programme mais aussi celle de la
     documentation associ&eacute;e, et permet aussi d'automatiser l'installation, la
     mise en paquetage pour distribuer plus facilement votre application,
     l'&eacute;limination de fichiers temporaires cr&eacute;&eacute;s par votre &eacute;diteur de texte, le
     compilateur, etc...

     Prenons un exemple concret pour comprendre l'utilisation du gestionnaire
     de compilation: la compilation des programmes <tt>uuencode</tt> et
     <tt>uudecode</tt> de l'Universit&eacute; de Californie. <tt>uuencode</tt>
     permet de coder un fichier binaire en fichier ASCII et <tt>uudecode</tt>
     permet de d&eacute;coder un fichier cr&eacute;&eacute; par <tt>uuencode</tt>.

   <sect1>L'&eacute;diteur de texte

   <sect1>Le syst&egrave;me de contr&ocirc;le de version

   <sect1>Le syst&egrave;me de configuration automatique

   <sect1>Le d&eacute;bogueur

   <sect1>et bien d'autres...

  </sect>

 </article>

