distcc with CMake/QMake to speed-up your builds

Reading time ~4 minutes

Sometimes smart ideas takes time. But maybe using distcc from now on will catch up some of the lost time. It’s a bit embarrassing that it took me one year before I thought about setting up distcc, even though I perfectly new what it was!

I’ve been working from home the last year due to Covid-19. I also have a Linux-server in the basement - just because it’s fun. I use that server more or less for nothing. But it still fun to have - for nothing. Then the other day it just came to me.

Why not use that server to speed-up my builds!

So here is some tips/thoughts/instructions on how to let distcc speed-up your builds. And I can tell you right now - you gain speed!

distcc

If you look at distcc:s Github page you can read.

distcc is a program to distribute compilation of C or C++ code across several machines on a network. distcc should always generate the same results as a local compile, is simple to install and use, and is often two or more times faster than a local compile.

And that’s more or less it! distcc will distribute you build jobs on to other computers. You simply run distcc like this:

$ distcc gcc -c foo.c

In the last part of this post I will go through a bit more in detail how to integrate distcc into a project. The above is just a simple example.

When distcc runs it will automatically send over the data the build-node need. Nothing (except compilers) needs to be installed on the other machines. No source files or object files are needed or will be stored on the other machines. Since distcc uses the network for all this it’s nice to have a network with pretty good speed. But even a WiFi works.

distcc on your machine and servers

Installation

You need to install distcc both on your development machine and the servers you plan to use for building. If you use Ubuntu it’s as simple as:

$ sudo apt install distcc

Configure distcc

When reading about distcc there are two ways of configuring it. The old way or what is called zeroconf. We will go with the new (from around 2007 :) ). When using zeroconf distcc will use mDNS (using Avahi) to automatically detect different computers/nodes to use for building. You also need to configure which network interfaces distcc shall listen to.

Below is my configuration on my server (/etc/default/distcc)

STARTDISTCC="true"
ALLOWEDNETS="192.168.1.0/24"
LISTENER="192.168.1.200"
NICE="10"
JOBS="10"
ZEROCONF="true"
  • STARTDISTCC - Will make sure to start distcc at boot.
  • ALLOWEDNETS - Specifies which IP-addresses are allowed to connect. In this case any one on the net 192.168.1.x.
  • LISTENER - Which network interface to listen do connections.
  • JOBS - Number of jobs to run in parallel,
  • ZEROCONF - Set to true to use mDNS.

That’s more or less it!

Test your setup

To test your setup simply run:

$ distcc --show-hosts
127.0.0.1:3632/14
192.168.1.200:3632/10

The above example show that three nodes/machines are available. My laptop (127.0.0.1) and my server (192.168.1.200).

Compilers

You need to have the same compilers installed across you build machines. So in my case I have GCC 9.3 installed on both my laptop (development machine) and on my server.

Cross-compilation with distcc is possible, but that will be another post.

Build monitors

There are a number of different monitors one can use to monitor to build status. distccmon-text is a really simple text based version, distccmon-gnome is a GUI based monitor that will display all your builds. When compiling

Setup you project to use distcc

In the beginning of this post I showed how to run distcc. But here I will go into more depth when using distcc with QMake and CMake.

One tip that can speed up your builds even more is to use ccache. Read more about ccache here. In the examples below I will integrate ccache with distcc.

CMake

In CMake there is something called “compiler launcher”. This can be used to tell CMake to run a program to launch a compiler. The nice thing is that you also can specify multiple launcher. So to enable distcc and ccache whit CMake simply:

$ cmake -DCMAKE_C_COMPILER_LAUNCHER="ccache;distcc" -DCMAKE_CXX_COMPILER_LAUNCHER="ccache;distcc" ..

In this example we enable both ccache and distcc.

QMake

I’ve not spent to much time investigating QMake and distcc. The best options a found is to pass some extra arguments to make.

CXX="ccache distcc g++" CC="ccache distcc gcc"

In QtCreator you do this under “Build Settings” -> “Build steps” -> “Make” -> “Make arguments”.

There might be a better solution, let me know in the comments below!

Running at work and at home

Since distcc uses mDNS to find the build nodes to use you can have one setup at home and a much bigger setup at your office. For example, to speed up all my colleges build times we could hava a bunch of machines ready with distcc. When I need to compile my machine will use mDNS to find the nodes. When at work it will find may machines, when at home it will find one node and lastly when offline it will just use my computer. Thanks to this zeroconf in distcc it will work completely transparent.

Scoped enum:s together with bit flags/patterns

Use scoped enums to get better type safety, but this will show you how to handle the logic operations. Continue reading

Transforming singletons into something testable

Published on September 21, 2021

Flutter on embedded - Sneak Peek

Published on January 08, 2021