The TCWG has a build farm, with it's own Jenkins instance for toolchain builds and testing. It currently is comprised of 6 Proliant x86_64 machines for cross compilers, and a variety of ARM and AARCH64 build slaves.

There are two primary machines that run the TCWG build farm infrastructure. These are ( and (

The gateway machine runs our DNS and DHCP servers, as well s port forwards everything from our external IP address to the proper internal ones.

The abe machines runs all the services we require, as well as acts as the fileserver for Jenkins. The files are the log files and sum files from test runs, as well as any binary or source tarballs produced by our automation framework.

These services are Nagios, for monitoring all the machines, Jenkins for build and test automation, and LAVA for booting some of the target boards.


Jenkins is a continuous build system used by many companies, including ARM. It supports watching git repositories for changes, and then doing a build, as well as periodically. The TCWG instance of Jenkins is private, only TCWG members can access it, which keeps benchmarking results private as required by our license.

Accessing The TCWG Build Farm

There are several classes of build slaves, all are accessible via SSH.

Setting up a new slave

Every slave needs some setup to work with our Jenkins instance, and be able to do full toolchain builds. All slaves mostly have the same setup, with some changes primarily for external USB drives. To support build and test automation, certain directories need to exist.

The first thing required to setup a new build machine or slave is to add it to DNS and DHCP. We use static IPs.

First, add the new machines MAC address to /etc/dhcp/dhcpd.conf. Static IPs start at and go to for GCC slaves. LLVM slaves start at to Dynamic addresses should only be used for initial board bringup, and are in the range to An example board config is:

  • host juno-01 {
    • hardware ethernet 00:02:f7:00:59:3d; fixed-address;


Then add an entry for DNS. There are two files to edit, the primary one is /etc/bind/zones/tcwglab.db, which is used to return the proper IP number for the hostname. The other is /etc/bind/zones/tcwglab.db.rev, which is used occasionally to lookup the hostname based on the IP number. And example of the entry in tcwglab.db is:

  • apm-01 IN A

Then for reverse DNS lookup, add an entry to tcwglab.db.rev:

  • 20 IN PTR apm-01

Setup common to all Debian/Ubuntu builds hosts are:

sudo apt-get build-dep gcc gdb

sudo apt-get update && sudo apt-get install texinfo git-core build-essential openssh-server openjdk-6-jre-headless iptables flex bison autogen autoconf automake libtool dejagnu lsyncd gawk gcc-multilib g++-multilib libncurses5-dev lsb ccrypt nagios-nrpe-server sendmail git

The g++-multilib and gcc-multilib are only needed on the x86_64 build machines.

git-new-workdir is used by ABE to create branches of GIT repositories. It's part of GIT, but in contrib, so needs to be installed to work. The rest are needed to build a toolchain in all it's various configurations.

  • sudo cp /usr/share/doc/git/contrib/workdir/git-new-workdir /usr/local/bin/ && sudo chmod a+x /usr/local/bin/git-new-workdir

Jenkins uses what it calls node_selector for specifying the build host. So once you have new board doing full builds, then it needs to be added to Jenkins. If you go to the Dashboard page, you'll see list of nodes. Click on one. The upper right menu has a item to create a new node. Once on that page, choose to copy an existing node, almost any of the existing ones will do. Then click on the Advanced options if you need to change the tcp/ip port, which is common. You'll also need to add to the documentation field the name of the targets(s).

Remote Testing

To enable remote testing support, one must add a simple config file to be used by DejaGnu. These all live in Cbuildv2 in the config/boards subdirectory. Under this directory are other directories. DejaGnu uses the hostname of the build machine to have machine specific configuration data for each accessible target board.

A template for a board support file is:

load_generic_config tcwgcommon

set_board_info hostname apm-01

The only field that needs to be changed for an SSH accessible target is the hostname.

TCWG build farm (last modified 2014-11-16 21:17:19)