PDA

View Full Version : HOWTO: FreeBSD with CCACHE


vermaden
05-05-2008, 11:42 AM
install ccache port or add a package:
# cd /usr/ports/devel/ccache && make install clean
# pkg_add -r ccache

add the following to /etc/make.conf:
CC=/usr/local/libexec/ccache/world-cc
CXX=/usr/local/libexec/ccache/world-c++

add the following to /.cshrc:
# set ccache varibles
setenv PATH /usr/local/libexec/ccache:$PATH
setenv CCACHE_PATH /usr/bin:/usr/local/bin
setenv CCACHE_DIR /var/tmp/ccache
setenv CCACHE_LOGFILE /var/log/ccache.log

# set ccache temp size to 512MB (default 1GB)
if ( -x /usr/local/bin/ccache ) then
/usr/local/bin/ccache -M 512m > /dev/null
endif

logout and login again before using ccache because when You dont ccache will use /root/.ccache dir instead of /var/tmp/ccache.

ccache can be shared between several computers the same as ports tree for example, check man ccache for more info.

ADDED 2007.2.15:
example ccache stats from my box.
% ccache -s
cache directory /var/tmp/ccache
cache hit 18562
cache miss 102820
called for link 9824
multiple source files 75
compile failed 1610
preprocessor error 1446
not a C/C++ file 3747
autoconf compile/link 16982
unsupported compiler option 511
no input file 6698
files in cache 49631
cache size 464.3 Mbytes
max cache size 512.0 Mbytes

ADDED 2007.2.16:
comparasion of buildworld times with and without ccache:
# without ccache
make -j1 buildworld 4148.38s user 937.02s system 97% cpu 1:27:00.40 total

# with ccache
make -j1 buildworld 1043.30s user 703.76s system 88% cpu 32:50.02 total

If you face a problem with /root/.ccache being used instead of /var/tmp/ccache then you may solve it that way:

% cd /home/${USER}
% rm -rf .ccache
% ln -s /var/tmp/ccache .ccache
% ls -l .ccache
lrwxr-xr-x 1 ${USER} ${USER} 15 Dec 19 15:20 .ccache -> /var/tmp/ccache
% ccache -s
cache directory /var/tmp/ccache
cache hit 165292
cache miss 327142
called for link 38002
multiple source files 216
compile failed 5182
preprocessor error 4934
couldn't find the compiler 1
not a C/C++ file 26249
autoconf compile/link 52665
unsupported compiler option 1379
no input file 23289
files in cache 79438
cache size 530.2 Mbytes
max cache size 512.0 Mbytes
% sudo ccache -s
cache directory /home/vermaden/.ccache
cache hit 165292
cache miss 327142
called for link 38002
multiple source files 216
compile failed 5182
preprocessor error 4934
couldn't find the compiler 1
not a C/C++ file 26249
autoconf compile/link 52665
unsupported compiler option 1379
no input file 23289
files in cache 79438
cache size 530.2 Mbytes
max cache size 512.0 Mbytes

Starhost
05-27-2008, 03:29 PM
Can someone explain to me what ccache is and what it does on a system? And also why it isn't the default when it can speed up building that fast?

Carpetsmoker
05-27-2008, 04:11 PM
[~]# cat /ports/devel/ccache/pkg-descr
ccache is a compiler cache. It acts as a caching pre-processor to C/C++
compilers, using the -E compiler switch and a hash to detect when a
compilation can be satisfied from cache. This often results in a 5 to 10
times speedup in common compilations.

WWW: http://ccache.samba.org/

So, it's just a cache, it doesn't speed up compilation the first time (It may in fact slow it a bit).

Oliver_H
05-29-2008, 08:25 PM
And sometimes you have to build without ccache, but most of the time you'll be fine and speed up compilation at least while updating the next time. Building kernel and world with ccache and a dualcore is just the best you can get in performance :)

ohauer
06-19-2008, 09:15 PM
I have this lines in my /etc/make.conf to control ccache.
If build with ccache is not working I use make -DNOCACHE



.if ${.CURDIR:M*/devel/ccache}
NOCACHE=1
.endif

.if !defined(NOCACHE)
CC=/usr/local/libexec/ccache/world-cc
CCX=/usr/local/libexec/ccache/world-cc++
.endif

Carpetsmoker
06-19-2008, 10:03 PM
Yes, some ports seem to fail with ccache ... See:
http://www.nabble.com/Re%3A-Standardize-NO_CCACHE-flag-and-ccache-definitions-p17992614.html

vermaden
06-20-2008, 08:44 AM
True, I just tested them and they fail with ccache, but there is bery simple sollution for them. for every port that fails you may add something like that to /etc/make.conf as ohauer suggested:

.if !defined(NO_CACHE)
CC= /usr/local/libexec/ccache/world-cc
CCX= /usr/local/libexec/ccache/world-cc++
.endif

.if ${.CURDIR:M*/ports/games/freera}
NO_CCACHE= yes
.endif

And you are done with that one.

You may even do something like that if you feel more comfortable:

CCACHE_DISABLED+= games/freera \
graphics/gsculpt \
devel/ccache

.for PORT in ${CCACHE_DISABLED}
.if ${.CURDIR:M*/ports/$(PORT)}
NO_CCACHE= yes
.endif
.endfor

ninjatux
07-09-2008, 06:46 PM
Geany doesn't build with ccache either, so I used the solutions listed above, although I'm not exactly sure what the benefits to ccache are. I haven't really seen any massive speed ups in recompilation. I think the biggest speed up will come with better parallel support in ports.

vermaden
07-09-2008, 06:54 PM
Geany doesn't build with ccache either
Strange, I have never had any issues with Geany compilation using ccache, to be precise, all ports that I used built successfully with ccache.

Carpetsmoker
07-09-2008, 07:06 PM
Geany doesn't build with ccache either, so I used the solutions listed above, although I'm not exactly sure what the benefits to ccache are. I haven't really seen any massive speed ups in recompilation. I think the biggest speed up will come with better parallel support in ports.

No, ccache is not magic, ccache is a cache to speed up the second build, not the first one, since there is no cache the first build ... It has nothing to do with parallel builds...

For example, If I upgrade a port or something, I may need to compile the application several times (Depending on how much patching is needed), so then ccache is very useful.
For a normal end-user who just compiles ports, ccache's usefulness is limited...

As for geany, I had no problems compiling 0.14,1 - Which is the latest version (VTE and NLS turned off) ... What error/problem did you have exactly?

ninjatux
07-09-2008, 07:14 PM
I haven't really seen any massive speed ups in recompilation.

I should've been more clear. I didn't mean parallel builds. I was referring to MAKEOPTS, you know -j10 or whatever. Implementing that in ports would improve compile times quite a bit. Currently, you need to use some hack to use anything above standard. I've tried setting MAKEOPTS, but it seems that it's not obeyed or such.

The configure script died with ccache enabled because it apparently couldn't find the compiler. So, I went to test another ports, pidgin. It compiled fine. So, I disabled ccache, and Geany compiled. It's not of much use to me as I'm actually interested in getting NetBeans to bend to FreeBSD or working with source code for that.