Un fichier Make est-il fondamentalement la même chose qu’un fichier batch?

Je connais tout sur les fichiers de commandes et les ai créés auparavant, mais je ne sais pas ce qu’est un fichier Make Cela ressemble à un fichier de commandes. Quelles sont les similitudes et les différences?

Non. Un makefile a des règles spéciales qui indiquent comment les fichiers dépendent les uns des autres. Il ne s’exécute pas nécessairement dans l’ordre dans lequel il est écrit.

Un fichier de commandes est une séquence de commandes et d’instructions de contrôle.

Les makefiles contiennent souvent les mêmes choses que les fichiers de commandes, mais les fichiers de commandes ne permettent pas d’indiquer directement les dépendances ni de fournir une méthode supposée de traitement d’un type de fichier à un autre.

Similaire, oui, sauf pour les dépendances, le sorting topologique, le traitement des macros et le système expert

Si vous ne faites que mettre des commandes shell dans un Makefile, il ressemble en fait beaucoup à un catalogue de “fichiers de traitement par lots” et il les exécute chaque fois que sa cible nommée associée est spécifiée.

Cependant, il est plus courant de spécifier un graphe de dépendances dans un makefile, auquel cas make effectue un sorting topologique de toutes les dépendances afin de tout construire intelligemment une seule fois et dans le bon ordre, en commençant par les conditions préalables les plus anciennes.

Et pour être complet, je devrais append que make est aussi un processeur de macros. Il est orienté vers les systèmes de construction logicielle et fournit donc des informations sur les éléments symboliques de son domaine de problèmes, tels que les noms de sources et de cibles.

Maintenant, make n’est pas un système expert à usage général1, mais il fait plus que simplement empaqueter du shellcode et, techniquement, il correspond à la définition du système expert.

Make contient un moteur d’inférence . Toutes les versions de make ont des règles de suffixe , certaines versions implémentent également des règles de modèle . Lorsqu’il est combiné à vos spécifications (plus de règles, généralement celles définissant une application logicielle), vous obtenez un système expert qui décidera de ce qui doit être compilé, lié, acheté sur eBay , peu importe, en fonction des données et des commandes que vous avez fournies.


1. C’est un système expert facile à utiliser , à la place. Skynet ne sortira probablement pas d’une faute de frappe accidentelle dans un Makefile compliqué.

Pour donner une idée assez abstraite:

  • Les fichiers batch sont écrits dans un langage impératif.
  • Les makefiles sont écrits dans un langage déclaratif pour le traitement de fichier (destiné et généralement utilisé pour le contrôle de génération).

Les makefiles listent les commandes exécutées, mais leur structure est différente de celle d’une liste de commandes séquentielles. Au lieu de cela, ils ont des cibles et les commandes pour les «fabriquer». make vérifie ensuite les dépendances répertoriées et identifie les cibles à mettre à jour pour que vous puissiez le faire. Il existe de nombreuses règles implicites (étant donné qu’un fichier * .c sait déjà comment le comstackr en un * .o et même construire un exécutable!) Et des variables standard (par exemple, CFLAGS) afin que vous puissiez l’utiliser à votre avantage. Et, contrairement à la page de manuel, vous pouvez utiliser ces règles implicites sans Makefile .

La façon la plus simple d’y penser est que le fichier makefile indique comment créer un «A» à partir d’un «B», puis vous indiquez ce que vous voulez faire (par exemple, make all ) plutôt que la façon de le faire. Il détermine les étapes individuelles.

  • GNU fait référence

Pas du tout. Ils sont similaires en ce sens que tous les langages de programmation sont similaires (d’autant plus qu’ils sont tous les deux en script), mais ils ont des objectives très différents.

Le but de makefiles est de décrire comment construire un projet. Cela signifie généralement la création de règles (dans un langage spécial) qui disent des choses comme:

  1. chaque fois que vous voyez un fichier qui se termine par .c, exécutez le programme “gcc” dessus pour le comstackr dans un fichier object “.o”.
  2. chaque fois que vous avez un groupe de “.o”, reliez-les en un “.exe”.

Bien sûr, ceci est une description simpliste.

Le principal avantage de l’utilisation de make (“l’interpréteur” pour le langage Makefile) est que vous obtenez une syntaxe spécialement conçue pour ce genre de choses. Par exemple, make se charge généralement de vérifier, par exemple, si un fichier a été modifié, afin de ne pas comstackr un fichier ne contenant aucune modification.

Question très intéressante. Avec un script shell ou un fichier de commandes, vous fournissez à votre ordinateur une liste d’instructions à suivre dans l’ordre. Il commence en haut, continue jusqu’à la fin, puis s’arrête. OK, il peut y avoir des définitions de fonctions, des boucles et des gotos qui changent l’ordre exact dans lequel les choses se passent, mais en gros, la progression dans le fichier est linéaire.

Les Makefiles, en revanche, fournissent une série d’instructions sur la fabrication de certaines choses à partir d’autres choses. Lorsque vous appelez make , vous lui dites ce que vous voulez, il parsing les instructions dont il dispose et décide laquelle d’entre elles doit être exécutée afin de créer la cible spécifiée. En conséquence, ce qui se passe lorsque vous appelez un fichier makefile dépend non seulement du contenu du fichier, mais également de ce que vous lui avez demandé de créer et de l’état de vos fichiers à ce stade.

Deux approches différentes pour faire deux choses différentes.

Les Makefiles sont des données pour le programme Make. Pensez à eux comme à ce que les anciens faisaient avant XML: