これを理解する最も簡単な方法は、eval を info に置き換えることです:
$(info $(call func, foo, 1.c))
これにより、最初の展開の結果が出力として表示されるため、make が実際に解析する内容を確認できます。 OBJPATH 変数の値を指定していませんが、obj
の場合 たとえば、あなたの場合、(呼び出し関数の) 最初の展開は次のようになります:
tmp = obj/foo
objs += $(tmp)
$(tmp) : 1.c
gcc $^ -o [email protected]
次に、make パーサーがこれを評価し、その過程で再び展開します。つまり、$(tmp)
のようになります。
これは私にとって問題でしたが、良い回避策を見つけました。私の場合は、AWS docker login に関連していました。以前のシェル スクリプトには次のものがありました:
eval $(aws ecr get-login --region eu-west-1 --no-include-email --profile someprofile)
しかし、それを Makefile
に入れると うまくいきませんでした。これを回避するには、行を次のように変更します:
$$(aws ecr get-login --region eu-west-1 --no-include-email --profile someprofile)