I decided to go for the first option: without emacsclient.
To be more precise I now use:
emacs --batch --eval "(my-emacs-defun)"
In my Makefile it looks like this:
sometarget:
@emacs --batch --eval "$${elisp_code}"
define elisp_code
(require 'something)
(my-emacs-defun)
endif
This also seems to be fast.