L'ordre de traitement des composants dans le makefile
Dans un makefile, la dépendance de la ligne est de la forme -
abc: x y z
L'ensemble des trois composantes (x,y,z) sont eux-mêmes des cibles dans la dépendance des lignes plus bas dans le fichier makefile.
Si faire abc est invoquée, dans quel ordre les trois objectifs de x,y,z être exécuté?
- double possible de Dans quel ordre les conditions préalables seront prises par le GNU make?
Vous devez vous connecter pour publier un commentaire.
Par défaut, l'ordre d'exécution est la même que celle spécifiée dans la liste de conditions préalables, à moins qu'il existe des dépendances entre ces préalables.
L'ordre est
x y z
.L'ordre serait
x z y
.Mais, idéalement, vous devez concevoir votre Makefile afin qu'il ne repose pas sur l'ordre dans lequel les conditions sont spécifiées. C'est, si
y
doit être exécuté aprèsz
, il y doit être uny : z
dépendance.Et de garder à l'esprit que GNU Make peut exécuter certaines recettes en parallèle, voir Tapis de réponse.
Vous vraiment ne doit pas dépendre de l'ordre dans lequel elles sont exécutées, toutes choses étant égales par ailleurs, tous les trois recettes pour ces conditions préalables pourrait s'exécuter en parallèle.
La seule règle est que toutes les conditions préalables doivent être remplies avant que la cible recette est exécuté.
Si il n'y a pas de dépendances entre
x
,y
etz
, et aucune exécution en parallèle, GNU make apparaît à les exécuter dans l'ordre que vous avez spécifié, mais ce n'est pas garanti dans les docs.+1
droit maintenant, mais je vais essayer de ne pas oublier de revenir voter jusqu'à demain.POSIX description de
make
comprend un raisonnement qui dit:(Je crois que le
t.tab.o
dans le$(CC)
ligne est une faute de frappe poury.tab.o
, mais qu'est ce que la logique dit en réalité.)Ainsi, le comportement observé que les pré-requis sont traitées à partir de la gauche vers la droite a de validation ici, si ce n'est que dans la section "Justification", pas dans la description. La Justification mentionne également des problèmes avec le parallèle
make
etc.make
emplois. IMO le choix de ne pas permettre l'exécution de toute commande sur les emplois parallèles était un faux-pas. par exemple je suis heureux pour mon.o
bjects être compilé dans n'importe quel ordre, mais j'ai besoin d'un tas d'autres choses à faire avant et après la compilation et la liaison respectivement, et c'est beaucoup plus difficile qu'elle ne devrait l'être....POSIX
cible particulière devrait être inclus dans le fichier makefile pour le signal qu'il doit se comporter d'une manière compatible avec la.De https://stackoverflow.com/a/22638294/636849, vous pouvez ajouter le symbole de canal:
foo: | bar baz
de ne pas appliquerbar baz
plus que sans le caractère pipe. Au lieu de cela, la pipe, dit à peu près "lors de la commande foo, bar et baz, un bar et baz doivent venir avant de foo, mais les mises à jour à la barre et baz ne sont pas une raison suffisante pour causer des foo être considérés comme des mises à jour et à besoin pour fonctionner". Docs sont sur gnu.org/software/make/manual/html_node/Prerequisite-Types.html et ne sont pas des plus claires.