36

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?

  • 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. – Victor Lamoine May 22 '14 at 12:43
45

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.

  • some how after following this instruction, ccache does not cache clang and clang++ ... – Wang Aug 20 '18 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++ ...
  • 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 – Victor Lamoine May 22 '14 at 11:56
  • I was reading an Arch tutorial. If everything's just in /usr/lib/ccache/ just use that. – Oli May 22 '14 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 – Victor Lamoine May 22 '14 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 '14 at 12:20
  • I'm close because the link now points to ccache (I edited the first post) but the cache is always empty. – Victor Lamoine May 22 '14 at 12:30
1

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!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.