La façon la plus simple de le comprendre est de remplacer eval par info :
$(info $(call func, foo, 1.c))
Cela affichera en sortie le résultat de la première expansion, afin que vous puissiez voir ce que make sera réellement analysé. Vous n'avez pas fourni les valeurs de la variable OBJPATH, mais si c'était obj
par exemple, dans votre cas, la première expansion (de la fonction d'appel) donne :
tmp = obj/foo
objs += $(tmp)
$(tmp) : 1.c
gcc $^ -o [email protected]
Ensuite, l'analyseur make évaluera cela, et dans le processus, il le développera à nouveau, donc des choses comme $(tmp)
sont développés.
Cela a été un problème pour moi, mais j'ai trouvé une bonne solution de contournement. Dans mon cas, cela était lié à la connexion au docker AWS. J'avais précédemment dans mon script shell :
eval $(aws ecr get-login --region eu-west-1 --no-include-email --profile someprofile)
mais en mettant cela dans Makefile
ça n'a pas marché. La solution de contournement consiste à modifier la ligne en :
$$(aws ecr get-login --region eu-west-1 --no-include-email --profile someprofile)