Fichier Make

Un fichier Make est un fichier texte référencé par la commande Make et décrivant la compilation des cibles ; il contient des informations telles que les dépendances au niveau source et les dépendances de l'ordre de compilation.

CDT peut générer automatiquement un fichier Make ; on parle alors de projets Make gérés. Certains projets, les projets Make standard, permettent de définir votre propre fichier Make.

Exemple de fichier Make

# Exemple de fichier Make
# ce fichier Make illustre et explique les 
# macros Make, les extensions de macro,
# les règles, les cibles, les dépendances, les commandes, les objectifs
# les cibles artificielles, la règle de modèle et la règle de dépendance.

# Les commentaires commencent par un signe # et se terminent à la fin de la ligne.

# Exemple de macro Make simple.
LINK_TARGET = test_me.exe

# Macro Make utilisant une barre oblique inverse pour s'étendre sur plusieurs lignes.
# Cela permet une modification rapide d'un plus grand nombre de fichiers d'objet.
OBJS =  \
 Test1.o \
 Test2.o \
 Main.o

# Macro Make définie par deux extensions de macro.
# Une extension de macro peut être traitée comme un remplacement textuel de la macro Make.
# Les extensions de macro commencent par un signe $ et sont placées entre parenthèses.
REBUILDABLES = $(OBJS) $(LINK_TARGET)

# Les macros Make n'ont pas besoin d'être définies avant leurs extensions de macro,
# mais elles doivent normalement être définies avant d'apparaître dans une règle.
# Par conséquent, les macros Make apparaissent souvent en premier dans un fichier Make.

# Exemple de règle simple (utilisée pour "nettoyer" votre environnement de compilation).
# Elle comporte une cible intitulée "clean" (à gauche du signe ":", sur la première ligne),
# aucune dépendances (à droite des deux-points)
# et deux commandes (indentées par des tabulations sur les lignes qui suivent).
# L'espace avant les deux-points n'est pas obligatoire, mais a été ajouté pour une
# plus grande clarté.
clean: 
 rm -f $(REBUILDABLES)
 echo Clean done

# Votre fichier Make comporte certainement deux cibles standard :
# "all" et "clean", car ce sont souvent des objectifs de ligne de commande.
# Par ailleurs, ces cibles sont généralement toutes deux des cibles artificielles
# car elles ne correspondent généralement pas à des fichiers réels
# intitulés "all" ou "clean".  

# La règle pour "all" permet de compiler votre système de manière incrémentielle.
# Pour cela, elle attribue une dépendance sur les résultats de ce système,
# qui à leur tour possèdent leurs propres règles et dépendances.
all : $(LINK_TARGET)
 echo All done

# Aucun ordre n'est imposé pour la liste des règles qui apparaissent dans le fichier make.
# Make compile sa propre arborescence de dépendances et n'exécute chaque règle qu'une fois
# que les règles de ses dépendances ont été exécutées avec succès.

# Exemple de règle utilisant certaines macros Make intégrées dans sa commande :
# $@ permet une extension à la cible de la règle (dans le cas présent, "test_me.exe").
# $^ permet une extension aux dépendances de la règle (dans le cas présent, les trois
# fichiers main.o, test1.o et test2.o).
$(LINK_TARGET) : $(OBJS)
 g++ -g -o $@ $^

# Exemple de règle de modèle souvent utilisée pour la ligne de compilation.
# Cette règle indique comment créer un fichier avec un suffixe .o, en partant d'un
# fichier avec un suffixe .cpp.
# La commande de la règle utilise certaines macros make intégrées :
# $@ pour la cible correspondant au modèle
# $lt; pour la dépendance correspondant au modèle
%.o : %.cpp
 g++ -g -o $@ -c $<

# Exemples de règles de dépendance. Il s'agit de règles sans commande.
# Les règles de dépendance indiquent que si un fichier à la droite des
# deux-points est modifié, la cible à la gauche de ces deux-points doit être
# considérée comme périmée.
# Les commandes permettant de mettre à jour une cible périmée sont disponibles ailleurs
# (dans le cas présent, dans la règle de modèle ci-dessus).
# Les règles de dépendance sont souvent utilisées pour capturer les dépendances des
# fichiers d'en-tête.
Main.o : Main.h Test1.h Test2.h
Test1.o : Test1.h Test2.h
Test2.o : Test2.h

# Vous pouvez également capturer des dépendances manuellement, à l'aide
# de certains générateurs de dépendances automatisés. En voici un exemple (en
# commentaire)...
# %.dep : %.cpp
#        g++ -M $(FLAGS) $< > $@
# include $(OBJS:.o=.dep)

Foire aux questions :

Votre vue Console peut être utile pour déboguer une compilation.

Q1. Ma vue Console affiche "Erreur lors du lancement du compilateur". Que cela signifie-t-il ?

Erreur lors du lancement du compilateur (make -k clean all )
(Erreur d'exécution : Echec du lancement)

Il est probable que la commande de compilation (par défaut "make") ne se trouve pas dans votre chemin. Vous pouvez l'y placer et redémarrer Eclipse.
Vous pouvez également remplacer la commande de compilation par une commande qui se trouve dans votre chemin. Si vous utilisez des outils MinGW pour la compilation, vous devez remplacer la commande de compilation par "mingw32-make".

Q2. Ma vue Console affiche "No rule to make target 'X'".

make -k clean all 
make: *** No rule to make target 'clean'.
make: *** No rule to make target 'all'.

Par défaut, le programme make recherche un fichier généralement appelé "Makefile" ou "makefile". S'il ne le trouve pas dans le répertoire de travail, que ce fichier est vide ou qu'il ne contient pas les règles des objectifs de la ligne de commande ("clean" et "all" dans le cas présent), il échoue généralement et génère un message d'erreur similaire à ceux indiqués.

Si vous possédez déjà un fichier Make valide, vous devez peut-être modifier le répertoire de travail de votre compilation. Le répertoire de travail par défaut de la commande de compilation correspond au répertoire racine des projets. Vous pouvez en changer en spécifiant un autre répertoire de compilation dans les propriétés du projet Make. Par ailleurs, si votre fichier Make s'intitule autrement (par exemple, buildFile.mk), vous pouvez en spécifier le nom à l'aide de la commande de compilation par défaut make -f buildFile.mk.

Si vous ne possédez pas de fichier Make valide, créez un fichier Make dans le répertoire racine. Vous pouvez alors y ajouter le contenu de l'exemple de fichier Make (voir plus haut) et le modifier comme il convient.

Q3. Ma vue Console affiche "séparateur manquant".

make -k clean all 
makefile:12: *** missing separator.  Stop.

La syntaxe standard des fichiers Make spécifie que chaque ligne d'une règle de compilation doit être précédée d'un caractère de tabulation. Ce caractère est souvent remplacé par erreur par des espaces et comme dans les deux cas, il y a indentation par caractères blancs, cet incident passe facilement de manière inaperçue. Dans l'exemple fourni, le message d'erreur peut-être attribué à la ligne 12 du fichier "makefile" ; pour résoudre cet incident, insérez une tabulation au début de cette ligne.

Q4. Ma vue Console affiche "Target 'all' not remade because of errors".

make -k clean all 
make: *** [clean] Error 255
rm -f Test1.o Test2.o Main.o test_me.exe
g++ -g -o Test1.o -c Test1.cpp
make: *** [Test1.o] Error 255
make: *** [Test2.o] Error 255
make: *** [Main.o] Error 255
g++ -g -o Test2.o -c Test2.cpp
g++ -g -o Main.o -c Main.cpp
make: Target 'all' not remade because of errors.

Il est fort probable que la commande g++ ne se trouve pas dans votre chemin.

L'erreur 255 est générée par make car son shell de commande ne trouve pas une commande pour une règle donnée.
Les messages du flux d'erreurs standard (les lignes affichant Erreur 255) et du flux de sortie standard (toutes les autres lignes) sont fusionnés ici dans la vue Console.

Q5. A quoi sert l'option -k ?

L'option -k indique à make de continuer à créer d'autres règles indépendantes, même si une règle échoue. Cela est utile pour les projets de grande taille.

Vous pouvez supprimer l'option -k en activant l'option Propriétés du projet > Projet Make C/C++ > Compilateur Make > S'arrêter sur la première erreur de compilation

Q6. Ma vue Console est similaire à la sortie suivante :

mingw32-make clean all 
process_begin: CreateProcess((null), rm -f Test1.o Test2.o Main.o test_me.exe, ...) failed.
make (e=2): The system cannot find the file specified.

mingw32-make: *** [clean] Error 2
rm -f Test1.o Test2.o Main.o test_me.exe

Cela signifie que mingw32-make n'a pas réussi à trouver l'utilitaire "rm". Malheureusement, MinGW n'est pas fourni avec "rm". Pour corriger cela, remplacez la règle clean de votre fichier Make par :

clean: 
	-del $(REBUILDABLES)
	echo Clean done

Le signe moins (-) indique à make de prendre en compte la règle clean, même si la commande del échoue. Cela est possible car la commande del échoue si les fichiers à supprimer n'existent pas encore (ou n'existent plus).

Déclaration de copyright IBM