Build systemsJul 9, 2010 · 2 minute read · Comments
In the past weeks, I was looking at several build systems. As it turned out, there is not a single sane generic build system out there.
Autotools: Autotools are ugly, slow, and require an immense amount of code copies in the source tree.
WAF: WAF is not as ugly as autools and it’s faster and does not generate Makefiles or stuff like this. But it has serious issues: It requires one to copy it to the source tarball, has no stable API, and requires Python for building. Furthermore, support for unit testing is broken: It runs the unit tests, but does not abort the build process if the tests fail and does not display why the tests fail.
CMake: The syntax is ugly, it generates Makefiles, and support for pkg-config seems to be very very basic.
So how should a build system look like?
It should be installed in the system and not require code copies in the source tree (and thus no pre-build actions)
It should not generate Makefiles, but build the project itself.
It should not require more than a standard C library.
It should support pkg-config out of the box.
It should support SONAMEs for libraries.
It should detect dependencies on headers automatically.
It should support unit testing and abort if the tests fail.
It should not require developers to specify how to do things, only what to do.
So, why is there no sane build system?