web-dev-qa-db-fra.com

Ordre de traitement des composants dans le makefile

Dans un makefile, la ligne de dépendance est de la forme -

abc: x y z

Les trois composants (x, y, z) sont eux-mêmes des cibles dans les lignes de dépendance plus bas dans le makefile.

Si make abc est invoqué, dans quel ordre les trois cibles x, y, z seront-elles exécutées?

38
Shailesh Tainwala

Par défaut, l'ordre d'exécution est le même que celui spécifié dans la liste des prérequis, sauf s'il existe des dépendances définies entre ces prérequis.

abc: x y z

La commande est x y z.

abc: x y z
y : z

La commande serait x z y.

Mais idéalement, vous devez concevoir vos Makefiles de manière à ce qu'ils ne dépendent pas de l'ordre dans lequel les conditions préalables sont spécifiées. Autrement dit, si y doit être exécuté après z, il doit y avoir un y : z dépendance.

Et gardez à l'esprit que GNU Make peut exécuter certaines recettes en parallèle, voir Réponse de Mat .

52
Eldar Abusalimov

Vous ne devriez vraiment pas dépendre de l'ordre dans lequel elles sont exécutées - toutes choses étant égales par ailleurs, les trois recettes de ces conditions préalables peuvent s'exécuter en parallèle.

La seule règle stricte est que toutes les conditions préalables doivent être remplies avant l'exécution de la recette cible.

S'il n'y a pas de dépendances entre x, y et z, et aucune exécution parallèle, GNU make semble les exécuter dans l'ordre vous les avez spécifiés, mais cela n'est pas garanti dans les documents.

39
Mat

La description POSIX de make comprend une justification qui dit:

Les utilitaires make dans la plupart des implémentations historiques traitent les prérequis d'une cible dans un ordre de gauche à droite, et le format makefile l'exige. Il prend en charge l'idiome standard utilisé dans de nombreux makefiles qui produisent des programmes yacc; par exemple:

foo: y.tab.o Lex.o main.o
     $(CC) $(CFLAGS) -o $@ t.tab.o Lex.o main.o

Dans cet exemple, si make a choisi un ordre arbitraire, le Lex.o Risque de ne pas être créé avec le bon y.tab.h. Bien qu'il puisse y avoir de meilleures façons d'exprimer cette relation, elle est largement utilisée historiquement. Les implémentations qui souhaitent mettre à jour les prérequis en parallèle doivent nécessiter une extension explicite à make ou au format makefile pour y parvenir, comme décrit précédemment.

( Je pense que la ligne t.tab.o Dans la ligne $(CC) est une faute de frappe pour y.tab.o, Mais c'est ce que la justification dit réellement. )

Ainsi, le comportement observé selon lequel les pré-requis sont traités de gauche à droite est validé ici, bien qu'il ne se trouve que dans la section Justification, pas dans la description principale. La justification mentionne également des problèmes avec make parallèle, etc.

18
Jonathan Leffler