The makefile were never supposed to do more than determine which build tools to call (and how) for a given target. Meaning that in very many cases, makefile are abused to do way too much. I’d argue that you should try to keep your make targets only one line long. Anything bigger and you’re likely doing it wrong (and ought to move it in a shell script, that gets called from the makefile).
It is really challenging to write portable makefiles. There’s BSD make and GNU make, and then there are different tools on different systems. Different dependencies. Different libs. Etc. Not easy.
IMHO the issue is two folds: