Il modo più semplice per capirlo è sostituire eval con info:
$(info $(call func, foo, 1.c))
Ciò visualizzerà come output il risultato della prima espansione, in modo da poter vedere quale marca verrà effettivamente analizzata. Non hai fornito i valori per la variabile OBJPATH, ma se fosse obj
per esempio, allora nel tuo caso la prima espansione (della funzione di chiamata) risulta in:
tmp = obj/foo
objs += $(tmp)
$(tmp) : 1.c
gcc $^ -o [email protected]
Quindi il make parser lo valuterà e nel processo lo espanderà di nuovo, quindi cose come $(tmp)
sono espansi.
Questo è stato un problema per me, ma ho trovato una bella soluzione alternativa. Nel mio caso era correlato all'accesso docker AWS. In precedenza avevo nel mio script di shell:
eval $(aws ecr get-login --region eu-west-1 --no-include-email --profile someprofile)
ma quando lo metti in Makefile
non ha funzionato. La soluzione per questo è cambiare la linea in:
$$(aws ecr get-login --region eu-west-1 --no-include-email --profile someprofile)