NAME
ccache - a fast C/C++ compiler cacheSYNOPSIS
ccache [options] ccache compiler [compiler options] compiler [compiler options] (ccache masquerading as the compiler)
DESCRIPTION
Ccache is a compiler cache. It speeds up recompilation by caching the result of previous compilations and detecting when the same compilation is being done again.RUN MODES
There are two different ways to use ccache to cache a compilation: 1.Prefix your compilation command with
ccache. This method is most convenient if you just want to try out
ccache or wish to use it for some specific projects. Example:
ccache gcc -c example.c
2.Let ccache masquerade as the compiler. This
method is most useful when you wish to use ccache for all your compilations.
To do this on a Debian system, it’s easiest to just prepend
/usr/lib/ccache to your PATH. /usr/lib/ccache contains
symlinks for all compilers currently installed as Debian packages.
Alternatively, you can create any symlinks you like yourself like this:
On platforms that don’t support symbolic links you can simply copy ccache
to the compiler name instead for a similar effect:
And so forth. This will work as long as the directory with symbolic links or
ccache copies comes before the directory with the compiler (typically
/usr/bin) in PATH.
Warning
The technique of letting ccache masquerade as the compiler works well,
but currently doesn’t interact well with other tools that do the same
thing. See USING CCACHE WITH OTHER COMPILER WRAPPERS.
cp /usr/bin/ccache /usr/local/bin/ ln -s ccache /usr/local/bin/gcc ln -s ccache /usr/local/bin/g++
cp /usr/bin/ccache /usr/local/bin/gcc cp /usr/bin/ccache /usr/local/bin/g++
COMMAND LINE OPTIONS
These command line options only apply when you invoke ccache as “ccache”. When ccache masquerades as a compiler (as described in the previous section), the normal compiler options apply and you should refer to the compiler’s documentation.Common options
-c, --cleanupClean up the cache by removing old cached
files until the specified file number and cache size limits are not exceeded.
This also recalculates the cache file count and size totals. Normally, there
is no need to initiate cleanup manually as ccache keeps the cache below the
specified limits at runtime and keeps statistics up to date on each
compilation. Forcing a cleanup is mostly useful if you manually modify the
cache contents or believe that the cache size statistics may be
inaccurate.
Clear the entire cache, removing all cached
files, but keeping the configuration file.
Let the command line options operate on
configuration file PATH instead of the default. Using this option has
the same effect as setting (overriding) the environment variable
CCACHE_CONFIGPATH temporarily.
Let the command line options operate on cache
directory PATH instead of the default. For example, to show statistics
for a cache directory at /shared/ccache you can run ccache -d
/shared/ccache -s. Using this option has the same effect as setting the
environment variable CCACHE_DIR temporarily.
Remove files created in the given
namespace from the cache.
Remove files older than AGE from the
cache. AGE should be an unsigned integer with a d (days) or
s (seconds) suffix. If combined with --evict-namespace, only
remove old files within that namespace.
Print a summary of command line options.
Set the maximum number of files allowed in the
cache to NUM. Use 0 for no limit. The value is stored in a
configuration file in the cache directory and applies to all future
compilations.
Set the maximum size of the files stored in
the cache. SIZE should be a number followed by an optional suffix: k,
M, G, T (decimal), Ki, Mi, Gi or Ti (binary). The default suffix is G. Use 0
for no limit. The value is stored in a configuration file in the cache
directory and applies to all future compilations.
Recompress the cache to level LEVEL
using the Zstandard algorithm. The level can be an integer, with the same
semantics as the compression_level configuration option, or the special
value uncompressed for no compression. See CACHE COMPRESSION for
more information. This can potentionally take a long time since all files in
the cache need to be visited. Only files that are currently compressed with a
different level than LEVEL will be recompressed.
Set configuration option KEY to
VALUE. See CONFIGURATION for more information.
Print cache compression statistics. See
CACHE COMPRESSION for more information. This can potentionally take a
long time since all files in the cache need to be visited.
Print current configuration options and from
where they originate (environment variable, configuration file or compile-time
default) in human-readable format.
Print statistics counters from the stats log
in human-readable format. See stats_log. Use -v/--verbose
once or twice for more details.
Print a summary of configuration and
statistics counters in human-readable format. Use -v/--verbose
once or twice for more details.
Increase verbosity. The option can be given
multiple times.
Print version and copyright information.
Zero the cache statistics (but not the
configuration options).
Options for remote file-based storage
--trim-dir PATHRemove old files from directory PATH
until it is at most the size specified by --trim-max-size.
Warning
Don’t use this option to trim the local cache. To trim the local cache
directory to a certain size, use CCACHE_MAXSIZE=SIZE ccache
-c .
Specify the maximum size for
--trim-dir. SIZE should be a number followed by an optional
suffix: k, M, G, T (decimal), Ki, Mi, Gi or Ti (binary). The default suffix is
G.
Specify the method to trim a directory with
--trim-dir. Possible values are:
atime
mtime
LRU (least recently used) using the file
access timestamp. This is the default.
LRU (least recently used) using the file
modification timestamp.
Options for scripting or debugging
--checksum-file PATHPrint the checksum (128 bit XXH3) of the file
at PATH (- for standard input).
Extract data stored in the result file at
PATH ( - for standard input). The data will be written to
ccache-result.* files in to the current working directory. This option
is only useful when debugging ccache and its behavior.
Print the value of configuration option
KEY. See CONFIGURATION for more information.
Print the hash (160 bit BLAKE3) of the file at
PATH (- for standard input). This is only useful when debugging
ccache and its behavior.
Print the content of a result or manifest file
at PATH (- for standard input) to standard output in
human-readable format. File content embedded in a result file will however not
be printed; use --extract-result to extract the file content. This
option is only useful when debugging ccache and its behavior.
Print statistics counter IDs and corresponding
values in machine-parsable (tab-separated) format.
Extra options
When run as a compiler, ccache usually just takes the same command line options as the compiler you are using. The only exception to this is the option --ccache-skip. That option can be used to tell ccache to avoid interpreting the next option in any way and to pass it along to the compiler as-is.CONFIGURATION
Ccache’s default behavior can be overridden by options in configuration files, which in turn can be overridden by environment variables with names starting with CCACHE_. Ccache normally reads configuration from two files: first a system-level configuration file and secondly a cache-specific configuration file. The priorities of configuration options are as follows (where 1 is highest): 1.Environment variables.
2.The cache-specific configuration file (see
below).
3.The system (read-only) configuration file
<sysconfdir>/ccache.conf (typically /etc/ccache.conf or
/usr/local/etc/ccache.conf).
4.Compile-time defaults.
Location of the configuration file
The location of the cache-specific configuration file is determined like this on non-Windows systems: 1.If CCACHE_CONFIGPATH is set, use
that path.
2.Otherwise, if the environment variable
CCACHE_DIR is set then use $CCACHE_DIR/ccache.conf.
3.Otherwise, if cache_dir is set in
the system configuration file then use
<cache_dir>/ccache.conf.
4.Otherwise, if there is a legacy
$HOME/.ccache directory then use
$HOME/.ccache/ccache.conf.
5.Otherwise, if XDG_CONFIG_HOME is set
then use $XDG_CONFIG_HOME/ccache/ccache.conf.
6.Otherwise, use
$HOME/Library/Preferences/ccache/ccache.conf (macOS) or
$HOME/.config/ccache/ccache.conf (other systems).
1.If CCACHE_CONFIGPATH is set, use
that path.
2.Otherwise, if the environment variable
CCACHE_DIR is set then use %CCACHE_DIR%/ccache.conf.
3.Otherwise, if cache_dir is set in
the system configuration file then use <cache_dir>\ccache.conf.
The system-wide configuration on Windows is
%ALLUSERSPROFILE%\ccache\ccache.conf by default. The
ALLUSERSPROFILE environment variable is usually
C:\ProgramData.
4.Otherwise, if there is a legacy
%USERPROFILE%\.ccache directory then use
%USERPROFILE%\.ccache\ccache.conf.
5.Otherwise, use
%LOCALAPPDATA%\ccache\ccache.conf if it exists.
6.Otherwise, use
%APPDATA%\ccache\ccache.conf.
Configuration file syntax
Configuration files are in a simple “key = value” format, one option per line. Lines starting with a hash sign are comments. Blank lines are ignored, as is whitespace surrounding keys and values. Example:# Set maximum cache size to 10 GB: max_size = 10G
Boolean values
Some configuration options are boolean values (i.e. truth values). In a configuration file, such values must be set to the string true or false. For the corresponding environment variables, the semantics are a bit different:•A set environment variable means
“true” (even if set to the empty string).
•The following case-insensitive
negative values are considered an error (instead of surprising the user):
0, false, disable and no.
•An unset environment variable means
“false”.
Configuration options
Below is a list of available configuration options. The corresponding environment variable name is indicated in parentheses after each configuration option key.This option specifies whether ccache should
rewrite relative paths in the compiler’s standard error output to
absolute paths. This can be useful if you use base_dir with a build
system (e.g. CMake with the "Unix Makefiles" generator) that
executes the compiler in a different working directory, which makes relative
paths in compiler errors or warnings incorrect. The default is false.
This option should be an absolute path to a
directory. If set, ccache will rewrite absolute paths into paths relative to
the current working directory, but only absolute paths that begin with
base_dir. Cache results can then be shared for compilations in
different directories even if the project uses absolute paths in the compiler
command line. See also the discussion under COMPILING IN DIFFERENT
DIRECTORIES. If set to the empty string (which is the default), no
rewriting is done.
A typical path to use as base_dir is your home directory or another
directory that is a parent of your project directories. Don’t use
/ as the base directory since that will make ccache also rewrite paths
to system header files, which typically is contraproductive.
For example, say that Alice’s current working directory is
/home/alice/project1/build and that she compiles like this:
Here is what ccache will actually execute for different base_dir values:
If Bob has put project1 and project2 in /home/bob/stuff and
both users have set base_dir to /home or /home/$USER,
then Bob will get a cache hit (if they share ccache directory) since the
actual command line will be identical to that of Alice:
Without base_dir there will be a cache miss since the absolute paths will
differ. With base_dir set to / there will be a cache miss since
the relative path to /usr/include/example will be different. With
base_dir set to /home/bob/stuff/project1 there will a cache miss
since the path to project2 will be a different absolute path.
Warning
Rewriting absolute paths to relative is kind of a brittle hack. It
works OK in many cases, but there might be cases where things break. One known
issue is that absolute paths are not reproduced in dependency files, which can
mess up dependency detection in tools like Make and Ninja. If possible, use
relative paths in the first place instead instead of using base_dir.
ccache gcc -I/usr/include/example -I/home/alice/project2/include -c /home/alice/project1/src/example.c
# Current working directory: /home/alice/project1/build # With base_dir = /: gcc -I../../../../usr/include/example -I../../project2/include -c ../src/example.c # With base_dir = /home or /home/alice: gcc -I/usr/include/example -I../../project2/include -c ../src/example.c # With base_dir = /home/alice/project1 or /home/alice/project1/src: gcc -I/usr/include/example -I/home/alice/project2/include -c ../src/example.c
# Current working directory: /home/bob/stuff/project1/build # With base_dir = /home or /home/bob: gcc -I/usr/include/example -I../../project2/include -c ../src/example.c
This option specifies where ccache will keep
its cached compiler outputs.
On non-Windows systems, the default is $HOME/.ccache if such a directory
exists, otherwise $XDG_CACHE_HOME/ccache if XDG_CACHE_HOME is
set, otherwise $HOME/Library/Caches/ccache (macOS) or
$HOME/.config/ccache (other systems).
On Windows, the default is %USERPROFILE%\.ccache if such a directory
exists, otherwise %LOCALAPPDATA%\ccache.
Warning
Previous ccache versions defaulted to storing the cache in
%APPDATA%\ccache on Windows. This can result in large network file
transfers of the cache in domain environments and similar problems. Please
check this directory for cache directories and either delete them or the whole
directory, or move them to the %LOCALAPPDATA%\ccache directory.
See also Location of the configuration file.
This option can be used to force the name of
the compiler to use. If set to the empty string (which is the default), ccache
works it out from the command line.
By default, ccache includes the modification
time (“mtime”) and size of the compiler in the hash to ensure
that results retrieved from the cache are accurate. If compiler plugins are
used, these plugins will also be added to the hash. This option can be used to
select another strategy. Possible values are:
content
mtime
none
string:value
a command string
Hash the content of the compiler binary. This
makes ccache very slightly slower compared to mtime, but makes it cope
better with compiler upgrades during a build bootstrapping process.
Hash the compiler’s mtime and size,
which is fast. This is the default.
Don’t hash anything. This may be good
for situations where you can safely use the cached results even though the
compiler’s mtime or size has changed (e.g. if the compiler is built as
part of your build system and the compiler’s source has not changed, or
if the compiler only has changes that don’t affect code generation).
You should only use none if you know what you are doing.
Hash value. This can for instance be a
compiler revision number or another string that the build system generates to
identify the compiler.
Hash the standard output and standard error
output of the specified command. The string will be split on whitespace to
find out the command and arguments to run. No other interpretation of the
command string will be done, except that the special word %compiler%
will be replaced with the path to the compiler. Several commands can be
specified with semicolon as separator. Examples:
You should make sure that the specified command is as fast as possible since it
will be run once for each ccache invocation.
Identifying the compiler using a command is useful if you want to avoid cache
misses when the compiler has been rebuilt but not changed.
Another case is when the compiler (as seen by ccache) actually isn’t the
real compiler but another compiler wrapper — in that case, the default
mtime method will hash the mtime and size of the other compiler
wrapper, which means that ccache won’t be able to detect a compiler
upgrade. Using a suitable command to identify the compiler is thus safer, but
it’s also slower, so you should consider continue using the
mtime method in combination with the prefix_command option if
possible. See USING CCACHE WITH OTHER COMPILER WRAPPERS.
%compiler% -v
%compiler% -dumpmachine; %compiler% -dumpversion
Ccache normally guesses the compiler type
based on the compiler name. The compiler_type option lets you force a
compiler type. This can be useful if the compiler has a non-standard name but
is actually one of the known compiler types. Possible values are:
auto
clang
clang-cl
gcc
icl
msvc
nvcc
other
Guess one of the types below based on the
compiler name (following symlinks). This is the default.
Clang-based compiler.
clang-cl.
GCC-based compiler.
Intel compiler on Windows.
Microsoft Visual C++ (MSVC).
NVCC (CUDA) compiler.
Any compiler other than the known types.
If true, ccache will compress data it puts in
the cache. However, this option has no effect on how files are retrieved from
the cache; compressed and uncompressed results will still be usable regardless
of this option. The default is true.
Compression is done using the Zstandard algorithm. The algorithm is fast enough
that there should be little reason to turn off compression to gain
performance. One exception is if the cache is located on a compressed file
system, in which case the compression performed by ccache of course is
redundant.
Compression will be disabled if file cloning (the file_clone option) or
hard linking (the hard_link option) is enabled.
This option determines the level at which
ccache will compress object files using the real-time compression algorithm
Zstandard. It only has effect if compression is enabled (which it is by
default). Zstandard is extremely fast for decompression and very fast for
compression for lower compression levels. The default is 0.
Semantics of compression_level:
> 0
< 0
0 (default)
See the Zstandard documentation <http://zstd.net> for more
information.
A positive value corresponds to normal
Zstandard compression levels. Lower levels (e.g. 1) mean faster
compression but worse compression ratio. Higher levels (e.g. 19) mean
slower compression but better compression ratio. The maximum possible value
depends on the libzstd version, but at least up to 19 is available for all
versions. Decompression speed is essentially the same for all levels. As a
rule of thumb, use level 5 or lower since higher levels may slow down
compilations noticeably. Higher levels are however useful when recompressing
the cache with command line option -X/--recompress.
A negative value corresponds to
Zstandard’s “ultra-fast” compression levels, which are
even faster than level 1 but with less good compression ratios. For instance,
level -3 corresponds to --fast=3 for the zstd command
line tool. In practice, there is little use for levels lower than -5 or
so.
The value 0 means that ccache will
choose a suitable level, currently 1.
This option can be used to force a certain
extension for the intermediate preprocessed file. The default is to
automatically determine the extension to use for intermediate preprocessor
files based on the type of file being compiled, but that sometimes
doesn’t work. For example, when using the “aCC” compiler
on HP-UX, set the cpp extension to i.
If true, enable the debug mode. The debug mode
creates per-object debug files that are helpful when debugging unexpected
cache misses. Note however that ccache performance will be reduced slightly.
See CACHE DEBUGGING for more information. The default is false.
Specifies where to write per-object debug
files if the debug mode is enabled. If set to the empty string, the files will
be written next to the object file. If set to a directory, the debug files
will be written with full absolute paths in that directory, creating it if
needed. The default is the empty string.
For example, if debug_dir is set to /example, the current working
directory is /home/user and the object file is build/output.o
then the debug log will be written to
/example/home/user/build/output.o.ccache-log. See also CACHE
DEBUGGING.
If true, the depend mode will be used. The
default is false. See The depend mode.
If true, the direct mode will be used. The
default is true. See The direct mode.
When true, ccache will just call the real
compiler, bypassing the cache completely. The default is false.
This option is a list of paths to files that
ccache will include in the the hash sum that identifies the build. The list
separator is semicolon on Windows systems and colon on other systems.
If true, ccache will attempt to use file
cloning (also known as “copy on write”, “CoW” or
“reflinks”) to store and fetch cached compiler results.
file_clone has priority over hard_link. The default is false.
Files stored by cloning cannot be compressed, so the cache size will likely be
significantly larger if this option is enabled. However, performance may be
improved depending on the use case.
Unlike the hard_link option, file_clone is completely safe to use,
but not all file systems support the feature. For such file systems, ccache
will fall back to use plain copying (or hard links if hard_link is
enabled).
If true, ccache will attempt to use hard links
to store and fetch cached object files. The default is false.
Files stored via hard links cannot be compressed, so the cache size will likely
be significantly larger if this option is enabled. However, performance may be
improved depending on the use case.
Warning
Do not enable this option unless you are aware of these caveats:
•If the resulting file is modified, the
file in the cache will also be modified since they share content, which
corrupts the cache entry. As of version 4.0, ccache makes stored and fetched
object files read-only as a safety measure. Furthermore, a simple integrity
check is made for cached object files by verifying that their sizes are
correct. This means that mistakes like strip file.o or echo
>file.o will be detected even if the object file is made writeable, but
a modification that doesn’t change the file size will not.
•Programs that don’t expect that
files from two different identical compilations are hard links to each other
can fail.
•Programs that rely on modification
times (like make) can be confused if several users (or one user with
several build trees) use the same cache directory. The reason for this is that
the object files share i-nodes and therefore modification times. If
file.o is in build tree A (hard-linked from the cache) and
file.o then is produced by ccache in build tree B by
hard-linking from the cache, the modification timestamp will be updated for
file.o in build tree A as well. This can retrigger relinking in
build tree A even though nothing really has changed.
If true (which is the default), ccache will
include the current working directory (CWD) in the hash that is used to
distinguish two compilations when generating debug info (compiler option
-g with variations). Exception: The CWD will not be included in the
hash if base_dir is set (and matches the CWD) and the compiler option
-fdebug-prefix-map is used. See also the discussion under COMPILING
IN DIFFERENT DIRECTORIES.
The reason for including the CWD in the hash by default is to prevent a problem
with the storage of the current working directory in the debug info of an
object file, which can lead ccache to return a cached object file that has the
working directory in the debug info set incorrectly.
You can disable this option to get cache hits when compiling the same source
code in different directories if you don’t mind that CWD in the debug
info might be incorrect.
This option is a list of paths to files (or
directories with headers) that ccache will not include in the manifest
list that makes up the direct mode. Note that this can cause stale cache hits
if those headers do indeed change. The list separator is semicolon on Windows
systems and colon on other systems.
This option is a space-delimited list of
compiler options that ccache will exclude from the hash. Excluding a compiler
option from the hash can be useful when you know it doesn’t affect the
result (but ccache doesn’t know that), or when it does and you
don’t care. If a compiler option in the list is suffixed with an
asterisk ( *) it will be matched as a prefix. For example,
-fmessage-length=* will match both -fmessage-length=20 and
-fmessage-length=70.
If true, ccache will cache source file hashes
based on device, inode and timestamps. This reduces the time spent on hashing
include files since the result can be resused between compilations. The
default is false. The feature requires temporary_dir to be located on a
local filesystem of a supported type.
Note
The inode cache feature is currently not available on Windows.
If true, ccache will not discard the comments
before hashing preprocessor output. The default is false. This can be used to
check documentation with -Wdocumentation.
Sets the limit when cleaning up. Files are
deleted (in LRU order) until the levels are below the limit. The default is
0.8 (= 80%). See Automatic cleanup for more information.
If set to a file path, ccache will write
information on what it is doing to the specified file. This is useful for
tracking down problems.
If set to syslog, ccache will log using syslog() instead of to a
file. If you use rsyslogd, you can add something like this to
/etc/rsyslog.conf or a file in /etc/rsyslog.d:
# log ccache to file :programname, isequal, "ccache" /var/log/ccache # remove from syslog & ~
This option specifies the maximum number of
files to keep in the cache. Use 0 for no limit (which is the default). See
also CACHE SIZE MANAGEMENT.
This option specifies the maximum size of the
cache. Use 0 for no limit. The default value is 5G. Available suffixes: k, M,
G, T (decimal) and Ki, Mi, Gi, Ti (binary). The default suffix is G. See also
CACHE SIZE MANAGEMENT.
This option specifies the prefix of included
files output for MSVC compiler. The default prefix is “Note: including
file:”. If you use a localized compiler, this should be set
accordingly.
If set, the namespace string will be added to
the hashed data for each compilation. This will make the associated cache
entries logically separate from cache entries with other namespaces, but they
will still share the same storage space. Cache entries can also be selectively
removed from the local cache with the command line option
--evict-namespace, potentially in combination with
--evict-older-than.
For instance, if you use the same local cache for several disparate projects,
you can use a unique namespace string for each one. This allows you to remove
cache entries that belong to a certain project if you stop working with that
project.
If set, ccache will search directories in this
list when looking for the real compiler. The list separator is semicolon on
Windows systems and colon on other systems. If not set, ccache will look for
the first executable matching the compiler name in the normal PATH that
isn’t a symbolic link to ccache itself.
When this option is set, and ccache finds a
precompiled header file, ccache will look for a file with the extension
“.sum” added (e.g. “pre.h.gch.sum”), and if found,
it will hash this file instead of the precompiled header itself to work around
the performance penalty of hashing very large files.
This option adds a list of prefixes (separated
by space) to the command line that ccache uses when invoking the compiler. See
also USING CCACHE WITH OTHER COMPILER WRAPPERS.
This option adds a list of prefixes (separated
by space) to the command line that ccache uses when invoking the
preprocessor.
If true, ccache will attempt to use existing
cached results, but it will not add new results to any cache backend.
Statistics counters will still be updated, though, unless the stats
option is set to false.
If you are using this because your ccache directory is read-only, you need to
set temporary_dir since ccache will fail to create temporary files
otherwise. You may also want to set stats to false make ccache
not even try to update stats files.
Just like read_only except that ccache
will only try to retrieve results from the cache using the direct mode, not
the preprocessor mode. See documentation for read_only regarding using
a read-only ccache directory.
If true, ccache will not use any previously
stored result. New results will still be cached, possibly overwriting any
pre-existing results.
If true, ccache will only use remote storage.
The default is false. Note that cache statistics counters will still be kept
in the local cache directory unless stats is false. See also Storage
interaction.
This option specifies one or several storage
backends (separated by space) to query after checking the local cache (unless
remote_only is true). See [Remote storage backends] for
documentation of syntax and available backends.
Examples:
•file:/shared/nfs/directory
•file:///shared/nfs/one|read-only
file:///shared/nfs/two
•redis://example.com
Note
In previous ccache versions this option was called secondary_storage
( CCACHE_SECONDARY_STORAGE), which can still be used as an alias.
If true, ccache will write results to remote
storage even for local storage cache hits. The default is false.
If true, ccache will first run the
preprocessor to preprocess the source code (see The preprocessor mode)
and then on a cache miss run the compiler on the source code to get hold of
the object file. This is the default.
If false, ccache will first run preprocessor to preprocess the source code and
then on a cache miss run the compiler on the preprocessed source code
instead of the original source code. This makes cache misses slightly faster
since the source code only has to be preprocessed once. The downside is that
some compilers won’t produce the same result (for instance diagnostics
warnings) when compiling preprocessed source code.
A solution to the above mentioned downside is to set run_second_cpp to
false and pass -fdirectives-only (for GCC) or -frewrite-includes
(for Clang) to the compiler. This will cause the compiler to leave the macros
and other preprocessor information, and only process the #include
directives. When run in this way, the preprocessor arguments will be passed to
the compiler since it still has to do some preprocessing (like macros).
This option is ignored with MSVC, as there is no way to make it compile without
preprocessing first.
By default, ccache tries to give as few false
cache hits as possible. However, in certain situations it’s possible
that you know things that ccache can’t take for granted. This option
makes it possible to tell ccache to relax some checks in order to increase the
hit rate. The value should be a comma-separated string with one or several of
the following values:
clang_index_store
file_stat_matches
file_stat_matches_ctime
gcno_cwd
include_file_ctime
include_file_mtime
ivfsoverlay
locale
modules
pch_defines
random_seed
system_headers
time_macros
See the discussion under TROUBLESHOOTING for more information.
Ignore the Clang compiler option
-index-store-path and its argument when computing the manifest hash.
This is useful if you use Xcode, which uses an index store path derived from
the local project path. Note that the index store won’t be updated
correctly on cache hits if you enable this sloppiness.
Ccache normally examines a file’s
contents to determine whether it matches the cached version. With this
sloppiness set, ccache will consider a file as matching its cached version if
the mtimes and ctimes match.
Ignore ctimes when file_stat_matches is
enabled. This can be useful when backdating files' mtimes in a controlled
way.
By default, ccache will include the current
working directory in the hash when producing a .gcno file (when
compiling with -ftest-coverage or --coverage). This is because
GCC 9+ includes the current working directory in the .gcno file. The
gcno_cwd sloppiness makes ccache not hash the current working directory
so that you can get cache hits when compiling in different directories, with
the tradeoff of potentially getting an incorrect directory in the .gcno
file. gcno_cwd also disables hashing of the current working directory
if -fprofile-abs-path is used.
By default, ccache will disable the direct
mode if an include file has too new ctime. This sloppiness disables that
check. See also [Handling of newly created header files].
By default, ccache will disable the direct
mode if an include file has too new mtime. This sloppiness disables that
check. See also [Handling of newly created header files].
Ignore the Clang compiler option
-ivfsoverlay and its argument. This is useful if you use Xcode, which
uses a virtual file system (VFS) for things like combining Objective-C and
Swift code.
Ccache includes the environment variables
LANG, LC_ALL, LC_CTYPE and LC_MESSAGES in the hash
by default since they may affect localization of compiler warning messages.
Set this sloppiness to tell ccache not to do that.
By default, ccache will not cache compilations
if -fmodules is used since it cannot hash the state of
compiler’s internal representation of relevant modules. This sloppiness
allows caching in such a case. See C++ MODULES for more
information.
Be sloppy about #define directives when
precompiling a header file. See PRECOMPILED HEADERS for more
information.
Ignore the -frandom-seed option and its
arguments when computing the input hash. This is useful if your build system
generates different seeds between builds and you are OK with reusing cached
results.
By default, ccache will also include all
system headers in the manifest. With this sloppiness set, ccache will only
include system headers in the hash but not add the system header files to the
list of include files.
Ignore __DATE__, __TIME__ and
__TIMESTAMP__ being present in the source code.
If true, ccache will update the statistics
counters on each compilation. The default is true.
If set to a file path, ccache will write
statistics counter updates to the specified file. This is useful for getting
statistics for individual builds. To show a summary of the current stats log,
use ccache --show-log-stats.
Note
Lines in the stats log starting with a hash sign ( #) are comments.
This option specifies where ccache will put
temporary files. The default is $XDG_RUNTIME_DIR/ccache-tmp (typically
/run/user/<UID>/ccache-tmp) if XDG_RUNTIME_DIR is set and
the directory exists, otherwise <cache_dir>/tmp.
Note
In previous versions of ccache, CCACHE_TEMPDIR had to be on the same
filesystem as the CCACHE_DIR path, but this requirement has been relaxed.
This option (an octal integer) specifies the
umask for files and directories in the cache directory. This is mostly useful
when you wish to share your cache with other users.
REMOTE STORAGE BACKENDS
The remote_storage option lets you configure ccache to use one or several remote storage backends. By default, the local cache directory located in cache_dir will be queried first and remote storage second, but remote_only can be set to true to disable local storage. Note that cache statistics counters will still be kept in the local cache directory — remote storage backends only store compilation results and manifests.Attributes for all backends
These optional attributes are available for all remote storage backends:•read-only: If true, only
read from this backend, don’t write. The default is false.
•shards: A comma-separated list
of names for sharding (partitioning) the cache entries using Rendezvous
hashing <https://en.wikipedia.org/wiki/Rendezvous_hashing>,
typically to spread the cache over a server cluster. When set, the storage URL
must contain an asterisk ( *), which will be replaced by one of the
shard names to form a real URL. A shard name can optionally have an appended
weight within parentheses to indicate how much of the key space should be
associated with that shard. A shard with weight w will contain
w/ S of the cache, where S is the sum of all shard
weights. A weight could for instance be set to represent the available memory
for a memory cache on a specific server. The default weight is 1.
Examples:
•redis://cache-*.example.com|shards=a(3),b(1),c(1.5)
will put 55% (3/5.5) of the cache on redis://cache-a.example.com, 18%
(1/5.5) on redis://cache-b.example.com and 27% (1.5/5.5) on
redis://cache-c.example.com.
•http://example.com/*|shards=alpha,beta
will put 50% of the cache on http://example.com/alpha and 50% on
http://example.com/beta.
Storage interaction
The table below describes the interaction between local and remote storage on cache hits and misses if remote_only is false (which is the default):Local storage | Remote storage | What happens |
miss | miss | Compile, write to local, write to remote[1] |
miss | hit | Read from remote, write to local |
hit | - | Read from local, don’t write to remote[2] |
Local storage | Remote storage | What happens |
- | miss | Compile, write to remote, don’t write to local |
- | hit | Read from remote, don’t write to local |
File storage backend
URL format: file:DIRECTORY or file://[HOST]DIRECTORY•file:/shared/nfs/directory
•file:///shared/nfs/directory|umask=002|update-mtime=true
•file://example.com/shared/folder
•layout: How to store file under
the cache directory. Available values:
The default is subdirs.
•flat: Store all files directly
under the cache directory.
•subdirs: Store files in 256
subdirectories of the cache directory.
•umask: This attribute (an octal
integer) overrides the umask to use for files and directories in the cache
directory.
•update-mtime: If true,
update the modification time (mtime) of cache entries that are read. The
default is false.
HTTP storage backend
URL format: http://HOST[:PORT][/PATH]•http://localhost
•http://someusername:[email protected]/cache/
•http://localhost:8080|layout=bazel|connect-timeout=50
•bearer-token: Bearer token used
to authorize the HTTP requests.
•connect-timeout: Timeout (in
ms) for network connection. The default is 100.
•keep-alive: If true,
keep the HTTP connection to the storage server open to avoid reconnects. The
default is true.
•layout: How to map key names to
the path part of the URL. Available values:
The default is subdirs.
•bazel: Store values in a format
compatible with the Bazel HTTP caching protocol. More specifically, the
entries will be stored as 64 hex digits under the /ac/ part of the
cache.
Note
You may have to disable verification of action cache values in the server
for this to work since ccache entries are not valid action result metadata
values.
•flat: Append the key directly
to the path part of the URL (with a leading slash if needed).
•subdirs: Append the first two
characters of the key to the URL (with a leading slash if needed), followed by
a slash and the rest of the key. This divides the entries into 256
buckets.
•operation-timeout: Timeout (in
ms) for HTTP requests. The default is 10000.
Redis storage backend
URL formats:•redis://localhost
•redis://[email protected]:6379/0|connect-timeout=50
•redis+unix:/run/redis.sock
•redis+unix:///run/redis.sock
•redis+unix://p4ssw0rd@localhost/run/redis.sock?db=0
•connect-timeout: Timeout (in
ms) for network connection. The default is 100.
•operation-timeout: Timeout (in
ms) for Redis commands. The default is 10000.
CACHE SIZE MANAGEMENT
By default, ccache has a 5 GB limit on the total size of files in the cache and no limit on the number of files. You can set different limits using the command line options -M/--max-size and -F/--max-files. Use the -s/--show-stats option to see the cache size and the currently configured limits (in addition to other various statistics).Automatic cleanup
Ccache maintains counters for various statistics about the cache, including the size and number of all cached files. In order to improve performance and reduce issues with concurrent ccache invocations, there is one statistics file for each of the sixteen subdirectories in the cache. 1.Count all files in the subdirectory and
compute their aggregated size.
2.Remove files in LRU (least recently used)
order until the size is at most limit_multiple * max_size / 16 and the
number of files is at most limit_multiple * max_files / 16, where
limit_multiple, max_size and max_files are configuration
options.
3.Set the size and file number counters to
match the files that were kept.
Manual cleanup
You can run ccache -c/--cleanup to force cleanup of the whole cache, i.e. all of the sixteen subdirectories. This will recalculate the statistics counters and make sure that the configuration options max_size and max_files are not exceeded. Note that limit_multiple is not taken into account for manual cleanup.CACHE COMPRESSION
Ccache will by default compress all data it puts into the cache using the compression algorithm Zstandard <http://zstd.net> (zstd) using compression level 1. The algorithm is fast enough that there should be little reason to turn off compression to gain performance. One exception is if the cache is located on a compressed file system, in which case the compression performed by ccache of course is redundant. See the documentation for the configuration options compression and compression_level for more information.Total data: 14.8 GB (16.0 GB disk blocks) Compressed data: 11.3 GB (30.6% of original size) Original size: 36.9 GB Compression ratio: 3.267 x (69.4% space savings) Incompressible data: 3.5 GB
•The “disk blocks” size
is the cache size when taking disk block size into account. This value should
match the “Cache size” value from “ccache
--show-stats”. The other size numbers refer to actual content
sizes.
•“Compressed data” refers
to result and manifest files stored in the cache.
•“Incompressible data”
refers to files that are always stored uncompressed (triggered by enabling
file_clone or hard_link) or unknown files (for instance files
created by older ccache versions).
•The compression ratio is affected by
compression_level.
CACHE STATISTICS
ccache --show-stats shows a summary of statistics, including cache size, cleanups (number of performed cleanups, either implicitly due to a cache size limit being reached or due to explicit ccache -c calls), overall hit rate, hit rate for direct/preprocessed modes and hit rate for local and remote storage.Counter | Description |
Autoconf compile/link | Uncacheable compilation or linking by an Autoconf test. |
Bad compiler arguments | Malformed compiler argument, e.g. missing a value for a compiler option that requires an argument or failure to read a file specified by a compiler option argument. |
Called for linking | The compiler was called for linking, not compiling. Ccache only supports compilation of a single file, i.e. calling the compiler with the -c option to produce a single object file from a single source file. |
Called for preprocessing | The compiler was called for preprocessing, not compiling. |
Could not use modules | Preconditions for using C++ MODULES were not fulfilled. |
Could not use precompiled header | Preconditions for using precompiled headers were not fulfilled. |
Could not write to output file | The output path specified with -o could not be written to. |
Compilation failed | The compilation failed. No result stored in the cache. |
Compiler check failed | A compiler check program specified by compiler_check (CCACHE_COMPILERCHECK) failed. |
Compiler output file missing | One of the files expected to be produced by the compiler was missing after compilation. |
Compiler produced empty output | The compiler’s output file (typically an object file) was empty after compilation. |
Could not find the compiler | The compiler to execute could not be found. |
Error hashing extra file | Failure reading a file specified by extra_files_to_hash (CCACHE_EXTRAFILES). |
Forced recache | CCACHE_RECACHE was used to overwrite an existing result. |
Internal error | Unexpected failure, e.g. due to problems reading/writing the cache. |
Missing cache file | A file was unexpectedly missing from the cache. This only happens in rare situations, e.g. if one ccache instance is about to get a file from the cache while another instance removed the file as part of cache cleanup. |
Multiple source files | The compiler was called to compile multiple source files in one go. This is not supported by ccache. |
No input file | No input file was specified to the compiler. |
Output to stdout | The compiler was instructed to write its output to standard output using -o -. This is not supported by ccache. |
Preprocessing failed | Preprocessing the source code using the compiler’s -E option failed. |
Unsupported code directive | Code like the assembler .incbin directive was found. This is not supported by ccache. |
Unsupported compiler option | A compiler option not supported by ccache was found. |
Unsupported environment variable | An environment variable not supported by ccache was set. |
Unsupported source language | A source language e.g. specified with -x was unsupported by ccache. |
HOW CCACHE WORKS
The basic idea is to detect when you are compiling exactly the same code a second time and reuse the previously produced output. The detection is done by hashing different kinds of information that should be unique for the compilation and then using the hash sum to identify the cached output. Ccache uses BLAKE3, a very fast cryptographic hash algorithm, for the hashing. On a cache hit, ccache is able to supply all of the correct compiler outputs (including all warnings, dependency file, etc) from the cache. Data stored in the cache is checksummed with XXH3, an extremely fast non-cryptographic algorithm, to detect corruption.•the preprocessor mode, where
ccache runs the preprocessor on the source code and hashes the result
•the direct mode, where ccache
hashes the source code and include files directly
Common hashed information
The following information is always included in the hash:•the extension used by the compiler for
a file with preprocessor output (normally .i for C code and .ii
for C++ code)
•the compiler’s size and
modification time (or other compiler-specific information specified by
compiler_check)
•the name of the compiler
•the current directory (if
hash_dir is enabled)
•contents of files specified by
extra_files_to_hash (if any)
The preprocessor mode
In the preprocessor mode, the hash is formed of the common information and:•the preprocessor output from running
the compiler with -E
•the command line options except those
that affect include files ( -I, -include, -D, etc; the
theory is that these command line options will change the preprocessor output
if they have any effect at all)
•any standard error output generated by
the preprocessor
The direct mode
In the direct mode, the hash is formed of the common information and:•the input source file
•the compiler options
•references to cached compilation
results (object file, dependency file, etc) that were produced by previous
compilations that matched the hash
•paths to the include files that were
read at the time the compilation results were stored in the cache
•hash sums of the include files at the
time the compilation results were stored in the cache
•direct_mode is false
•a modification time of one of the
include files is too new (needed to avoid a race condition)
•a compiler option not supported by the
direct mode is used:
•a -Wp,* compiler option other
than -Wp,-MD,<path>, -Wp,-MMD,<path> and
-Wp,-D<define>
•-Xpreprocessor
•the string __TIME__ is present
in the source code
The depend mode
If the depend mode is enabled, ccache will not use the preprocessor at all. The hash used to identify results in the cache will be based on the direct mode hash described above plus information about include files read from the dependency list generated by MSVC with /showIncludes, or the dependency file generated by other compilers with -MD or -MMD.•The ccache overhead of a cache miss
will be much smaller.
•Not running the preprocessor at all
can be good if compilation is performed remotely, for instance when using
distcc or similar; ccache then won’t make potentially costly
preprocessor calls on the local machine.
•The cache hit rate will likely be
lower since any change to compiler options or source code will make the hash
different. Compare this with the default setup where ccache will fall back to
the preprocessor mode, which is tolerant to some types of changes of compiler
options and source code changes.
•If -MD is used, the manifest entries
will include system header files as well, thus slowing down cache hits
slightly, just as using -MD slows down make. This is also the case for
MSVC with /showIncludes.
•If -MMD is used, the manifest
entries will not include system header files, which means ccache will ignore
changes in them.
•depend_mode is false.
•run_second_cpp is false.
•The compiler is not generating
dependencies using -MD or -MMD (for MSVC, /showIncludes
is added automatically if not specified by the user).
HANDLING OF NEWLY CREATED HEADER FILES
If modification time (mtime) or status change time (ctime) of one of the include files is equal to (or newer than) the time compilation is being done, ccache disables the direct mode (or, in the case of a precompiled header, disables caching completely). This done as a safety measure to avoid a race condition (see below).•create the include file earlier in the
build process, or
•set sloppiness to
include_file_ctime,include_file_mtime if you are willing to take the
risk, for instance if you know that your build system is robust enough not to
trigger the race condition.
1.The preprocessor is run.
2.An include file is modified by
someone.
3.The new include file is hashed by
ccache.
4.The real compiler is run on the
preprocessor’s output, which contains data from the old header
file.
5.The wrong object file is stored in the
cache.
CACHE DEBUGGING
To find out what information ccache actually is hashing, you can enable the debug mode via the configuration option debug or by setting CCACHE_DEBUG in the environment. This can be useful if you are investigating why you don’t get cache hits. Note that performance will be reduced slightly.Filename | Description |
<objectfile>.<timestamp>.ccache-input-c | Binary input hashed by both the direct mode and the preprocessor mode. |
<objectfile>.<timestamp>.ccache-input-d | Binary input only hashed by the direct mode. |
<objectfile>.<timestamp>.ccache-input-p | Binary input only hashed by the preprocessor mode. |
<objectfile>.<timestamp>.ccache-input-text | Human-readable combined diffable text version of the three files above. |
<objectfile>.<timestamp>.ccache-log | Log for this object file. |
The timestamp format is `<year><month><day>_<hour><minute><second>_<microsecond>`.
1.Enable debug
(CCACHE_DEBUG).
2.Build.
3.Clean and build again.
4.Compare the
<objectfile>.<timestamp>.ccache-input-text files for the
two builds. This together with the
<objectfile>.<timestamp>.ccache-log files should give you
some clues about what is happening.
COMPILING IN DIFFERENT DIRECTORIES
Some information included in the hash that identifies a unique compilation can contain absolute paths:•The preprocessed source code may
contain absolute paths to include files if the compiler option -g is
used or if absolute paths are given to -I and similar compiler
options.
•Paths specified by compiler options
(such as -I, -MF, etc) on the command line may be
absolute.
•The source code file path may be
absolute, and that path may substituted for __FILE__ macros in the
source code or included in warnings emitted to standard error by the
preprocessor.
•If you build with -g (or
similar) to add debug information to the object file, you must either:
•use the compiler option
-fdebug-prefix-map=<old>=<new> for relocating debug info to
a common prefix (e.g. -fdebug-prefix-map=$PWD=.); or
•set hash_dir = false.
•If you use absolute paths anywhere on
the command line (e.g. the source code file path or an argument to compiler
options like -I and -MF), you must set base_dir to an
absolute path to a “base directory”. Ccache will then rewrite
absolute paths under that directory to relative before computing the
hash.
PRECOMPILED HEADERS
Ccache has support for precompiled headers with GCC and Clang. However, you have to do some things to make it work properly:•You must set sloppiness to
pch_defines,time_macros. The reason is that ccache can’t tell
whether __TIME__, __DATE__ or __TIMESTAMP__ is used when
using a precompiled header. Further, it can’t detect changes in
#defines in the source code because of how preprocessing works in
combination with precompiled headers.
•You may also want to include
include_file_mtime,include_file_ctime in sloppiness. See
HANDLING OF NEWLY CREATED HEADER FILES.
•You must either:
•use the compiler option
-include to include the precompiled header (i.e., don’t use
#include in the source code to include the header; the filename itself
must be sufficient to find the header, i.e. -I paths are not searched);
or
•(for the Clang compiler) use the
compiler option -include-pch to include the PCH file generated from the
precompiled header; or
•(for the GCC compiler) add the
compiler option -fpch-preprocess when compiling.
•If you use Clang, you must compile
with -fno-pch-timestamp.
C++ MODULES
Ccache has support for Clang’s -fmodules option. In practice ccache only additionally hashes module.modulemap files; it does not know how Clang handles its cached binary form of modules so those are ignored. This should not matter in practice: as long as everything else (including module.modulemap files) is the same the cached result should work. Still, you must set sloppiness to modules to allow caching.SHARING A LOCAL CACHE
A group of developers can increase the cache hit rate by sharing a local cache directory. To share a local cache without unpleasant side effects, the following conditions should to be met:•Use the same cache directory.
•Make sure that the configuration
option hard_link is false (which is the default).
•Make sure that all users are in the
same group.
•Set the configuration option
umask to 002. This ensures that cached files are accessible to
everyone in the group.
•Make sure that all users have write
permission in the entire cache directory (and that you trust all users of the
shared cache).
•Make sure that the setgid bit is set
on all directories in the cache. This tells the filesystem to inherit group
ownership for new directories. The following command might be useful for this:
find $CCACHE_DIR -type d | xargs chmod g+s
SHARING A CACHE ON NFS
It is possible to put the cache directory on an NFS filesystem (or similar filesystems), but keep in mind that:•Having the cache on NFS may slow down
compilation. Make sure to do some benchmarking to see if it’s worth
it.
•Ccache hasn’t been tested very
thoroughly on NFS.
USING CCACHE WITH OTHER COMPILER WRAPPERS
The recommended way of combining ccache with another compiler wrapper (such as “distcc”) is by letting ccache execute the compiler wrapper. This is accomplished by defining prefix_command, for example by setting the environment variable CCACHE_PREFIX to the name of the wrapper (e.g. distcc). Ccache will then prefix the command line with the specified command when running the compiler. To specify several prefix commands, set prefix_command to a colon-separated list of commands.•Compiler upgrades will not be detected
properly.
•The cached results will not be shared
between compilations with and without the other wrapper.
CAVEATS
•The direct mode fails to pick up new
header files in some rare scenarios. See The direct mode above.
TROUBLESHOOTING
General
A general tip for getting information about what ccache is doing is to enable debug logging by setting the configuration option debug (or the environment variable CCACHE_DEBUG); see CACHE DEBUGGING for more information. Another way of keeping track of what is happening is to check the output of ccache -s.Performance
Ccache has been written to perform well out of the box, but sometimes you may have to do some adjustments of how you use the compiler and ccache in order to improve performance.•If the counter for preprocessed cache
hits has been incremented instead of the one for direct cache hits, ccache has
fallen back to preprocessor mode, which is generally slower. Some possible
reasons are:
•The source code has been modified in
such a way that the preprocessor output is not affected.
•Compiler arguments that are hashed in
the direct mode but not in the preprocessor mode have changed ( -I,
-include, -D, etc) and they didn’t affect the
preprocessor output.
•The compiler option
-Xpreprocessor or -Wp,* (except -Wp,-MD,<path>,
-Wp,-MMD,<path>, and -Wp,-D<define>) is used.
•This was the first compilation with a
new value of the base directory.
•A modification or status change time
of one of the include files is too new (created the same second as the
compilation is being done). See HANDLING OF NEWLY CREATED HEADER
FILES.
•The __TIME__ preprocessor macro
is (potentially) being used. Ccache turns off direct mode if __TIME__
is present in the source code. This is done as a safety measure since the
string indicates that a __TIME__ macro may affect the output.
(To be sure, ccache would have to run the preprocessor, but the sole point of
the direct mode is to avoid that.) If you know that __TIME__
isn’t used in practise, or don’t care if ccache produces objects
where __TIME__ is expanded to something in the past, you can set
sloppiness to time_macros.
•The __DATE__ preprocessor macro
is (potentially) being used and the date has changed. This is similar to how
__TIME__ is handled. If __DATE__ is present in the source code,
ccache hashes the current date in order to be able to produce the correct
object file if the __DATE__ macro affects the output. If you know that
__DATE__ isn’t used in practise, or don’t care if ccache
produces objects where __DATE__ is expanded to something in the past,
you can set sloppiness to time_macros.
•The __TIMESTAMP__ preprocessor
macro is (potentially) being used and the source file’s modification
time has changed. This is similar to how __TIME__ is handled. If
__TIMESTAMP__ is present in the source code, ccache hashes the string
representation of the source file’s modification time in order to be
able to produce the correct object file if the __TIMESTAMP__ macro
affects the output. If you know that __TIMESTAMP__ isn’t used in
practise, or don’t care if ccache produces objects where
__TIMESTAMP__ is expanded to something in the past, you can set
sloppiness to time_macros.
•The input file path has changed.
Ccache includes the input file path in the direct mode hash to be able to take
relative include files into account and to produce a correct object file if
the source code includes a __FILE__ macro.
•If a cache hit counter was not
incremented even though the same code has been compiled and cached before,
ccache has either detected that something has changed anyway or a cleanup has
been performed (either explicitly or implicitly when a cache limit has been
reached). Some perhaps unobvious things that may result in a cache miss are
usage of __TIME__, __DATE__ or __TIMESTAMP__ macros, or
use of automatically generated code that contains a timestamp, build counter
or other volatile information.
•If “Multiple source
files” has been incremented, it’s an indication that the
compiler has been invoked on several source code files at once. Ccache
doesn’t support that. Compile the source code files separately if
possible.
•If “Unsupported compiler
option” has been incremented, enable debug logging and check which
compiler option was rejected.
•If “Preprocessing
failed” has been incremented, one possible reason is that precompiled
headers are being used. See PRECOMPILED HEADERS for how to remedy
this.
•If “Could not use precompiled
header” has been incremented, see PRECOMPILED HEADERS.
•If “Could not use
modules” has been incremented, see C++ MODULES.
Corrupt object files
It should be noted that ccache is susceptible to general storage problems. If a bad object file sneaks into the cache for some reason, it will of course stay bad. Some possible reasons for erroneous object files are bad hardware (disk drive, disk controller, memory, etc), buggy drivers or file systems, a bad prefix_command or compiler wrapper. If this happens, the easiest way of fixing it is this: 1.Build so that the bad object file ends up
in the build tree.
2.Remove the bad object file from the build
tree.
3.Rebuild with CCACHE_RECACHE
set.
MORE INFORMATION
Credits, mailing list information, bug reporting instructions, source code, etc, can be found on ccache’s web site: <https://ccache.dev>.AUTHOR
Ccache was originally written by Andrew Tridgell and is currently developed and maintained by Joel Rosdahl. See AUTHORS.txt or AUTHORS.html and <https://ccache.dev/credits.html> for a list of contributors.2023-03-23 | Ccache 4.7.5 |