The first argument to the call function is expanded and the expansion is
treated as the name of a variable to be used as the user-defined
function. The remaining arguments are used to replace $1, $2, etc.
In your case, where you write $(call $(out_template 1.c)), make
evaluates the reference $(out_template 1.c); since there's no variable
by that name it evaluates to empty, which means you're invoking $(eval )
(on the empty string) and nothing is being defined.
If you replace $(eval ...) with $(info ...) you'll see what make is
evaluating; that can be a useful debugging tool. Running make with
--warn-undefined-variables would have also helped, but note that gives a
lot of false positives as well.