As I start to build out various projects, I recognize the need to start with a more modern build system than I have used in the past. I would like the system to have the ability to handle a variety of cross platform builds, including Linux (most important), Windows (should work), and mobile (should work when I get to it). Since continuous integration has become such an important part of modern software projects, there should also be a CI component that can work with the chosen build system.
Just to document, I am pretty good at using make to build things, and it is always available on systems, but it is pretty basic in many ways and requires me to do all the work. Essentially, it manages build dependencies but doesn’t provide much else for me.
I used scons most recently at work, but while it was convenient to extend scons using straight python, I had a lot of problems understanding what was doing what and debugging broken builds was often painful. Part of that may be due to the approach of the organization and how it extended almost every aspect of scons, but scons does not seem to make many “best” lists, so I suspect it may be inherent in the system. I’ve certainly read of a number of problems related to scaling scons, and I recall that many builds did indeed take “coffee” time to complete, meaning you could go grab a cup of coffee and make it back to your desk before the build completed. (I also like being terribly petty over the pedantry in the scons community that insists on it being pronounced “ess cons” rather than “skons”.)
There seem to be two main branches of modern build systems: one targeted mainly at Java and another one for everything else. The former seems to be dominated by ant , maven, and gradle, while the latter seems to be served mainly by CMake along with a variety of young systems like waf. I am not yet working too much with Java, so I will ignore those systems for the time being and concentrate on CMake, which seems to be very mature, is used by many projects, has recent commits to its source tree, and seems to handle complicated builds very nicely.
For CI, I will focus on jenkins, which seems to have become the de facto standard in the CI community. A quick search shows that plenty of places use cmake with jenkins via various plugins, so I also know the combo is viable.