52

I want to use ccache to speed up compilation.

I came across How do I enable ccache?.

This is what I have done so far:

$ sudo apt-get install -y ccache
$ dpkg -l ccache
ii  ccache  3.1.6-1   Compiler cache for fast recompilation of C/C++ code
$ whereis ccache
ccache: /usr/bin/ccache /usr/lib/ccache /usr/bin/X11/ccache /usr/share/man/man1/ccache.1.gz

I appended ccache to the path by adding it to my ~/.bashrc file:

$ export PATH="/usr/lib/ccache:$PATH"
$ source ~/.bashrc
$ echo $PATH
/usr/lib/ccache:/usr/local/cuda-5.5/bin/:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

The symbolic links look fine:

$ ll /usr/lib/ccache/
total 76
drwxr-xr-x   2 root root  4096 mai   22 10:48 ./
drwxr-xr-x 253 root root 69632 mai   22 10:48 ../
lrwxrwxrwx   1 root root    16 mai   22 10:48 avr-g++ -> ../../bin/ccache*
lrwxrwxrwx   1 root root    16 mai   22 10:48 avr-gcc -> ../../bin/ccache*
lrwxrwxrwx   1 root root    16 mai   22 10:48 avr-gcc-4.5.3 -> ../../bin/ccache*
lrwxrwxrwx   1 root root    16 mai   22 10:48 c++ -> ../../bin/ccache*
lrwxrwxrwx   1 root root    16 mai   22 10:48 c89-gcc -> ../../bin/ccache*
lrwxrwxrwx   1 root root    16 mai   22 10:48 c99-gcc -> ../../bin/ccache*
lrwxrwxrwx   1 root root    16 mai   22 10:48 cc -> ../../bin/ccache*
lrwxrwxrwx   1 root root    16 mai   22 10:48 g++ -> ../../bin/ccache*
lrwxrwxrwx   1 root root    16 mai   22 10:48 g++-4.6 -> ../../bin/ccache*
lrwxrwxrwx   1 root root    16 mai   22 10:48 gcc -> ../../bin/ccache*
lrwxrwxrwx   1 root root    16 mai   22 10:48 gcc-4.6 -> ../../bin/ccache*
lrwxrwxrwx   1 root root    16 mai   22 10:48 x86_64-linux-gnu-g++ -> ../../bin/ccache*
lrwxrwxrwx   1 root root    16 mai   22 10:48 x86_64-linux-gnu-g++-4.6 -> ../../bin/ccache*
lrwxrwxrwx   1 root root    16 mai   22 10:48 x86_64-linux-gnu-gcc -> ../../bin/ccache*
lrwxrwxrwx   1 root root    16 mai   22 10:48 x86_64-linux-gnu-gcc-4.6 -> ../../bin/ccache*

The link looks good:

$ which g++
/usr/lib/ccache/g++

$ make
g++ -o affine_euler affine_euler.cpp -O3 -DEIGEN_NO_DEBUG -I/usr/include/eigen3
g++ -o test_eigen test_eigen.cpp -O3 -DEIGEN_NO_DEBUG -I/usr/include/eigen3

But the cache is empty:

$ ccache -s
cache directory                     /home/dell/.ccache
cache hit (direct)                     0
cache hit (preprocessed)               0
cache miss                             0
files in cache                         0
cache size                             0 Kbytes
max cache size                       1.0 Gbytes

Where am I wrong?

1
  • I realized it works in the general case but not with my makefile (works with cmake for example). So I guess the problem is in my makefile and not in ccache configuration. May 22, 2014 at 12:43

3 Answers 3

66

Installation:

# Install package
sudo apt install -y ccache

# Update symlinks
sudo /usr/sbin/update-ccache-symlinks

# Prepend ccache into the PATH
echo 'export PATH="/usr/lib/ccache:$PATH"' | tee -a ~/.bashrc

# Source bashrc to test the new PATH
source ~/.bashrc && echo $PATH

Your path (at least the beginning) should look like:

/usr/lib/ccache:/usr/local/cuda-5.5/bin/:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

And g++/gcc should now point to:

which g++ gcc
/usr/lib/ccache/g++
/usr/lib/ccache/gcc

Configuration:

If you want no limit to the number of files and size of the cache:

ccache -F 0
ccache -M 0

Show cache statistics:

ccache -s

Empty the cache and reset the stats:

ccache -C -z

Usage:

Every time you call gcc or g++; ccache is called. My mistake was that I didn't delete already-compiled files. Just delete all your CMake/output files and configure/compile again.

Your ccache shouldn't be empty then. Now try a make clean and make and you'll see it is much faster than re-compiling everything thanks to the cache.

1
  • 1
    some how after following this instruction, ccache does not cache clang and clang++ ...
    – Wang
    Aug 20, 2018 at 12:46
4

Your $PATH doesn't look correct; ccache's directory should be in there. Just run:

export PATH="/usr/lib/ccache/:$PATH"

... and try your g++ commands again. This directory is full of proxy commands that call ccache. This should work with most scripts.


If you're just calling g++ manually (not like above where you're using make), you can just prepend the command:

ccache g++ ...
5
  • This directory doesn't exist: $ ls -1 /usr/lib/ccache/ avr-g++ avr-gcc avr-gcc-4.5.3 c++ c89-gcc c99-gcc cc g++ g++-4.6 gcc gcc-4.6 x86_64-linux-gnu-g++ x86_64-linux-gnu-g++-4.6 x86_64-linux-gnu-gcc x86_64-linux-gnu-gcc-4.6 May 22, 2014 at 11:56
  • I was reading an Arch tutorial. If everything's just in /usr/lib/ccache/ just use that.
    – Oli
    May 22, 2014 at 12:01
  • It doesn't work with export PATH="/usr/lib/ccache/:$PATH" ccache binary is in /usr/bin and /usr/bin/X11. I tried with both these paths without success May 22, 2014 at 12:17
  • But the proxy commands (as you've listed above) are all in /usr/lib/ccache/. You add these to your path so that when make calls g++ or cc or whatever, it's actually calling the ccache-enabled version.
    – Oli
    May 22, 2014 at 12:20
  • I'm close because the link now points to ccache (I edited the first post) but the cache is always empty. May 22, 2014 at 12:30
2

Regarding installation:

I've found that on Ubuntu 18.04 (Bionic Beaver) the shipped default does not catch invocations of cc and c++. To fully install ccache there, you need:

sudo apt install ccache
sudo /usr/sbin/update-ccache-symlinks
export PATH="/usr/lib/ccache/:$PATH"

And then (due to updated symlinks) also calls to cc and c++ get caught!

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .