Définition de fonctions de création GNU personnalisées
Quel est le problème avec le dep2 fonction dans l'exemple de code ci-dessous?
dep1 = $(eval makefile_list_$1 := $(MAKEFILE_LIST))$(eval -include $1.mk)$(eval MAKEFILE_LIST := $(makefile_list_$1))
define dep2
$(eval makefile_list_$1 := $(MAKEFILE_LIST))
$(eval -include $1.mk)
$(eval MAKEFILE_LIST := $(makefile_list_$1))
endef
$(call dep1,test)
$(call dep2,test)
.DEFAULT_TARGET: all
.PHONY: all
all:
@echo $@
GNU make 3,81 et 3.82 produire Makefile:10: *** missing separator. Stop.
qui pointe vers le dep2 appel, dep1 est exécuté sans erreur. La seule différence entre les deux variantes est les retours à la ligne dans dep2 (et le point pourquoi j'aimerais à définir).
source d'informationauteur g.b.
Vous devez vous connecter pour publier un commentaire.
Vous avez oublié le
=
:définir dep2 =
EDIT:
Mettre un point-virgule à la fin de chaque ligne. Je l'ai testé et ça marche (en GNUMake 3.81).
Pourquoi ces points-virgules sont nécessaires, je ne sais pas, mais dans la documentation
define
semble être utilisé pour le multi-ligne "variables" uniquement lors de la définition des séquences de commandes shell à être utilisé dans des recettes, de ne pas Faire les commandes, donc peut-être que les règles sont un peu différentes.Je voudrais déplacer le
$(eval ...)
appels de l'extérieur dudep2
. En le faisant de cette manière, il n'y a aucun besoin pour les points-virgules dansdep2
. Cela signifie un doublement de la$
signes de certains travaux d'agrandissement pour éviter l'expansion été fait trop tôt. Donc:J'ai testé le code ci-dessus et il fonctionne avec Gnu Make 4.0. Je m'attends à ce qu'il fonctionne en arrière pour Gnu 3.8. x. Le
$(eval $(call ...))
motif est ce que je fais toujours à l'exécution de mes fonctions personnalisées, et je l'ai utilisé pour un certain temps maintenant.Vous pouvez faire que la ligne ci-dessous pour tuer l'erreur:
Je suppose que la raison en est la première version de gcc (3.8.1/2) ne peuvent accepter que rien que le retour de l'expression.
par exemple
$(info string)
ne retourne rien, mais$(call dep2, test)
renvoie 2 retours à la ligne charaters.Il ya beaucoup qui peut être amélioré dans ce que vous faites. Pour une chose que vous voulez vraiment de tenir compte de l'évaluation des appels à un seul appel à la top.
Votre problème particulier, cependant, découle de la compréhension que le multiligne récursive de la chaîne de le faire est de définir commande utilise jamais inclut la dame à la ligne. Les plus naturelles de la convention pour l'écriture evalable fonctions est
définir Foo
Line1
Line2
endef
Vous pouvez regarder la chaîne eval, c'est de voir et de voir ce que cela fait via la commande info, par exemple
$(info $(appel Foo,x) $(appel Foo,y)).