Buildyard – C++ source project management

The Problem

The Equalizer source code always was modularized, but did build everything into a single shared library for convenience. Lately new projects, e.g., dash/codash, required functionality from what was called eq::base. This lead to Lunchbox, which you should know by now.

Managing the development of multiple, source dependent projects is a pain. You’ve got to download them, configure, build and install them in the right order. There are solutions for this in the Java world, but the ones I found for C/C++ were either in limbo (ryppl) or are more for source-based distribution, but not that easy for developers (0install).

Our Solution

After some tinkering we came up with Buildyard, a CMake-based meta build system. It builds on top of the ExternalProject CMake module, which is good but requires quite some customization when used. We’ve simplified this further, and adding a new CMake-based project is a couple of lines in a configuration file, e.g.:

set(EQUALIZER_VERSION 1.3.1)                                                     
set(EQUALIZER_DEPENDS gpu-sd Boost hwloc vmmlib Lunchbox GLStats)                
set(EQUALIZER_ROOT_VAR EQ_ROOT)                                                  
set(EQUALIZER_REPO_TAG master)                                                   

Creating this simple configuration files allows you to build a project such as Equalizer, and all it’s dependencies, much easier. You simply clone Buildyard and use make Equalizer in the cloned directory. This will first configure Buildyard to resolve the dependencies, download the ones not installed yet, and then configure/build/install them in the correct order into a local installation directory. This even works with parallel builds.

The development process is largely unchanged as well. Simple go to src/project, code and compile away. Buildyard will inject a Makefile into each project source which sets up the proper targets for building. When compiling in a source directory, other project dependencies are not considered by default to get speedy compiles.

The whole thing is easily extendable. Internally we’ve got a config.bbp repository for the closed-source project configurations, which build on to of the open source ones pre-configured with Buildyard. Developers clone that into the Buildyard directory, where it will be picked up on the next CMake run.

This post just scratches the surface, have a look at the Readme for more details and post questions below. While it’s not as sophisticated as ryppl, it works and we use it daily already in quite a number of projects. It also facilitates creating new projects a lot, such as dash, codash, Lunchbox and GLStats.


Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: