As a start I'd suggest to read "Shake before building".
Shake should work on Windows, given that Neil wrote a Windows progress bar tool for Shake.
For me, it is a killer feature -- any system where dependencies are maintained manually inevitably gets out of sync with the code. Some systems have special compiler hacks (like gcc's -MM flag), but you still have to find the magic option for each program you use, and link them into your compiler. That's also very hard to do in dynamic languages, where you don't know what libraries you have loaded until you've run the program.
I do use auto-generated/-detected deps for build time dependency graphs, but I didn't like how tup implements it.
And no, you don't have to write Unicode arrows. You write those things as ->. For some reason academic Haskell papers use Unicode symbols where real Haskell uses ASCII.
"Here's a Haskell library, go write your own build system in Haskell" is technically a solution to every build problem, but not a very practical one. Especially because Haskell libraries are themselves so hard to build on a fresh system!
cmake is "pretty good" about exposing policy flags to control compatibility.
Fedora EPEL6 has had to include two new cmake versions so far to be able to build more packages.
Also, I find it amusing that they claim Make's language is horrible, when they admit their replacement isn't shorter, I have to learn Haskell to use their system, and it looks like this (random snippet). No better than Make (in my opinion), and further I have to write unicode arrows?