Cara termudah untuk memahaminya adalah mengganti eval dengan info:
$(info $(call func, foo, 1.c))
Itu akan menampilkan sebagai output hasil ekspansi pertama, sehingga Anda dapat melihat make apa yang sebenarnya akan diuraikan. Anda tidak memberikan nilai untuk variabel OBJPATH, tetapi jika itu adalah obj
misalnya, dalam kasus Anda, perluasan pertama (dari fungsi panggilan) menghasilkan:
tmp = obj/foo
objs += $(tmp)
$(tmp) : 1.c
gcc $^ -o [email protected]
Kemudian make parser akan mengevaluasi ini, dan dalam prosesnya akan mengembangkannya lagi, jadi hal-hal seperti $(tmp)
diperluas.
Ini menjadi masalah bagi saya, tetapi saya menemukan solusi yang bagus. Dalam kasus saya, ini terkait dengan login buruh pelabuhan AWS. Saya memiliki skrip shell saya sebelumnya:
eval $(aws ecr get-login --region eu-west-1 --no-include-email --profile someprofile)
tetapi saat memasukkannya ke dalam Makefile
itu tidak berhasil. Solusi untuk ini adalah mengubah baris menjadi:
$$(aws ecr get-login --region eu-west-1 --no-include-email --profile someprofile)