web-dev-qa-db-fra.com

Que signifie "tous" dans un fichier makefile?

J'ai lu quelques tutoriels concernant Makefiles mais pour moi, il est encore difficile de savoir ce que la cible "tout" représente et ce qu'elle fait.

Des idées?

93
Chris Smullian

Comme Makefile le comprend, une compilation consiste en un grand nombre de cibles. Par exemple, pour construire un projet, vous devrez peut-être

  1. Construisez fichier1.o sur fichier1.c
  2. Construisez file2.o sur file2.c
  3. Construisez file3.o sur file3.c
  4. Générez l'exécutable1 à partir des fichiers1.o et file3.o
  5. Construire l'exécutable2 à partir du fichier2.o

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

make file1.o

il ne ferait que construire ce fichier, si nécessaire.

Le nom de all n'est pas corrigé. C'est juste un nom conventionnel; all cible indique que si vous l'invoquez, make construira tout ce qui est nécessaire pour créer un build complet. 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, la construction all est nécessaire pour la construction des exécutables, les autres fichiers étant extraits en tant que dépendances. Donc, dans le makefile, cela ressemble à ceci:

all: executable1 executable2

all target est généralement le premier élément du makefile, car si vous écrivez simplement make en ligne de commande, sans spécifier la cible, la première cible sera construite. Et vous vous attendez à ce que ce soit all.

all est généralement aussi un .PHONY cible. En savoir plus ici .

104
P Shved

Le manuel pour GNU Make donne une définition claire de all dans son liste des cibles standard) .

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

  1. Compilez tout le programme, mais ne créez pas de documentation.
  2. Soyez la cible par défaut. Comme dans l'exécution seulement make devrait faire la même chose que make all.

Atteindre 1 all est généralement défini comme un .PHONY cible qui dépend du ou des exécutables constituant l’ensemble du programme:

.PHONY : all
all : executable

Pour atteindre 2 all devrait être la première cible définie dans le fichier make ou être assigné comme objectif par défaut:

.DEFAULT_GOAL := all
26
PeterSW

Pas sûr que cela représente quelque chose de spécial. Il s'agit simplement d'une convention selon laquelle vous fournissez une règle "tout", généralement utilisée pour répertorier toutes les sous-cibles nécessaires à la construction du projet dans son ensemble, d'où le nom "tout". La seule chose spéciale à cela est que souvent, les gens le placent comme première cible du fichier makefile, ce qui signifie que simplement taper "make" seul fera la même chose que "make all".

2
JustJeff

La cible "tous" est un exemple de cible factice - rien sur le disque ne s'appelle "tous". Cela signifie que lorsque vous faites un "make all", make pense toujours qu'il a besoin de le construire, et exécute ainsi toutes les commandes pour cette cible. Ces commandes sont généralement celles qui construisent tous les produits finaux que le makefile connaît, mais il peut tout faire.

Les autres exemples de cibles factices sont "clean" et "install", et ils fonctionnent de la même manière.

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

1
anon