La forma más fácil de entenderlo es reemplazar la evaluación con información:
$(info $(call func, foo, 1.c))
Eso mostrará como salida el resultado de la primera expansión, para que pueda ver qué marca realmente analizará. No proporcionó los valores para la variable OBJPATH, pero si fuera obj
por ejemplo, en su caso, la primera expansión (de la función de llamada) da como resultado:
tmp = obj/foo
objs += $(tmp)
$(tmp) : 1.c
gcc $^ -o [email protected]
Luego, el analizador make evaluará esto y, en el proceso, lo expandirá nuevamente, por lo que cosas como $(tmp)
se expanden.
Esto ha sido un problema para mí, pero encontré una buena solución. En mi caso, estaba relacionado con el inicio de sesión de AWS Docker. Tenía en mi script de shell anteriormente:
eval $(aws ecr get-login --region eu-west-1 --no-include-email --profile someprofile)
pero al poner eso en Makefile
no funcionó La solución para esto es cambiar la línea a:
$$(aws ecr get-login --region eu-west-1 --no-include-email --profile someprofile)