Marque GNU

Tutoriel GNU Make

Tutoriel GNU Make

GNU Make est un outil qui permet de générer des programmes exécutables à partir du code source et de traiter également d'autres fichiers non sources du projet. Make obtient la logique de construction des exécutables et de traitement d'autres fichiers non sources à partir d'un fichier appelé un makefile ou un Makefile.

Pourquoi faire?

Installation de Make

Faire seul ne suffit pas pour construire des programmes. Pour créer des programmes à partir des sources, vous devez avoir des compilateurs et d'autres outils installés sur votre système. Nous avons donc besoin de la suite complète d'outils de développement pour notre objectif.

Pour compiler les sources sur Linux, il existe un paquet appelé « build-essential » sur les systèmes basés sur Debian (e.g. Ubuntu, Linux Mint, etc.) et « Outils de développement » sur Red Hat et CentOS.

Pour l'installer sur des systèmes basés sur Debian :

apt-get install build-essential

Pour l'installer sur CentOS et Red Hat, exécutez :

yum groupinstall "Outils de développement"

Premiers pas avec Makefile

Commençons par écrire un Bonjour le monde programmer avec le langage de programmation C.

La fonction principale de notre programme C résidera à l'intérieur bonjour.c. Le contenu du fichier doit ressembler à ce qui suit :

#inclure  int main()  my_fun(); renvoie 0 ;  

Ce code inclut le fichier d'en-tête hellofun.h qui contient la déclaration d'une fonction appelée hello_fun(). Le contenu de hellofun.le sien:

annuler mon_fun();

La définition de my_fun() réside dans hellofun.c :

#inclure  #inclure  void my_fun()  printf("Bonjour tout le monde!\n"); retour; 

C'est un programme très simple et nous pourrions le compiler avec gcc avec une seule ligne de commande. Mais, les programmes de la vie réelle ne sont pas aussi simples et aussi petits que cela. Les choses se compliquent très vite.  Ci-dessous, je vais écrire le script makefile nécessaire pour compiler ce programme hello world. J'en expliquerai différentes parties dans les sections suivantes.

hellomain : hellomain.c hellofun.c gcc -o bonjour bonjour.c bonjour.c-je.

Conservez ce code dans un fichier appelé makefile (sans aucune extension de fichier). Mettez le fichier dans le répertoire où se trouvent les fichiers C. Pointez votre ligne de commande dans ce répertoire. Sur la ligne de commande, écrivez make et appuyez sur Entrée. Un fichier exécutable appelé hello sera généré dans le répertoire courant. Vous pouvez vérifier le résultat en exécutant l'exécutable avec la commande suivante.

./Bonjour

Les sorties:

Bonjour le monde!

Règles, cibles et dépendances

Un script makefile est un ensemble de règles. Les règles indiquent à Make comment créer une cible ou une sortie à partir de fichiers source ou d'autres fichiers. La règle spécifie également les dépendances de la cible. Les règles de dépendance doivent être exécutées en premier selon que cela est déjà traité en regardant les horodatages. Dans notre exemple makefile ci-dessus, nous avons une règle avec une cible nommée bonjour et ses dépendances. Le nom de la cible est séparé par deux points de la liste des dépendances. Les commandes shell qui seront exécutées sont répertoriées dans la ligne suivante. Les commandes shell doivent commencer par un caractère de tabulation.

Si vous ne spécifiez aucun paramètre avec la commande make alors la première cible est exécutée. Dans notre exemple, nous n'avons spécifié aucun paramètre et nous avions bonjour comme première et unique cible.

Variables

Les variables sont un excellent moyen d'écrire la valeur une fois et de les utiliser plusieurs fois sans répéter la valeur encore et encore. Cela nous aide à garder notre code SEC (Ne pas vous répéter). Si jamais vous avez besoin de modifier une valeur dans tout le script, il vous suffit de la modifier à un endroit pour refléter le changement partout si vous utilisez une variable.

Dans notre exemple, nous avons utilisé gcc en tant que compilateur, mais nous devrons peut-être changer le compilateur en quelque chose d'autre. Ainsi, nous pouvons garder le nom du compilateur dans une variable. De plus, nous pouvons conserver les drapeaux du compilateur dans une autre variable pour les réutiliser. Pour définir une valeur sur une variable, nous utilisons le signe égal (=) et pour lire cette variable, nous utilisons $(variable_name).

CC=gcc CFLAGS=-I. hellomain: hellomain.c hellofun.c $(CC) -o bonjour bonjour.c bonjour.c $(CLAGS)

Nettoyer l'environnement

Nous pouvons souvent avoir besoin de nettoyer notre environnement. Si nous voulons que chaque pièce de notre projet soit reconstruite à partir de zéro, nous devons le nettoyer. Dans notre exemple simple, le seul fichier généré est le Bonjour exécutable. Sans le supprimer manuellement, nous pouvons le supprimer avec make. Ainsi, nous pouvons créer une règle pour cela et nommer la cible comme faire le ménage.

CC=gcc CFLAGS=-I. hellomain : hellomain.c hellofun.c $(CC) -o bonjour bonjour.c bonjour.c $(CFLAGS) nettoyer : rm bonjour

La commande shell dans la cible propre n'est que l'ancienne commande shell rm. Maintenant, à partir de la ligne de commande, exécutez :

rendre propre

Regardez le répertoire actuel pour voir que le Bonjour le fichier exécutable est parti.

Étendre notre exemple pour résoudre plus de problèmes

Dans notre exemple simple de compilation hello world, nous avons un problème que nous n'avons pas encore résolu. bonjour la cible regarde hello.c et bonjour.c l'horodatage des fichiers la prochaine fois que vous essayez de le recompiler avec Fabriquer ou alors faire bonjour. Donc, si vous modifiez l'un de ces deux fichiers, ils seront recompilés. Mais si tu changes bonjour.h alors il ne recompilera pas. C'est inattendu!

Encore une fois, nous avons sauté un niveau intermédiaire. Nous n'avons pas généré les fichiers objets et généré directement l'exécutable. Mais, en coulisse, les fichiers objets sont créés dans un répertoire temporaire et supprimés. Nous voulons générer les fichiers objets avant de construire l'exécutable. Cette fois, nous nommons la cible principale comme tout

tout : hellomain.oh bonjour.o gcc hellomain.oh bonjour.o -o bonjour bonjour.o : bonjour.c hellofun.h gcc -I. -c bonjour.c hellofun.o : bonjour.c hellofun.h gcc -I. -c hellofun.c propre : rm -rf *.ou rm bonjour

Exécutez à nouveau la commande make pour voir si votre programme se construit avec succès ou non. Exécutez l'exécutable hello pour vérifier le résultat. Regardez le répertoire courant et vous verrez que les fichiers objets sont créés. Nous avons ajouté une ligne supplémentaire à la cible de nettoyage pour nettoyer les fichiers objets. Ce script makefile aidera à recompiler le programme hello world même si le bonjour.h le fichier est modifié.

Conclusion

Make est l'un des outils les plus essentiels pour les utilisateurs et les programmeurs Linux. Si vous êtes un utilisateur final, la connaissance de make vous aidera à réparer de nombreux problèmes dans votre monde Linux. Si vous êtes un programmeur, vous ne pouvez tout simplement pas vous en sortir en écrivant le code et en laissant vos utilisateurs comprendre comment compiler ce code source en exécutables. Vous devez créer un script makefile pour les utilisateurs finaux, afin qu'ils ne jouent pas à des devinettes pour compiler votre source en exécutables.

Les références

Page d'accueil du projet GNUMake
Documentation de création de GNU

Le bouton central de la souris ne fonctionne pas sous Windows 10
le bouton central de la souris vous aide à faire défiler de longues pages Web et des écrans contenant beaucoup de données. Si cela s'arrête, et bien v...
Comment changer les boutons gauche et droit de la souris sur un PC Windows 10
Il est tout à fait normal que tous les appareils de souris d'ordinateur soient conçus de manière ergonomique pour les droitiers. Mais il existe des so...
Émulez les clics de souris en survolant à l'aide de la souris sans clic dans Windows 10
L'utilisation d'une souris ou d'un clavier dans la mauvaise posture d'une utilisation excessive peut entraîner de nombreux problèmes de santé, notamme...