I'm a big fan of Ninja: it applies the philosophy of "do one thing and do it well" to build systems. It takes in a dependency graph and a list of build rules, and it builds stuff in parallel.
Like Make, you can use it to build a lot of different kinds of things, and it doesn't care what programming language you're using.
Unlike Make, it doesn't give you its own idiosyncratic, messy, easily-misused programming language for defining your dependency graph. The dependency graph is just an input that comes from somewhere else. You can make it in a reasonable programming language, or apparently now you can make it out of a Makefile using Kati.
Because it's not trying to support decades of Makefile hacks, Ninja can do things that would be dangerous to do in Make, such as a single build step that reads M files and writes N files without any extra locking or bookkeeping.
Like Make, you can use it to build a lot of different kinds of things, and it doesn't care what programming language you're using.
Unlike Make, it doesn't give you its own idiosyncratic, messy, easily-misused programming language for defining your dependency graph. The dependency graph is just an input that comes from somewhere else. You can make it in a reasonable programming language, or apparently now you can make it out of a Makefile using Kati.
Because it's not trying to support decades of Makefile hacks, Ninja can do things that would be dangerous to do in Make, such as a single build step that reads M files and writes N files without any extra locking or bookkeeping.