Une brève introduction aux «MakeFiles» dans le développement de logiciels open source avec GNU Make

Une brève introduction aux «MakeFiles» dans le développement de logiciels open source avec GNU Make

GNU FAIT est un utilitaire de développement qui détermine les parties d'une base de code particulière qui doivent être recompilées et peuvent émettre des commandes pour effectuer ces opérations sur la base de code. Ce particulier faire L'utilité peut être utilisée avec n'importe quel langage de programmation à condition que leur compilation puisse être effectuée à partir du shell en émettant des commandes.

Makefiles dans Linux

Pour utiliser GNU FAIT, Nous devons avoir un ensemble de règles qui définit la relation entre les différents fichiers de notre programme et les commandes pour mettre à jour chaque fichier. Ceux-ci sont écrits sur un fichier spécial appelé 'makefile'. Le 'faire'Commande utilise le'makefile'Base de données et les derniers temps de modification des fichiers pour décider quels fichiers doivent à nouveau recompiller.

Contenu d'un makefile

En général 'makefiles'contiennent 5 types de choses à savoir: règles implicites, règles explicites, Définitions variables, directives, et commentaires.

  1. Un règle explicite Spécifie comment fabriquer / refaire un ou plusieurs fichiers (appelés cibles, sera expliqué plus loin) et quand faire de même.
  2. Un règle implicite Spécifie comment fabriquer / refaire un ou plusieurs fichiers en fonction de leurs noms. Il décrit comment un nom de fichier cible est lié à un fichier avec un nom similaire à la cible.
  3. UN Définition variable est une ligne qui spécifie une valeur de chaîne pour qu'une variable soit remplacée plus tard.
  4. UN directif est une instruction pour que Make fasse quelque chose de spécial en lisant le makefile.
  5. UN '#'symbole est utilisé représente le début d'un commentaire à l'intérieur makefiles. Une ligne commençant par '#'est simplement ignoré.

Structure des makefiles

Les informations qui indiquent faire Comment recompiler un système provient de la lecture d'une base de données appelée makefile. Un simple makefile Will se compose de règles de la syntaxe suivante:

Target…: Prérequis… Recette… 

UN cible est défini comme le fichier de sortie généré par le programme. Ça peut être aussi cibles bidon, qui sera expliqué ci-dessous. Des exemples de fichiers cibles incluent exécutables, fichiers d'objet ou cibles bidon comme faire le ménage, installer, désinstaller etc.

UN prérequis est un fichier utilisé comme entrée pour créer les fichiers cibles.

UN recette est l'action qui faire joue pour créer le fichier cible basé sur les conditions préalables. Il est nécessaire de mettre un caractère d'onglet avant chaque recette à l'intérieur du makefiles Sauf si nous spécifions le '.Pressodéfix'Variable pour définir un autre caractère comme préfixe de la recette.

Un échantillon de makefile

Final: Main.o fin.o inter.o Commencer.o gcc -o final principal.o fin.o inter.o Commencer.o Main.O: Main.C Global.H GCC -C Main.c fin.O: fin.c local.h Global.H GCC -C Fin.c inter.O: inter.C Global.h gcc -c inter.C Start.O: commencer.C Global.H GCC -C Start.C Clean: RM -f Main.o fin.o inter.o Commencer.o

Dans l'exemple ci-dessus que nous avons utilisé 4 c Fichiers source et deux fichiers d'en-tête pour créer l'exécutable final. Ici chacun '.o'Le fichier est à la fois une cible et une condition préalable à l'intérieur du makefile. Jetez maintenant un œil au dernier nom cible faire le ménage. C'est juste une action plutôt qu'un fichier cible.

Étant donné que nous n'en avons normalement pas besoin pendant la compilation, il n'est pas écrit comme une condition préalable dans aucune autre règle. Les cibles qui ne font pas référence aux fichiers mais ne sont que des actions sont appelées cibles bidon. Ils n'auront pas de conditions préalables comme autres fichiers cibles.

Comment GNU fait le processus un makefile

Par défaut faire commence avec la première cible dans le 'makefile'Et est appelé comme'objectif par défaut'. Compte tenu de notre exemple, nous avons final Comme notre première cible. Étant donné que ses conditions préalables incluent d'autres fichiers d'objets, ceux-ci doivent être mis à jour avant de créer final. Chacune de ces conditions préalables est traitée en fonction de leurs propres règles.

La recompilation se produit s'il y a des modifications apportées à fichiers source ou fichiers d'en-tête ou si le fichier d'objet n'existe pas du tout. Après avoir recompilé les fichiers d'objets nécessaires, faire décide de rejeter final ou non. Cela doit être fait si le fichier final n'existe pas, ou si l'un des fichiers d'objet est plus récent qu'il.

Ainsi, si nous modifions le fichier Inter.c, puis en course faire il recompilera le fichier source pour mettre à jour le fichier objet Inter.o puis lier final.

Utilisation de variables à l'intérieur de Makefiles

Dans notre exemple, nous avons dû répertorier tous les fichiers d'objet deux fois dans la règle pour final comme indiqué ci-dessous.

Final: Main.o fin.o inter.o Commencer.o gcc -o final principal.o fin.o inter.o Commencer.o

Afin d'éviter de telles duplications, nous pouvons introduire des variables pour stocker la liste des fichiers d'objets qui sont utilisés à l'intérieur du makefile. En utilisant la variable Obj Nous pouvons réécrire l'échantillon makefile à un similaire illustré ci-dessous.

OBJ = Main.o fin.o inter.o Commencer.o Final: $ (obj) gcc -o final $ (obj) Main.O: Main.C Global.H GCC -C Main.c fin.O: fin.c local.h Global.H GCC -C Fin.c inter.O: inter.C Global.h gcc -c inter.C Start.O: commencer.C Global.H GCC -C Start.C Clean: RM -F $ (OBJ)

Règles pour nettoyer le répertoire source

Comme nous l'avons vu dans l'exemple makefile, Nous pouvons définir des règles pour nettoyer le répertoire source en supprimant les fichiers d'objets indésirables après la compilation. Supposons que nous ayons un fichier cible appelé faire le ménage. Comment puis faire différencier les deux situations ci-dessus? Voici le concept de cibles bidon.

UN cible bidon est celui qui n'est pas vraiment le nom d'un fichier, il s'agit plutôt d'un nom pour une recette à exécuter chaque fois qu'une demande explicite est faite à partir du makefile. Une raison principale d'utiliser cible bidon est d'éviter un conflit avec un fichier du même nom. Une autre raison est d'améliorer les performances.

Pour expliquer cette chose, je vais révéler une tournure inattendue. La recette de faire le ménage ne sera pas exécuté par défaut lors de l'exécution faire. Il faut plutôt invoquer la même chose en émettant la commande se nettoyer.

.Bénétraniste: propre Clean: RM -F $ (OBJ)

Essayez maintenant de créer makefiles pour votre propre base de code. N'hésitez pas à commenter ici avec vos doutes.