Est-ce une règle cible vide un substitut viable pour .DEFAULT_GOAL dans GNU Make?

StackOverflow https://stackoverflow.com/questions/1111344

  •  12-09-2019
  •  | 
  •  

Question

GNU make version 3.81 introduit une variable spéciale nommée .DEFAULT_GOAL qui peut être utilisé pour indiquer Assurez quel but (ou cible) devrait être construit si aucune cible n'a été spécifié sur la ligne de commande. Sinon, faire se bornera à faire la première cible rencontre.

Considérez:

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 on tourne en make.

J'ai trouvé cette variable .DEFAULT_GOAL être très utile dans un système modulaire, Makefile réutilisable « cadre » que je l'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.

Alors que jouer avec les choses, j'ai remarqué 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 Make:

foo:    # Empty target rule

bar: a b c
        ${MAKE_BAR_COMMANDS}

foo: x y z
        ${MAKE_FOO_COMMANDS}

Je sais qu'il est valide et légal d'ajouter aux règles d'une cible et / ou en spécifiant les règles Prérequis cibles supplémentaires de cette manière. Cependant, je me demande si cela cela pourrait introduire des effets potentiellement indésirables effets secondaires qui ne se produisent pas lorsque vous utilisez .DEFAULT_GOAL.

Je suppose que je suis à me demander pourquoi .DEFAULT_GOAL a été introduit si vous pouvez obtenir la même chose avec une règle simple cible vide. Cela me fait soupçonner que peut-être qu'ils ne donnent pas lieu à exactement le même comportement.

Ainsi, les questions de fond du problème est: est-il une différence entre l'utilisation externe détectable .DEFAULT_GOAL par rapport à une règle cible vide

Était-ce utile?

La solution

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; à savoir ce qu'il dit sur l'étiquette. La présence et le sens d'une cible vide unique en ligne est facilement passé sous silence, surtout dans un Makefile plus
  2. Vous pouvez lire réellement revenir ailleurs dans le Makefile la valeur de $(.DEFAULT_GOAL). Test donne à penser qu'il ne fait aucune différence que ce soit explicitement définie, ou si elle est déterminée en choisissant la première règle.

Autres conseils

Vos.: Les conflits avec les règles double du côlon "foo # vide règle cible"

Si vous excluez les out (:: règles), il ne fonctionne que si elle est la première règle. Donc, si vous « inclure clear-variables.mk » au début, et en général un filet complexe d'inclure des fichiers, ce ".DEFAULT_GOAL" il sera évident et coché , que seulement 1 règle peut être par défaut.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top