## Distributing pkgsrc builds across different OSes You may want to use several machines to speed up your *pkgsrc* builds, but as those computers are not running NetBSD, you may think they are useless as build-helpers. This is where enters NetBSD's *cross-compiling* system in conjunction with [distcc](http://code.google.com/p/distcc/). ### A classic scenario GNU/Linux is a very common OS you probably have on your network, in this tutorial, we will focus on how to use a Debian GNU/Linux system as a *distcc* node, but this procedure can apply to almost any pkgsrc-supported platform. First things first, your GNU/Linux machine must have the following packages installed * gcc * g++ * zlib1g-dev * ncurses-base ### Building the cross-compiling chain Once done, download NetBSD's source tree. For example, if your target is a NetBSD 5.1.2 system # pwd /home/netbsd # cvs -d anoncvs@anoncvs.fr.netbsd.org:/cvsroot co -rnetbsd-5-1-2-RELEASE src We will then use the *build.sh* script in order to build the tools needed for cross-compiling # cd src # ./build.sh -m amd64 tools Do *not* use the *-u* flag, as we need to configure *nbcompat* for the tools to build correctly. Once finished, you should have a directory like tooldir.Linux-2.6.32-5-xen-amd64-x86_64 On the *src* directory. This is where the cross-compiling toolkit resides. ### Installing and configuring distcc It is mandatory to configure *distcc* so it uses our cross-comping tools to build binaries for another platform. On a Debian system, this is done in */etc/default/distcc* STARTDISTCC="true" # [...] # Allowed networks ALLOWEDNETS="127.0.0.1 192.168.0.0/24" # IP where distcc will listen LISTENER="192.168.0.7" ### # Here's the real trick, supersede $PATH so the firsts binaries # distcc will look for are NetBSD's ones ### PATH=/home/netbsd/src/tooldir.Linux-2.6.32-5-xen-amd64-x86_64/x86_64--netbsd/bin:$PATH After that, simply start *distcc* /etc/init.d/distcc start ### Testing the setup On a NetBSD machine located in *distcc*'s allowed network, add the following to */etc/mk.conf* PKGSRC_COMPILER=ccache distcc gcc MAKE_JOBS=4 DISTCC_HOSTS=192.168.0.7 localhost And fire up the *make* command in a *pkgsrc* subdirectory containing a C-based package. You should see something like this in helper's */var/log/distccd.log* file distccd[20634] (dcc_job_summary) client: 192.168.0.2:64006 COMPILE_OK exit:0 sig:0 core:0 ret:0 time:57ms gcc /usr/pkgsrc/misc/tmux/work/.ccache-cache/tmp/unvis.tmp.bulkor.18298.i distccd[20734] (dcc_job_summary) client: 192.168.0.2:64005 COMPILE_OK exit:0 sig:0 core:0 ret:0 time:172ms gcc /usr/pkgsrc/misc/tmux/work/.ccache-cache/tmp/imsg-buffe.tmp.bulkor.20945.i distccd[20586] (dcc_job_summary) client: 192.168.0.2:64004 COMPILE_OK exit:0 sig:0 core:0 ret:0 time:40ms gcc /usr/pkgsrc/misc/tmux/work/.ccache-cache/tmp/strtonum.tmp.bulkor.4879.i Of course, you may want to adjust the *MAKE_JOBS* according to the number of nodes your build-cluster has. ### pbulk and distcc If you intend to use distributed build while running [pbulk](http://wiki.netbsd.org/tutorials/pkgsrc/pbulk/), you **must** add the following to the */etc/mk.conf* of your *sandbox* .for DISTCCDEPS in devel/ccache sysutils/checkperms pkgtools/digest devel/distcc devel/popt devel/libtool-base lang/f2c devel/gmake . if ${PKGPATH} == ${DISTCCDEPS} IGNORE_DISTCC= yes IGNORE_CCACHE= yes . endif .endfor Or the scanning phase will end up with circular dependencies Cyclic dependency for package: ccache-3.1.4nb1 checkperms-1.11 digest-20111104 distcc-3.1nb1 popt-1.16nb1 libtool-base-2.2.6bnb5 f2c-20100903 ccache-3.1.4nb1 Enjoy your faster builds!