Ce sont des double-points de règles dans un fichier Makefile?
Section 4.13 de la GNU Make manuel décrit les soi-disant double deux-points de règles:
Double deux-points de règles sont des règles écrites avec ‘::’ au lieu de ‘:’ après les noms de cible. Ils sont gérés différemment de règles ordinaires lorsque la même cible apparaît dans plus d'une règle.
Quand une cible apparaît dans de multiples règles, toutes les règles doivent être du même type: tous les ordinaires, ou tous à double deux-points. Si ils sont un double deux-points, chacun d'eux est indépendant des autres. Chaque double deux-points de la règle commandes sont exécutées si la cible est plus ancienne que toutes les conditions préalables de cette règle. Si il n'y a pas de conditions préalables pour que la règle, ses commandes sont toujours exécutées (même si la cible existe déjà). Cela peut entraîner l'exécution d'aucune, une ou la totalité de la double-virgule règles.
Double deux-points des règles avec le même objectif sont en fait complètement séparés l'un de l'autre. Chaque double-virgule règle est traitée individuellement, tout comme les règles avec des objectifs différents sont traités.
Le double deux-points de règles pour une cible sont exécutées dans l'ordre où ils apparaissent dans le fichier makefile. Cependant, les cas où la double-virgule règles de la logique sont ceux où l'ordre d'exécuter les commandes n'aurait pas d'importance.
Double deux-points de règles sont un peu obscures et pas souvent très utiles; ils fournissent un mécanisme pour les cas dans lesquels la méthode utilisée pour mettre à jour une cible diffère selon lequel les fichiers de configuration requise causé la mise à jour, et de tels cas sont rares.
Chaque double deux-points de la règle de spécifier des commandes; si ce n'est pas le cas, une règle implicite sera utilisé si l'on s'applique. Voir la section à l'Aide de Règles Implicites.
J'ai un peu grok le sens de chaque phrase de cette section individuellement, mais c'est toujours pas clair pour moi ce double deux-points des règles sont pour. Pour ce qui est rare, je n'ai pas encore vu de tout projet open source dont le Makefile n'a pas commencer avec
all::
Donc: Quel est le but d'un double deux-points des règles dans les Makefiles?
- L'une des raisons pour avoir
all::
à l'avant: Il faitall
la cible par défaut. Une alternative est d'utiliser.DEFAULT_GOAL = all
à l'avant, mais qui nécessite un système avec la version 3.81. Il y a beaucoup d'ordinateurs Unix dontmake
est GNU make âgés de plus de 3.81, ou quelque autre qui prend en charge deux points de règles.
Vous devez vous connecter pour publier un commentaire.
Chaque :: règle est traitée de manière indépendante, de sorte qu'il peut être plus simple. Par exemple, la règle unique:
peut être remplacé par deux règles plus simples:
Des utilitaires comme AutoMake ont un temps plus facile de cracher beaucoup de règles simples que quelques complexes.
Une grande réponse avec plus d'exemples a été posté, puis prendre vers le bas, puis a trouvé ici:
https://web.archive.org/web/20180122002430/http://owen.sj.ca.us/~rk/howto/slides/make/slides/makecolon.html
Grâce à la R. K. Owen pour l'écrire, et Edward Minnix pour trouver du nouveau!
Il y a 3 situations où les deux points sont utiles:
De l'échantillon .fichier c:
Makefile utilisé:
Résultat:
L'exemple suivant illustre cette situation: la un.fichier de configuration est obtenu à partir d'un.cfg, qui à son tour est obtenu à partir d'un.cfg1 (un.cfg étant le fichier intermédiaire).
Résultat (comme l' %.config règle est terminal, faire inhibe la création de l'intermédiaire une.cfg fichier à partir d'un.cfg1):
Sans le double deux-points pour l' %.config, le résultat est:
c@bureau:~/test/circle3$ cat Makefile
Résultat:
Ils sont à portée de main pour les non-récursive des fichiers makefile et des cibles comme les
clean
. C'est, d'une personne .mk fichier peut ajouter ses propres commandes à l'clean
cible déjà défini par ailleurs.La Documentation donne une réponse:
my-clean
prendra un nom et devront être faits .FAUX, à moins que le double-virgule règle est utilisée. Mise à jour de la réponse.Comme dit la documentation, un double deux-points de règles sont rarement très utile. Ils sont une belle façon peu de ne pas nommer les objectifs individuels d'un composite faux cible (comme tout::), mais pas vraiment nécessaire dans ce rôle. Je peux seulement un exemple artificiel où ils sont nécessaires:
Supposons que vous avez un fichier de log L est concaténée à partir de plusieurs autres journaux L1, L2, .... Vous formuler un certain nombre de double deux-points des règles comme:
Aujourd'hui dans GNU make, bien entendu, vous utilisez
$^
pour ce genre de magie, mais il est répertorié comme un inspiré fonctionnalité sur GNU make est la caractéristique de l'onglet.Je vais contribuer un exemple simple, nous l'espérons en faire l'usage clair:
Expérience avec le makefile suivant:
Exécuter
make a.faux
, il provoquedep1.fake
etdep2.fake
à exécuter. Supprimerdep1.fake
et exécutermake a.faux
de nouveau, seulementdep1.fake
sera exécuté.