マニュアルでは:
eval関数は非常に特殊です。定数ではない新しいmakefile構造を定義できます。これは、他の変数や関数を評価した結果です。eval関数の引数が展開され、その展開の結果がmakefile構文として解析されます。
eval引数が2回展開されることを理解することが重要です。最初にeval関数によって、次にその展開の結果がmakefile構文として解析されるときに再び展開されます。これは、evalを使用するときに、「$」文字に追加のレベルのエスケープを提供する必要がある場合があることを意味します。
「2回拡張」は私を混乱させます。
たとえば、makefileを作成します。
define func
tmp = $(OBJPATH)/$(strip $1)
objs += $$(tmp)
$$(tmp) : $2
gcc $$^ -o $$@
endef
all : foo
$(eval $(call func, foo, 1.c))
eval関数はどのように拡張されますか?