2009-07-10 15 views
2

GNU Make version 3.81 a introduit une variable spéciale nommée .DEFAULT_GOAL qui peut être utilisée pour indiquer à quel objectif (ou cible) doit être construit si aucune cible n'a été spécifiée sur la ligne de commande. Sinon, Make fera simplement la première cible rencontrée.Une règle cible vide est-elle un substitut viable pour .DEFAULT_GOAL dans GNU Make?

Tenir compte:

 
bar: a b c 
     ${MAKE_BAR_COMMANDS} 

foo: x y z 
     ${MAKE_FOO_COMMANDS} 

Avec le Makefile hypothétique ci-dessus, la course make construira "bar", parce qu'elle est la première cible qui font des rencontres. Mais si l'on ajoute .DEFAULT_GOAL, comme si ...

 
.DEFAULT_GOAL := foo # Build foo by default, even if it's not first. 

bar: a b c 
     ${MAKE_BAR_COMMANDS} 

foo: x y z 
     ${MAKE_FOO_COMMANDS} 

... puis faire (version 3.81) va construire "foo" si nous courons juste make.

J'ai trouvé cette variable .DEFAULT_GOAL très utile dans un "framework" Makefile modulaire et réutilisable que j'ai construit. Cependant, je trouve que de nombreux systèmes ont encore GNU Make 3.80 ou plus et ils ne supportent pas cette variable.

Tout en jouant avec les choses, je remarquai que spécifiant simplement une règle cible vide semble avoir le même effet que .DEFAULT_GOAL, même sur les versions pré-3.81 de GNU:

 
foo: # Empty target rule 

bar: a b c 
     ${MAKE_BAR_COMMANDS} 

foo: x y z 
     ${MAKE_FOO_COMMANDS} 

Je sais que ce est valide et légal pour s'ajouter aux règles et/ou aux prérequis de la cible en spécifiant des règles de cible supplémentaires de cette manière. Cependant, je me demande si cela pourrait introduire des effets secondaires potentiellement indésirables qui ne se produisent pas lors de l'utilisation de .DEFAULT_GOAL.

Je suppose que je me demande pourquoi .DEFAULT_GOAL a été introduit si vous pouvez obtenir la même chose avec une simple règle de cible vide. Cela me fait penser qu'ils n'ont peut-être pas exactement le même comportement que le . Donc, les questions de la ligne de fond sont: existe-t-il une différence détectable à l'extérieur entre l'utilisation de .DEFAULT_GOAL et une règle cible vide?

Répondre

2

Je ne peux pas vous donner une réponse définitive, mais je peux suggérer d'autres raisons de son introduction:

  1. Il est immédiatement évident que .DEFAULT_GOAL fait; c'est-à-dire ce qu'il y a sur l'étiquette. La présence et la signification d'une cible vide d'une seule ligne sont facilement masquées, en particulier dans un Makefile plus grand.
  2. Vous pouvez réellement lire la valeur de $(.DEFAULT_GOAL) de retour ailleurs dans le Makefile. Les tests suggèrent que cela ne fait aucune différence, que ce soit explicitement défini ou déterminé en choisissant la première règle.
2

Votre "règle de cible vide foo: #" est en conflit avec les règles du double-deux-points.

Si vous excluez ces règles (:: rules), cela ne fonctionne que s'il s'agit de la première règle. Donc, si vous "incluez clear-variables.mk" au début, et en général vous avez un réseau complexe de fichiers include, ce ".DEFAULT_GOAL" rendra évident & vérifié, qu'une seule règle peut être la règle par défaut.

Questions connexes