Ce n' $$@ et le symbole de canal dans le Makefile stand for?
Dans le Makefile suivant définition:
- Ce qui ne l'
$$@
dans la dernière ligne de stand pour? - Ce sujet de la
|
symbole sur la ligne du milieu?
define KERNEL_RULE
$(DESTDIR)/$(1) : kernel_modules
$(DEST_DIR)/$(1) : $(DESTDIR)/$(1) | $(DEST_DIR)
cp $(DESTDIR)/$(1) $$@
endef
Vous devez vous connecter pour publier un commentaire.
(Vous avez une lamentable choix des noms de variables; nous allons changer
DESTDIR
àSOURCE_DIR
et laisserDEST_DIR
seul.)Supposons que vous écriviez une règle ordinaire:
Qui fonctionne, mais la redondance est très gênante. Tôt ou tard, vous allez changer
$(DEST_DIR)/foo
dans le preq mais oubliez pas de changement dans la règle. Et la règle est difficile à lire. Nous avons donc mis dans un variable automatique:Lorsque cette règle s'exécute,
$@
sera élargi pour le nom de la cible,$(DEST_DIR)/foo
. (Nous pouvons faire encore mieux que ça, mais arrêtons-nous là.)Maintenant, nous voulons faire en sorte que
$(DEST_DIR)
existe avant que cette règle s'exécute, mais nous n'avons pas voulez il être un préalable exactement, parce que l'absence de ce répertoire ne doit pas être suffisant pour causer de cette règle à exécuter. Nous avons donc faire un commande-le seul prérequis:Maintenant, nous voulons beaucoup de règles de ce genre, pour des cibles différentes, et au lieu de le faire la façon intelligente, nous allons utiliser un "en conserve recette", une sorte de modèle pour la création de règles à la volée.
Le problème est que lorsque nous évaluons cette définition,
$@
sera élargi, et comme il n'est pas une règle, il va développer pour rien. Nous avons donc changer de$$@
:Quand Faire des appels de cette définition,
$$@
étend à$@
, alors si/quand il exécute la règle,$@
permettra d'élargir le nom de la cible.