I'm not a big fan of Makefiles as entrypoints for a project.
- There's no way to pass command line arguments other than environment variables and there's no way to report per subcommand options
- There's no code reuse. If you have common functionality that you want to share (e.g. starting a dev db vs a test db) but with some parameters slightly different, there's no good way to do that in a Makefile
- The syntax is inscrutable. How do you run a shell command sending it a multi line command (for readability)? I tried for about an hour before giving up and writing an external shell script. MilMove has an entire directory of scripts for this reason. Even better, on MilMove those scripts call back out the the Makefile.
- Makefiles were needed for C/C++ because you recompiled individual files. There's even a command
$(CC) $(CFLAGS) -MM
that generates Makefile compatible syntax so that only necessary files are rebuilt. Modern languages don't work that way: they provide a single command that recompiles all n