Was bedeutet $$@ und das pipe-symbol im Makefile stehen?
In das folgende Makefile definition:
- Was bedeutet die
$$@
in der vorletzten Zeile stehen? - Was über die
|
symbol in der Mitte der Linie?
define KERNEL_RULE
$(DESTDIR)/$(1) : kernel_modules
$(DEST_DIR)/$(1) : $(DESTDIR)/$(1) | $(DEST_DIR)
cp $(DESTDIR)/$(1) $$@
endef
Du musst angemeldet sein, um einen Kommentar abzugeben.
(Sie haben einen beklagenswerten Wahl von Variablen-Namen; wir ändern
DESTDIR
zuSOURCE_DIR
und lassenDEST_DIR
allein.)Angenommen, Sie schreiben eine einfache Regel:
Funktioniert, aber die Redundanz ist lästig. Früher oder später werden Sie das ändern
$(DEST_DIR)/foo
im preq, aber vergessen, es zu ändern in der Regel. Und die Regel ist schwer zu Lesen. So haben wir eine automatische Variablen:Wenn diese Regel ausgeführt wird,
$@
wird erweitert, um den Namen des Ziel -,$(DEST_DIR)/foo
. (Wir können es noch besser als das, aber lasst uns dort.)Nun wollen wir sicherstellen, dass
$(DEST_DIR)
vorhanden ist, bevor diese Regel ausgeführt wird, aber wir wissen nicht wollen es eine Voraussetzung, genau, weil das fehlen dieses Verzeichnis sollte nicht genug, um die Ursache dieser Regel ausgeführt werden. Also machen wir es ein bestellen-einzige Voraussetzung:Nun wollen wir viele Regeln wie diese, für verschiedene Ziele, und anstatt das zu tun, es der intelligente Weg,, verwenden wir eine "Dosen-Rezept", eine Art Vorlage für die Erstellung von Regeln für das Fliegen.
Das problem ist, dass, wenn wir beurteilen diese definition
$@
erweitert werden, und da es nicht in der Regel noch nicht, es wird erweitert, um nichts. Also ändern wir es$$@
:Beim telefonieren diese definition
$$@
erweitert, um$@
dann, wenn es ausgeführt wird die Regel,$@
wird erweitert, um den Namen des Ziels.