File:  [NetBSD Developer Wiki] / wikisrc / tutorials / pkgsrc / build_ccache_distcc.mdwn
Revision 1.3: download - view: text, annotated - select for diffs
Sun Nov 13 12:58:34 2011 UTC (8 years, 4 months ago) by imil
Branches: MAIN
CVS tags: HEAD
hide my IPs

    1: ## Speeding up pkgsrc builds with ccache and distcc
    2: 
    3: Building an important amount of packages with *pkgsrc* can take a very long time. Two helper softwares can speed up operations significantly: [ccache](http://ccache.samba.org/) and [distcc](http://code.google.com/p/distcc/).
    4: 
    5: ### ccache
    6: 
    7: From package's DESCR:
    8: 
    9: *ccache is a compiler cache. It acts as a caching pre-processor
   10: to C/C++ compilers, using the -E compiler switch and a hash to
   11: detect when a compilation can be satisfied from cache. This
   12: often results in a 5 to 10 times speedup in common compilations.*
   13: 
   14: Using *ccache* in *pkgsrc* is very simple, just add the following line to your */etc/mk.conf*:
   15: 
   16: 	PKGSRC_COMPILER=	ccache gcc
   17: 
   18: Declaring *ccache* as a compiler in *mk.conf* will make it a dependency for every package to be built.
   19: 
   20: ### distcc
   21: 
   22: From package's DESCR:
   23: 
   24: *distcc is a program to distribute compilation of C or C++ code across
   25: several machines on a network. distcc should always generate the same
   26: results as a local compile, is simple to install and use, and is often
   27: two or more times faster than a local compile.*
   28: 
   29: We will setup *distcc* with two hosts called hostA and hostB. First, install the software on both machines:
   30: 
   31: 	# cd /usr/pkgsrc/devel/distcc && make install clean
   32: 	# cp /usr/pkg/share/examples/rc.d/distccd /etc/rc.d
   33: 
   34: Configure some parameters in order to allow hostA and hostB to use each other's *distcc* instances. hostA's IP address is 192.168.1.1, hostB's IP address is 192.168.1.2:
   35: 
   36: 	hostA$ grep distcc /etc/rc.conf
   37: 	distccd=YES
   38: 	distccd_flags="--allow 192.168.1.0/24 --allow 127.0.0.1 --listen 192.168.1.1 --log-file=/home/distcc/distccd.log"
   39: 
   40: 	hostB$ grep distcc /etc/rc.conf
   41: 	distccd=YES
   42: 	distccd_flags="--allow 192.168.1.0/24 --allow 127.0.0.1 --listen 192.168.1.2 --log-file=/home/distcc/distccd.log"
   43: 
   44: Instead of sending logs to *syslog*, we will use a custom logfile located in *distcc*'s user home directory:
   45: 
   46: 	# mkdir /home/distcc && chown distcc /home/distcc
   47: 
   48: We can then fire up *distcc* on both hosts:
   49: 
   50: 	# /etc/rc.d/distccd start
   51: 
   52: In order to use hostnames instead of their IP addresses, add them to both */etc/hosts*:
   53: 
   54: 	# tail -2 /etc/hosts
   55: 	192.168.1.1	hostA
   56: 	192.168.1.2	hostB
   57: 
   58: And finally tell *pkgsrc* to use *distcc* along with *ccache* by adding these lines to */etc/mk.conf* on both machines:
   59: 
   60: 	PKGSRC_COMPILER=	ccache distcc gcc
   61: 	DISTCC_HOSTS=		hostA hostB
   62: 	MAKE_JOBS=		4
   63: 
   64: Here we define *MAKE_JOBS* to 4 because we are using two single-CPU hosts. The recommended value for *MAKE_JOBS* is *number of CPUs\*2* to avoid idle time.
   65: 
   66: ### Testing
   67: 
   68: To see *distcc* in action, simply watch the */home/distcc/distccd.log* file while you are building a package:
   69: 
   70: 	$ tail -f /home/distcc/distccd.log
   71: 	distccd[5218] (dcc_job_summary) client: 192.168.1.1:64865 COMPILE_OK exit:0 sig:0 core:0 ret:0 time:175ms gcc lockfile.c
   72: 	distccd[8292] (dcc_job_summary) client: 192.168.1.1:64864 COMPILE_OK exit:0 sig:0 core:0 ret:0 time:222ms gcc counters.c
   73: 	distccd[27779] (dcc_job_summary) client: 192.168.1.1:64881 COMPILE_OK exit:0 sig:0 core:0 ret:0 time:3009ms gcc ccache.c
   74: 	distccd[27779] (dcc_job_summary) client: 192.168.1.1:64863 COMPILE_OK exit:0 sig:0 core:0 ret:0 time:152ms gcc compopt.c

CVSweb for NetBSD wikisrc <wikimaster@NetBSD.org> software: FreeBSD-CVSweb