Que signifie «tout» dans un fichier makefile?

105

J'ai lu quelques tutoriels concernant Makefiles mais pour moi, on ne sait toujours pas ce que signifie la cible «tout» et ce qu'elle fait.

Des idées?

Chris Smullian
la source

Réponses:

116

Une construction, telle que Makefile le comprend, se compose de nombreuses cibles. Par exemple, pour créer un projet, vous pourriez avoir besoin

  1. Construisez file1.o à partir de file1.c
  2. Construisez file2.o à partir de file2.c
  3. Construisez file3.o à partir de file3.c
  4. Construisez l'exécutable1 à partir de file1.o et file3.o
  5. Construisez l'exécutable2 à partir de file2.o

Si vous avez implémenté ce flux de travail avec makefile, vous pouvez créer chacune des cibles séparément. Par exemple, si vous avez écrit

make file1.o

il ne construirait ce fichier que si nécessaire.

Le nom de alln'est pas fixe. C'est juste un nom conventionnel; alltarget indique que si vous l'invoquez, make construira tout ce qui est nécessaire pour faire une compilation complète . Il s'agit généralement d'une cible factice, qui ne crée aucun fichier, mais dépend simplement des autres fichiers. Pour l'exemple ci-dessus, construire tout ce qui est nécessaire consiste à construire des exécutables, les autres fichiers étant extraits en tant que dépendances. Donc, dans le makefile, cela ressemble à ceci:

all: executable1 executable2

alltarget est généralement le premier dans le makefile, car si vous écrivez simplement makeen ligne de commande, sans spécifier la cible, il construira la première cible. Et vous vous attendez à ce que ce soit le cas all.

allest généralement aussi une .PHONYcible. Apprenez-en plus ici .

P Shved
la source
31

Le manuel de GNU Make en donne une définition claire alldans sa liste de cibles standard .

Si l'auteur du Makefile suit cette convention, la cible alldoit:

  1. Compilez le programme entier, mais ne compilez pas la documentation.
  2. Soyez la cible par défaut. Comme en cours d'exécution makedevrait faire la même chose que make all.

Atteindre 1 allest généralement défini comme une .PHONYcible qui dépend du ou des exécutables qui forment l'ensemble du programme:

.PHONY : all
all : executable

Pour atteindre 2, il allfaut soit être la première cible définie dans le fichier make, soit être assigné comme objectif par défaut:

.DEFAULT_GOAL := all
PeterSW
la source
3

Pas sûr que cela représente quelque chose de spécial. C'est juste une convention que vous fournissez une règle «tous», et généralement elle est utilisée pour lister toutes les sous-cibles nécessaires pour construire le projet entier, d'où le nom «tous». La seule chose spéciale à ce sujet est que souvent les gens le placent comme première cible dans le fichier makefile, ce qui signifie que le simple fait de taper «make» seul fera la même chose que «make all».

JustJeff
la source
2

La cible «tout» est un exemple de cible factice - il n'y a rien sur le disque appelé «tout». Cela signifie que lorsque vous faites un "make all", make pense toujours qu'il a besoin de le construire, et donc exécute toutes les commandes pour cette cible. Ces commandes seront généralement celles qui construisent tous les produits finaux que le makefile connaît, mais il pourrait faire n'importe quoi.

D'autres exemples de cibles factices sont «nettoyer» et «installer», et ils fonctionnent de la même manière.

Si vous ne l'avez pas encore lu, vous devriez lire le manuel GNU Make , qui est également un excellent tutoriel.


la source