logo

Commande Linux make

Le Linux faire La commande est utilisée pour créer et maintenir des groupes de programmes et de fichiers à partir du code source. Sous Linux, c'est l'une des commandes les plus fréquemment utilisées par les développeurs. Il aide les développeurs à installer et compiler de nombreux utilitaires à partir du terminal. De plus, il gère le processus de compilation des projets de grande envergure. Cela économise le temps de compilation.

L'objectif principal de la commande make est de déterminer un programme volumineux en plusieurs parties et de vérifier s'il doit être recompilé ou non. Aussi, il émet les ordres nécessaires pour les recompiler.

Dans cette section, nous utiliserons des programmes C++ puisque le langage de programmation C++ est un langage orienté objet, mais vous pouvez utiliser n'importe quel langage installé sur votre machine. Cela ne se limite pas aux programmes ; nous pouvons également l'utiliser pour décrire d'autres tâches.

Comment fonctionne la commande make ?

La commande make prend les cibles comme arguments. Ces arguments sont spécifiés dans « Makefile ». Le makefile contient les cibles ainsi que les actions associées liées à ces cibles.

Lorsque nous exécutons la commande make, elle recherche le makefile et l'analyse pour trouver la cible et accéder à ses dépendances. Si les dépendances ne sont pas spécifiées, il recherchera la dépendance et la construira. Il construira la cible principale une fois les dépendances construites.

Par exemple, si nous voulons modifier un seul fichier source et que nous exécutons la commande make ; ainsi, cela compilera uniquement le fichier objet connecté à ce fichier source. Cela permettra de gagner beaucoup de temps lors de la compilation finale du projet.

Qu’est-ce que Makefile ?

La commande make invoque l'exécution du makefile. Il s'agit d'un fichier spécial qui contient les commandes shell que nous créons pour maintenir le projet. Le makefile contient des cibles et des commandes à exécuter. Il n'est pas permis de créer plus d'un makefile. Il est recommandé de créer un répertoire séparé pour celui-ci.

Il garde une trace des fichiers récents, donc ne mettez à jour que les fichiers requis. Si nous avons un gros programme avec de nombreux fichiers sources, nous devons recompiler tous les fichiers dépendants. Cela peut donc prendre beaucoup de temps.

Le makefile contient une liste de normes. Ces normes sont utiles au système pour comprendre quelle commande nous voulons exécuter. Ces normes sont divisées en deux parties et séparées par une nouvelle ligne. La première ligne est la ligne de dépendance, et les lignes suivantes sont considérées comme actions ou commandement s. Les commandes sont séparées par une tabulation dans la nouvelle ligne.

Le dépendances spécifier la relation de chaque fichier avec les fichiers source. Et le cible est un fichier exécutable et il est créé après l’exécution de la commande make.

Possibilités

La commande make facilite diverses options pour la rendre plus spécifique. Certaines options importantes sont les suivantes :

    -b, -m :Ces options permettent d'ignorer la compatibilité des différentes versions de la commande make.-B, --always-make :Ces options sont utilisées pour créer sans condition toutes les cibles.-C rép, --directory=rép :Ces options permettent de changer de répertoire avant d'exécuter le makefile.-d:Il est utilisé pour imprimer les informations de débogage.--debug[=DRAPEAU] :Il est utilisé pour imprimer les informations de débogage ainsi que le traitement normal. Si nous ignorons l'indicateur, des résultats similaires à ceux de l'option '-d' s'afficheront.-e, --environment-overrides :Il est utilisé pour fournir les variables extraites de la priorité de l'environnement au makefile.-f fichier, --file=fichier, --makefile=FICHIER :Il est utilisé pour utiliser un fichier comme makefile.-i, --ignore-erreurs :L'option '-i' est utilisée pour ignorer toutes les erreurs dans les commandes.-Je dir, --include-dir=dir :Il est utilisé pour spécifier un répertoire dans lequel rechercher le makefile spécifié. Si nous spécifions les nombreuses options '-I', il recherchera dans les nombreux répertoires dans l'ordre spécifié.-j [emplois], --jobs[=emplois] :Il est utilisé pour spécifier le nombre de tâches à exécuter simultanément. Si nous fournissons plusieurs options '-j', la dernière sera considérée comme exécutée. Si nous ne précisons pas le nombre de tâches, cela ne limitera pas les tâches pouvant s'exécuter simultanément.-k, --continue :Il est utilisé pour continuer le programme autant que possible après avoir obtenu une erreur.-l [charger], --load-average[=charger] :Il permet de spécifier qu'aucune nouvelle tâche ne doit être démarrée si d'autres tâches sont dans la file d'attente et que la charge moyenne est à son minimum.-n, --just-print, --dry-run, --recon :Il est utilisé pour afficher la commande qui serait exécutée.-o fichier, --old-file=fichier, --assume-old=fichier :Il est utilisé pour garantir que le make ne recréera pas le fichier même s'il est plus ancien que ses dépendances.-O[type], --output-sync[=type] :Il est utilisé pour confirmer que le résultat de chaque tâche est rassemblé plutôt qu’un résultat mélangé d’autres tâches. Il est utile pour le traitement de plusieurs tâches avec l'option '-j'.-p, --print-data-base :Il permet d'imprimer la base de données produite après lecture des makefiles. Il est également utile d'imprimer les informations de version lorsqu'il est utilisé avec l'option '-v'. Pour imprimer la base de données sans essayer de recréer aucun fichier, exécutez la commande comme suit :
    make -p -f/dev/null.-q, --question :L'option '-q' est utilisée pour le Mode questions. Il n’exécutera aucune commande et n’imprimera rien. Il ne renverra un état de sortie nul que si la cible spécifiée est déjà synchronisée ; sinon, il affichera un statut de sortie différent de zéro.-r, --no-builtin-rules :Il est utilisé pour éliminer l’utilisation des règles implicites intégrées.-R, --no-builtin-variables :C'est utile si nous ne voulons définir aucune variable intégrée.-s, --silencieux, --quiet :Ces options sont appelées Fonctionnement silencieux. Il se limite à imprimer les commandes au fur et à mesure de leur exécution.-S, --pas de continuation, --stop :Il est utilisé pour annuler l'effet de l'opération '-k, --keep-going'.-t, --touch :Il est utilisé pour toucher des fichiers au lieu d'exécuter leurs commandes.--tracer:Il est utilisé pour retracer la disposition de chaque cible.-v, --version :Il est utilisé pour imprimer la version installée de l'utilitaire make. De plus, il affiche une liste des auteurs, des droits d'auteur et des avis concernant l'utilitaire make.-w, --print-directory :Il est utilisé pour suivre un message d'impression contenant un répertoire de travail avant et après un autre traitement. Il est utile de retrouver les erreurs liées à la structure complexe de la commande make récursive.--pas de répertoire d'impression :Il est utilisé pour désactiver l'option '-w'.-W fichier, --what-if=fichier, --new-file=fichier, --assume-new=fichier :Ces options prétendent que le fichier cible vient d'être modifié.--warn-variables-undéfinies :Cette option est utilisée pour avertir qu'une variable non définie est référencée.

Comprenons quelques exemples de la commande make. Nous verrons l'utilisation de base du makefile, et plus loin, nous créerons quelques programmes C++ et un makefile. Nous allons effectuer quelques opérations dessus pour mieux comprendre la commande make.

inverser la chaîne java

Utilisation de base de la commande make

Comprenons l'utilisation très basique de la commande make, et cela peut vous aider à comprendre comment elle fonctionne.

Créez un répertoire « projet » et modifiez-y le répertoire. Considérez les commandes ci-dessous :

 mkdir project cd project 

Créez maintenant un 'Makefile' ayant le contenu suivant pour le premier programme :

commande tactile sous Linux
 say_hello: echo 'Hello World!' 

D'après le fichier ci-dessus, say_hello est une cible qui se comporte comme une fonction dans n'importe quel langage de programmation, et echo sera considéré comme une action. Il ne faut pas oublier que l'action doit être écrite en utilisant un LANGUETTE. La cible et l'action créent ensemble une règle pour le makefile. Maintenant, exécutez la commande make comme suit :

Considérez le résultat ci-dessous :

Commande Linux make

À partir de la sortie ci-dessus, nous pouvons voir que l’opération d’écho elle-même s’affiche. Si nous ne voulons pas afficher la commande echo sur la sortie, exécutez l'écho en commençant par '@' symbole. Pour supprimer l'écho, mettez à jour le contenu du makefile comme suit :

 say_hello: @echo 'Hello World!' 

Considérez le résultat ci-dessous :

Commande Linux make

Une cible peut être un fichier binaire qui dépend des actions.

Ajoutons quelques cibles supplémentaires, telles que générer et lister dans le makefile. Mettez à jour le makefile comme suit :

 say_hello: @echo 'Hello World!' generate: @echo 'Creating files' touch file-{1..5}.txt list: @echo 'Listing files' ls 

Si nous exécutons la commande make, elle n'exécute que la première cible car c'est la cible par défaut du makefile. Considérez le résultat ci-dessous :

Commande Linux make

Nous pouvons modifier la cible par défaut en incluant le contenu ci-dessous dans notre makefile :

 .DEFAULT_GOAL := generate 

Ajoutez-le à la première ligne du fichier comme suit :

Commande Linux make

Le makefile ci-dessus considérera « générer » comme objectif par défaut. Exécutez la commande make et elle donnera le résultat suivant :

Commande Linux make

L'option DEFAULT GOAL exécutera une seule cible pour spécifier plusieurs cibles pour utiliser toutes les options. Pour spécifier plusieurs cibles, mettez à jour la première ligne du makefile comme suit :

 all: say_hello generate 

Il exécutera la cible spécifiée. Considérez le résultat ci-dessous :

Commande Linux make

Il existe une autre option qui nous permet d'exécuter toutes les cibles. Si nous voulons exécuter toutes les cibles du makefile, mettez à jour le fichier comme suit :

 .PHONY: all say_hello generate list say_hello: @echo 'Hello World!' generate: @echo 'Creating files' touch file-{1..5}.txt list: @echo 'Listing files' ls 

Le fichier ci-dessus exécutera toutes les cibles spécifiées. Exécutez la commande make, considérez le résultat ci-dessous :

Commande Linux make

Utilisation avancée de la commande make

Créons un projet C++ contenant les fichiers main.cpp, function1.cpp, function2.cpp et un fichier de dépendances function.h.

Le code des fichiers est le suivant :

différence de dates dans Excel

main.cpp :

 #include #include 'functions.h' int main() { print_hello(); std::cout<< std::endl; std::cout<< 'The factorial of 5 is' << factorial(5) << std:: endl; return 0; } 

fonction1.cpp :

 #include 'functions.h' int factorial(int n) { if(n!=1) { return (n * factorial(n-1)); } else return 1; } 

fonction2.cpp :

 #include #include 'functions.h' void print_hello() { std::cout << 'Hello World'; } 

fonctions.h :

 void print_hello(); int factorial (int n); 

Créez maintenant un fichier exécutable du projet ci-dessus en exécutant la commande ci-dessous :

 g++ main.cpp function1.cpp function2.cpp -o hello 

La commande ci-dessus créera un fichier exécutable 'Bonjour' des fichiers main.cpp, function1.cpp et function2.cpp.

Considérez le résultat ci-dessous :

Commande Linux make

À partir de la sortie ci-dessus, si elle est exécutée avec succès, elle ne donnera aucune sortie.

Effectuons la même tâche en utilisant le makefile.

Créez un fichier comme Makefile et mettez-y le code ci-dessous.

 all: g++ main.cpp function1.cpp function2.cpp -o hello 

Le mot clé all est utilisé pour target et en nouvelle ligne, placez la même commande avec un TAB que ci-dessus pour spécifier l'opération. Enregistrez le fichier. Considérez le fichier ci-dessous :

Commande Linux make

Pour fonctionner, exécutez la commande comme suit :

java convertir un caractère en chaîne
 make 

La commande ci-dessus créera un fichier exécutable « bonjour » des fichiers spécifiés. Considérez le résultat ci-dessous :

Commande Linux make

Ajoutons quelques tâches supplémentaires à Makefile. Ajouter une tâche 'compiler' comme suit:

 all: compile: g++ main.cpp function1.cpp function2.cpp -o hello 

Pour exécuter la tâche compiler, exécutez la commande ci-dessous :

 make compile 

La commande ci-dessus exécutera la tâche de compilation. Considérez le résultat ci-dessous :

Commande Linux make

Effectuons quelques tâches supplémentaires sur notre makefile.

mettez à jour le Makefile comme suit :

 all: hello hello: main.o function1.o function2.o g++ main.o function1.o function2.o -o hello main.o: main.cpp g++ -c main.cpp function1.o: function1.cpp g++ -c function1.cpp function2.o: function2.cpp g++ -c function2.cpp clean: rm -rf *o hello 

À partir du makefile ci-dessus, nous avons créé trois objets comme main.o, function1.o et function2.o. De plus, nous avons fourni les dépendances pour les cibles main.o, function1.o et function2.o comme main.cpp, function1.cpp et function2.cpp respectivement. Toutes les cibles y effectueront les tâches spécifiées. Nous avons également spécifié une cible propre pour nettoyer toutes les dépendances et supprimer le fichier exécutable.

Exécutez maintenant la commande make all pour exécuter notre nouveau makefile.

 make all 

Considérez le résultat ci-dessous :

Commande Linux make

À partir de la sortie ci-dessus, nous pouvons voir que la commande a d'abord exécuté respectivement main.o, function1.o et function2.o. Il créera le fichier exécutable et objets des fichiers donnés. Il n'exécutera pas la cible propre car nous ne l'avons pas spécifiée dans hello. Considérez les fichiers ci-dessous :

Commande Linux make

La commande make a un processus de travail simple. Il a exécuté toutes les options et est allé bonjour. Après l'exécution de hello, il lit la cible dans l'ordre spécifié. Il a recherché chaque cible et ses dépendances et les a exécutés dans l'ordre.

Pour supprimer les objets et le fichier exécutable, effectuez la tâche de nettoyage. Pour effectuer la tâche de nettoyage, exécutez la commande comme suit :

 make clean 

Considérez le résultat ci-dessous :

Commande Linux make

La commande ci-dessus supprimera tous les objets et fichiers exécutables. Voir l'instantané ci-dessous du répertoire :

Commande Linux make

À partir de l'image ci-dessus, nous pouvons voir que nous avons nettoyé notre répertoire.

Variables dans la commande make

Nous pouvons définir les variables dans notre makefile. Pour définir les variables, utilisez le '=' opérateur. Par exemple, si nous voulons créer une variable A et lui attribuer une commande gcc, affectez-la comme :

fonction chr python
 A=g++ 

Utilisez-le comme suit dans notre makefile :

 hello: hello.cpp ${A} hello.cpp -o hello 

Il est transmis au terminal sous la forme :

 g++ hello.cpp -o hello 

Nous pouvons utiliser $(A) au lieu de ${A}, car les deux sont traités de la même manière par le script.

Commentaires dans le makefile

Pour ajouter un commentaire dans le makefile, utilisez le '#' symbole. Par exemple, pour ajouter un commentaire dans la section compilation, ajoutez-le comme '# Cela compilera le programme .' Les commentaires sont ignorés par le compilateur.