At it's core, it's really a mix of three things:
1. A language to define a dependency graph ("target: dependencies") and how the nodes are connected ("rules")
2. a functional scripting language to be able to factorize the declaration of the graph
3. and finally a graph traversal worker to dispatch and perform those rules that are required (including a sophisticated "job server" to maintain the concurrent job limit across child make processes with no developer intervention!)
I haven't encountered a good replacement tool that properly tackles all 3 of these feature sets. (Granted, I haven't done an in-depth analysis of the field...)