ccache
ccache is a compiler wrapper that stores on disk the compiled binaries and offers them back to speed up any eventual recompilation of the same code. While it may take a few seconds longer to compile a program the first time, subsequent compiles will be much faster as no proper compilation is made, only a lookup through the previously stored binaries. ccache
is compatible with GCC and Clang.
Installation
Configuration
The default behavior can be overridden by configuration files. Priority of the configuration settings is as follows (where 1 is highest):
- Environment variables
- Cache-specific configuration file (
$HOME/.config/ccache/ccache.conf
) - System-wide configuration file (
/etc/ccache.conf
)
See ccache(1) for details.
Enable ccache for makepkg
To enable ccache when using makepkg edit /etc/makepkg.conf
. In BUILDENV
uncomment ccache
(remove the exclamation mark) to enable caching. For example:
/etc/makepkg.conf
BUILDENV=(!distcc color ccache check !sign)
Enable for command line
If you are compiling your code from the command line, and not building packages, then you will still want to use ccache to help speed things up.
For that, you can prefix each compilation command with ccache
.
$ ccache cc hello_world.c
Alternatively, change your $PATH
to include ccache's binaries before the path to your compiler:
$ export PATH="/usr/lib/ccache/bin/:$PATH"
You may want to set this line as an environment variable for regular usage.
Enable with colorgcc
Since colorgcc is also a compiler wrapper, some care needs to be taken to ensure each wrapper is called in the correct sequence.
export PATH="/usr/lib/colorgcc/bin/:$PATH" # As per usual colorgcc installation, leave unchanged (don't add ccache) export CCACHE_PATH="/usr/bin" # Tell ccache to only use compilers here
Then colorgcc needs to be told to call ccache instead of the real compiler. Edit /etc/colorgcc/colorgccrc
and change the /usr/bin
paths to /usr/lib/ccache/bin
for all the compilers in /usr/lib/ccache/bin
:
/etc/colorgcc/colorgccrc
g++: /usr/lib/ccache/bin/g++ gcc: /usr/lib/ccache/bin/gcc c++: /usr/lib/ccache/bin/g++ cc: /usr/lib/ccache/bin/cc g77:/usr/bin/g77 f77:/usr/bin/g77 gcj:/usr/bin/gcj
Newer versions of ccache will always enable color for GCC when GCC_COLORS
is set. Color is enabled for Clang by default. If the output is not a TTY, ccache will ask the compiler to generate color, storing them in the cache, but stripping them from the output. There remains some issue in unifying -fdiagnostics-color.
Misc
Sloppiness
ccache by default use a very conservative comparison that minimizes both false positives and, for some projects, true positives. Some of the comparisons are deemed useless and can be changed:
$ ccache --set-config=sloppiness=file_macro,locale,time_macros
This tells ccache to ignore the __FILE__
and time-related macros, which usually invalidate the cache and are considered harmful in reproducible builds anyways. Locale differences are also ignored; ccache cares about it mainly because it determines the language of diagnostic messages.
The CCACHE_SLOPPINESS
environment variable can be exported to override any pre-existing sloppiness settings.
ccache also by default caches the current directory being used for each build, which means cache misses for build pipelines that use a new, random temporary directory each time it is called. See the Compiling in different directories section of the ccache manual.
Change the cache directory
You may want to move the cache directory to a faster location than the default ~/.cache/ccache
directory, like an SSD or a ramdisk.
To change the cache location only in the current shell:
$ export CCACHE_DIR=/ramdisk/ccache
Or to change the location by default:
/home/user/.config/ccache/ccache.conf
cache_dir = /ramdisk/ccache
Set maximum cache size
The default value is 5 gigabyte, however it is possible to use a lower or even a higher value:
$ ccache --set-config=max_size=2.0G
Disable the cache via environment
If you wish to disable ccache only in the current shell:
$ export CCACHE_DISABLE=1
CLI
You can use the command-line utility ccache to show a statistics summary:
$ ccache -s
Clear the cache completely:
$ ccache -C
makechrootpkg
It is also possible to use ccache with makechrootpkg from devtools package. To retain the cache when the chroot is cleaned the makechrootpkg option -d
can be used to bind the cache directory from the regular system into the chroot, e.g.:
$ mkdir /path/of/chroot/ccache $ makechrootpkg -d /path/to/cache/:/ccache -r /path/of/chroot -- CCACHE_DIR=/ccache
Then ccache can be configured for the chroot in the same way as explained above for the regular system.
Caveat
ccache is effective only when compiling exactly identical sources. (More exactly, preprocessed sources.)
In the Gentoo Linux community, a source based distro, ccache has been notorious for its placebo effect, compilation failure (due to undesirable leftover objects), etc. Gentoo requires to turn off ccache before reporting compilation failure. See Gentoo:Handbook:Parts/Working/Features#Caching compilation objects and the blog post titled "Debunking ccache myths" by Diego Pettenò, an ex-Gentoo developer.