As ugly as things like Maven and Gradle are, if you follow all of their conventions they get out of your way.
In addition:
- no cross-platform way to require a compiler version or way to set compiler flags
- linkers are not abstracted from you (good luck trying to get cross-platform support for relocatable binaries; cmake really bungles up rpath etc)
- also good luck trying to link both static and dynamic libraries and targets
- third-party libraries aren't really a first-class thing
- no simple way to specify "build all these things into the target directory with a conventional file layout"
80% of projects need to deal with these and not a lot else. Why is there not a list of "follow these conventions and you don't really need to write or look at cmake file"?
(To be fair: compilers, linkers, and OSes share some blame in not being more consistent but the goal of a competent build-system is to handle these things for the 80% case.)
It doesn't really matter how terrible the syntax and internal implementation are if most reasonable use-cases don't need to look at it.