TP 1 de Programmation 2e Année Informatique 2004-2005 : C++

Le Makefile

Quelques définitions

cible
Un fichier que make doit créer. Ce peut être le résultat final, ou un fichier intermédiaire.
dépendance
on dit qu'une cible a dépend d'autres cibles ou fichiers b,c,d si a a besoin de b,c,d pour être construite.

Le processus de construction de la cible macible est lancé par

      make macible
    
Le programme make recherche un fichier nommé makefile ou Makefile dans le répertoire courant. Ce fichier contient les informations qui lui permettent de travailler. Le makefile est composé de plusieurs parties :
  1. des définitions de macros, de la forme :
    NOM=valeur
    	
    (noter que la déclaration de macro commence en début de ligne)

    Une macro permet de rendre le makefile plus souple. Par exemple, si on déclare :

    CC=gcc
    	
    et que partout dans le makefile on utilise $(CC) au lieu de gcc, il suffira de changer la valeur de la macro pour changer le compilateur utilisé.
  2. des règles, qui ont la forme :
    cible : dep1 dep2 ...
    	  commande1
    	  commande2
    	  ...
    	
    La première ligne précise d'une part la cible sur laquelle porte la règle, et indique d'autre part que pour que cette cible soit construite, il faut que dep1, dep2, dep3... soient à jour. Dep1, dep2, dep3... sont, soit des cibles, soit des fichiers existant.

    On dit qu'un fichier est à jour s'il existe et qu'il est plus récent que les fichiers ou cibles dont il dépend.

    Quand make tente de construire une cible a, qui dépend de cibles d'une cible b qui n'est pas à jour, il met b à jour en le prenant à son tour pour cible

    Les commandes, quant à elles, sont optionnelles. Chaque ligne de commande commence par une tabulation. Pour construire une cible, une fois que make a mis à jour ses dépendences, il cherche une règle qui concerne la cible et qui contienne des commandes ; puis il exécute ces commandes.

Exemple

On suppose qu'on a une application dont le source est composé de trois fichiers, Article.h, Article.cpp, et programme.cpp. Les fichiers Article.cpp et programme.cpp incluent Article.h

fichiers utilisés

Le makefile utilisé sera donc :
# déclarations des macros :
# la compilateur :
CCC=c++
# les options du compilateur :
# (on compilera pour le débugger).
CCFLAG=-g

# Règles :

programme: programme.o Article.o
      $(CCC) -o programme programme.o Article.o


programme.o: programme.cpp Article.h
      $(CCC) -c  programme.cpp

Article.o: Article.cpp Article.h
      $(CCC) -c  Article.cpp

# Une "pseudo" cible, qui ne crée pas de fichier, pour nettoyer le répertoire.
# évite de taper "rm" à la main. Le "-" devant rm signifie que si la commande échoue, 
# (par exemple s'il n'y a rien à effacer), make va continuer comme si de rien n'était.
clean:
      -rm *.o programme

Exercice 1

Question 1

Copier les fichiers du répertoire src sur votre compte.
  1. Lisez-les
  2. tapez make. Observer ce qui se passe.
  3. modifiez un commentaire dans Article.cpp (par exemple en ajoutant un espace). Tapez make. Que se passe-t-il ?
  4. idem, mais en modifiant Article.h

Question 2

Ajoutez des accesseurs à la classe Article. Testez-les dans main.

Question 3

Ajouter la méthode getPrixTTC() à votre classe. Décommentez la ligne
//cout << "le prix ttc de " << a.getDesignation() << " est " << a.getPrixTTC() << endl;

Question 4

Créez la classe Facture. Une facture peut contenir jusqu'à 10 articles. Elle a l'en-tête suivante :

class Facture {
private:
  int nombreArticles;
  Article * articles[10];
public:
  Facture(); 
  ~Facture(); 
  void add(Article *a);
  int getNombreArticles();
  Article * getArticle(int i);
  void setArticle(int i, Article * a);
  double getTotalHT();
  double getTotalTTC();
};
    
Vous écrirez un programme principal dans lequel vous :
Serge ROSMORDUC