About a year ago I wanted to jshint only files that have changed since the last run, and with Grunt I had to write custom code to do that. I used to be able to find my way through Makefiles in FreeBSD ports when I was a kid, so decided to try make.
With make incremental builds are very natural to do. Generally speaking make seems to be at exactly the level of abstraction needed to do what I generally understand as “build” tasks: run other programs, find specific files and do things on them, and express dependencies between tasks.
This thought inspired me to read its manual and I found that it has a pretty rich functionality, greatest of which is the close interaction with the shell. The latter makes it easy to delegate specialized tasks to specialized tools, which makes the whole interaction very UNIXy.
And now, the first thing that get into any new git repository is a Makefile and makefiles directory, and after one year of having picked make as my build tool, I don’t remember anything that would make me reconsider that. Long live make!