Accueil
 1  Objectifs de la séance
 2  Modularité en C vs. Java
 3  Compilation de modules
 4  Bibliothèque
 5  Makefile
   
   
   
   
 

 Contacts

W3C validator

Département INF  
 Titre du cours


5 Makefile

  • Arbre des dépendances
    • “Pour créer executable, j’ai besoin de mem_alloc.o et main.o
  • Action
    • “Pour créer executable, il faut lancer la commande gcc -o executable mem_alloc.o main.o
  • Syntaxe: dans un fichier Makefile, ensemble de règles sur deux lignes:
    • cible : dependance1 dependance2 ... dependanceN
    • <TAB>commande
  • Pour lancer la compilation: commande make
    • Parcourt l’arbre de dépendance et détecte les cibles à regénérer
    • Exécute les commandes pour chaque cible

    previous 


  • La commande make
    • La commande make parcourt le fichier Makefile du répertoire courant et tente de produire la première cible.
    • Il est également possible de spécifier une cible à produire en utilisant make cible.
    • Dès qu’une action génère une erreur, la commande make s’arrête
    • La liste des cibles à regénérer est calculée à partir de l’arbre de dépendance décrit dans le fichier Makefile et des date/heure de dernière modification des fichiers: si un fichier de l’arbre est plus récent que la cible à générer, tout le chemin entre le fichier modifié et la cible est regénéré.
  • Le fichier Makefile

    Voici un exemple de fichier Makefile:


    0cAp3x16-150005: Makefile
     
    all: executable 
     
    executable: mem_alloc.o main.o 
            gcc -o executable main.o mem_alloc.o 
     
    mem_alloc.o: mem_alloc.c mem_alloc.h 
            gcc -c mem_alloc.c 
     
    main.o: main.c mem_alloc.h 
            gcc -c main.c
    • La (ou les) commande(s) à exécuter pour générer chaque cible est précédée du caractère Tabulation. Sous emacs, lorsque vous éditez un fichier nommé Makefile, les tabulations sont colorisées en rose par défaut.

      Si vous utilisez des espaces à la place de la tabulation, la commande make affiche le message d’erreur suivant:  
      verbatim

    • Puisque la commande make (sans argument) génère la première cible, on ajoute généralement une premier cible “artificielle” all décrivant l’ensemble des exécutables à générer:  
      verbatim Dans ce cas, seule la cible est spécifiée. Il n’y a pas d’action à effectuer.
    • On ajoute également souvent une règle artificielle clean pour “faire le ménage” (supprimer les exécutables et les fichiers .o):  
      verbatim
    • Lorsqu’on écrit un fichier Makefile, on peut utiliser certaines notations symboliques:
      • $@ désigne la cible de la règle
      • $ˆ désigne l’ensemble des dépendances
      • $< désigne la première dépendance de la liste
      • $? désigne l’ensemble des dépendances plus récentes que la cible
    • Il est possible de définir et d’utiliser des variables dans un fichier Makefile. Par exemple:

      0cAp4x16-150005: Makefile complet
       
      BIN=executable 
      OBJETS=mem_alloc.o main.o 
      CFLAGS=-Wall -Werror -g 
      LDFLAGS=-lm 
       
      all: $(BIN) 
       
      executable: $(OBJETS) 
              gcc -o executable main.o mem_alloc.o $(LDFLAGS) 
       
      mem_alloc.o: mem_alloc.c mem_alloc.h 
              gcc -c mem_alloc.c $(CFLAGS) 
       
      main.o: main.c mem_alloc.h 
              gcc -c main.c $(CFLAGS) 
       
      clean: 
              rm -f $(BIN) $(OBJETS)
  • Configuration et dépendances.
    • Dans “la vraie vie”, l’outil make n’est qu’une partie de la chaîne de configuration et de compilation.
    • Des outils comme autoconf/automake ou Cmake sont fréquemment utilisés pour écrire des “proto-makefiles”
    • Ces outils permettent de détecter la configuration de la machine (quel CPU ? la bibliothèque X est-elle installée ? etc.) et de définir les options de compilation de manière portable.

François Trahay, Télécom SudParis, CSC4103 – Programmation système, 2019–2020