Was sind Doppel-Doppelpunkt-Regeln in einem Makefile für?
Abschnitt 4.13 von GNU Make Handbuch beschreibt die so genannte Doppel-Doppelpunkt-Regeln:
Doppel-Doppelpunkt-Regeln sind Regeln geschrieben mit":: "anstelle von": "nach der target-Namen. Sie werden anders behandelt, von den gewöhnlichen Regeln, wenn Sie das gleiche Ziel wird in mehr als einer Regel.
Wenn ein Ziel angezeigt wird, in mehrere Regeln, alle Regeln müssen vom selben Typ sein: alle normalen, oder alle Doppel-Doppelpunkt. Wenn Sie doppelklicken, Doppelpunkt, jedes von Ihnen ist von den anderen unabhängig. Jeder doppelten-Doppelpunkt-Regel-Befehle, die ausgeführt werden, wenn das Ziel ist älter als alle Voraussetzungen von dieser Regel. Wenn es gibt keine Voraussetzungen für diese Regel, seine Befehle werden immer ausgeführt (auch wenn das Ziel bereits vorhanden ist). Dadurch kann es bei der Ausführung keine, alle, oder alle von der Doppel-Doppelpunkt-Regeln.
Doppel-Doppelpunkt-Regeln mit dem gleichen Ziel sind in der Tat völlig voneinander getrennt. Jeder doppelten-Doppelpunkt-Regel wird einzeln verarbeitet, genauso wie Regeln mit unterschiedlichen Zielen bearbeitet werden.
Den Doppel-Doppelpunkt-Regeln für ein Ziel ausgeführt werden, in der Reihenfolge erscheinen Sie in der Datei makefile. Jedoch die Fälle, in denen Doppel-Doppelpunkt-Regeln wirklich Sinn machen sind die, wo die Reihenfolge der Ausführung der Befehle keine Rolle.
Doppel-Doppelpunkt-Regeln sind etwas unklar und oft nicht sehr nützlich; Sie bieten einen Mechanismus für die Fälle, in denen die Methode verwendet, um die update-ein Ziel unterscheidet sich je nachdem, welche Voraussetzung Dateien verursacht das update, und solche Fälle sind selten.
Jeder doppelten-Doppelpunkt-Regel sollte Befehle angeben; wenn nicht, wird eine implizite Regel wird verwendet, wenn gilt. Siehe Abschnitt Verwendung der Impliziten Regeln.
Ich irgendwie verstehen die Bedeutung jedes Satzes in diesem Abschnitt individuell, aber es ist immer noch nicht klar ist mir, was Doppel-Doppelpunkt-Regeln sind für. Für den seltenen, habe ich noch nicht gesehen, alle open-source-Projekt, dessen Makefile habe nicht beginnen mit
all::
Daher: Was ist der Verwendungszweck der Doppel-Doppelpunkt-Regeln in Makefiles?
- Ein Grund dafür, dass
all::
vorne: Es machtall
Standard-Ziel. Eine alternative ist die Nutzung.DEFAULT_GOAL = all
vorne, aber das erfordert ein system mit version 3.81. Es gibt viele Unix-Computern, derenmake
ist entweder GNU make, die älter als 3.81, oder einige andere machen, das unterstützt die Doppel-Doppelpunkt-Regeln.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Jeder :: Regel unabhängig verarbeitet wird, so kann es einfacher sein. Zum Beispiel, die einzige Regel:
ersetzt werden kann, mit zwei einfacheren Regeln:
Tools wie AutoMake haben eine einfachere Zeit spuckt viele einfache Regeln als ein paar komplexen.
Eine Super Antwort, mit mehr Beispielen gepostet wurde, dann abgenommen, dann das hier gefunden:
https://web.archive.org/web/20180122002430/http://owen.sj.ca.us/~rk/howto/slides/make/slides/makecolon.html
Dank R. K. Owen für das schreiben es, und Edward Minnix die Suche wieder!
Gibt es 3 Situationen, in denen der doppelte Doppelpunkt nützlich sind:
Probe .c-Datei:
Makefile verwendet:
Ergebnis:
Folgende Beispiel erklärt die situation: die eine.config-Datei ist, die aus einem.cfg, die wiederum erhalten vom.cfg1 (ein.cfg wird die temporäre Datei).
Ergebnis (als %.config-Regel terminal, stellen Sie hemmt die Erstellung der zwischen-ein.cfg-Datei aus.cfg1):
Ohne Doppel-Doppelpunkt für die %.config, das Ergebnis ist:
c@desk:~/test/circle3$ cat Makefile
Ergebnis:
Sind praktisch für nicht-rekursive makefiles und Ziele, wie
clean
. Das heißt, ein Individuum .mk-Datei hinzufügen können Ihre eigenen Befehle, um dieclean
Ziel bereits definiert an anderer Stelle.Dokumentation gibt eine Antwort:
my-clean
nehmen Sie einen Namen und müssen gemacht werden .UNECHT sei denn, Doppel-Doppelpunkt-Regel verwendet. Aktualisiert die Antwort.Ebenso wie die Dokumentation sagt, Doppel-Doppelpunkt-Regeln sind selten sehr nützlich. Sie sind eine nette, kleine Art, nicht die Benennung der einzelnen Ziele einer zusammengesetzten falschen Gegner (wie alle::), aber nicht wirklich notwendig in dieser Rolle. Ich kann nur ein erfundenes Beispiel, wo Sie notwendig sind:
Angenommen, Sie haben eine Protokolldatei mit L, die verkettet ist, von mehreren anderen logfiles L1, L2, .... Sie formulieren eine Reihe von Doppel-Doppelpunkt-Regeln wie:
Heute noch in GNU-make, würden Sie natürlich verwenden
$^
für diese Art von Magie, aber es ist als eine inspirierte Funktion auf GNU make ist ein feature tab.Werde ich tragen ein einfaches Beispiel, um hoffentlich machen die Verwendung deutlich:
Experimentieren Sie mit dem folgenden makefile:
Laufen
make a.faux
es wird bewirkt, dassdep1.fake
unddep2.fake
zu laufen. Löschendep1.fake
und führenmake a.faux
wieder, nurdep1.fake
ausgeführt wird.