5. CMake I would rather use Waf. CMake has its own, sloppy scripting language; writing anything moderately complex in it is an exercise in frustration. By contrast, Waf scripts can leverage all the mighty power of Python. Killer feature: since Waf stores a database of what was compiled, it support wildcards correctly. As in, when the set of files matched by a wildcard in the build script changes, it will automatically recompiles the correct files, without the need to modify build scripts. CMake cannot do this, because it just generates makefiles, and Make cannot support wildcards in this manner because it does not have any persistence beyond what is stored in the file system.