Linux: le makefile gnu

Dans Linux, un makefile est un fichier texte qui décrit les fichiers qui sont nécessaires pour construire un programme particulier, ainsi que la façon de compiler et lier les fichiers pour créer le programme. Pour un programme Linux constitué de plusieurs fichiers source et d'en-tête, la makefile spécifie les éléments suivants:

  • Les éléments qui faire crée - habituellement les fichiers objets et l'exécutable. L'utilisation du terme cible de se référer à tout article qui se doit créer est commun.

  • Les fichiers ou d'autres actions nécessaires pour créer la cible.

  • Quelles sont les commandes à exécuter pour créer chaque cible.

Supposons que vous avez un fichier source C ++ nommé form.C qui contient la directive de préprocesseur suivantes:

#include "form.h" // Inclure fichier d'en-tête

Le fichier objet form.o dépend clairement du fichier source form.C et le fichier d'en-tête form.h. En plus de ces dépendances, vous devez spécifier comment faire convertit le form.C déposer le fichier objet form.o. Supposons que vous voulez faire d'invoquer g ++ (parce que le fichier source est en C ++) avec ces options:




  • -c (compiler uniquement)

  • -g (générer des informations de débogage)

  • -O2 (optimiser un peu)

Dans le makefile, vous pouvez exprimer ces options avec la règle suivante:

# Ce un commentaire dans le makefile # Les lignes suivantes indiquent comment form.o dépend # sur form.C et form.h et comment créer form.o.form.o: form.C form.hg ++ -c -O2 -g form.C

Dans cet exemple, la première ligne de noncomment montre form.o en tant que cible et form.C et form.h que les fichiers dépendants.

La ligne suivante de la dépendance indique comment construire la cible de ses personnes à charge. Cette ligne doit commencer par un onglet. Sinon, le faire commande se termine avec un message d'erreur, et vous êtes de gauche se gratter la tête parce que quand vous regardez le makefile dans un éditeur de texte, vous ne pouvez pas faire la différence entre un onglet et un espace.

Maintenant que vous connaissez le secret, la solution est de remplacer l'espace au début de la ligne incriminée avec un seul onglet.

L'avantage d'utiliser la marque est qu'elle empêche compilations inutiles. Après tout, vous pouvez exécuter g ++ (ou gcc) À partir d'un script shell pour compiler et lier tous les fichiers qui composent votre application, mais le script shell compile tout, même si les compilations ne sont pas nécessaires.

GNU faire, d'autre part, construit une cible que si un ou plusieurs de ses personnes à charge ont changé depuis la dernière fois que la cible a été construit. faire vérifie ce changement en examinant le temps de la dernière modification de la cible et les personnes à charge.

faire traite la cible comme le nom d'un but à l'objectif soit atteint, n'a pas à être un fichier. Vous pouvez avoir une règle comme celle-ci:

clean: rm -f * .o

Cette règle spécifie une cible abstraite nommée nettoyer qui ne dépend pas sur quoi que ce soit. Cette déclaration de dépendance indique que pour créer la cible nettoyer, GNU faire appelle la commande rm -f * .o, qui supprime tous les fichiers qui ont le .o extension (à savoir, les fichiers objets). Ainsi, l'effet de la création de la cible nommé nettoyer est de supprimer les fichiers objets.