Index of Section 1 Manual Pages
| Interix / SUA | ccache.1 | Interix / SUA |
ccache(1) ccache(1)
NAME
ccache - a fast compiler cache
SYNOPSIS
ccache [OPTION]
ccache [COMPILER OPTIONS]
[COMPILER OPTIONS]
DESCRIPTION
ccache is a compiler cache. It speeds up re-compilation of
C/C++ code by caching previous compiles and detecting when
the same compile is being done again.
OPTIONS SUMMARY
Here is a summary of the options to ccache.
-s show statistics summary
-z zero statistics
-c run a cache cleanup
-C clear the cache completely
-F set maximum files in cache
-M set maximum size of cache (use G, M or K)
-h this help page
-V print version number
OPTIONS
These options only apply when you invoke ccache as
"ccache". When invoked as a compiler none of these options
apply. In that case your normal compiler options apply and
you should refer to your compilers documentation.
-h Print a options summary page
-s Print the current statistics summary for the cache.
The statistics are stored spread across the subdi-
rectories of the cache. Using "ccache -s" adds up
the statistics across all subdirectories and prints
the totals.
-z Zero the cache statistics.
-V Print the ccache version number
-c Clean the cache and re-calculate the cache file
count and size totals. Normally the -c option
should not be necessary as ccache keeps the cache
below the specified limits at runtime and keeps
statistics up to date on each compile. This option
is mostly useful if you manually modify the cache
contents or believe that the cache size statistics
may be inaccurate.
-C Clear the entire cache, removing all cached files.
-F maxfiles
This sets the maximum number of files allowed in
the cache. The value is stored inside the cache
directory and applies to all future compiles. Due
to the way the value is stored the actual value
used is always rounded down to the nearest multiple
of 16.
-M maxsize
This sets the maximum cache size. You can specify a
value in gigabytes, megabytes or kilobytes by
appending a G, M or K to the value. The default is
gigabytes. The actual value stored is rounded down
to the nearest multiple of 16 kilobytes.
INSTALLATION
There are two ways to use ccache. You can either prefix
your compile commands with "ccache" or you can create a
symbolic link between ccache and the names of your compil-
ers. The first method is most convenient if you just want
to try out ccache or wish to use it for some specific pro-
jects. The second method is most useful for when you wish
to use ccache for all your compiles.
To install for usage by the first method just copy ccache
to somewhere in your path.
To install for the second method do something like this:
cp ccache /usr/local/bin/
ln -s /usr/local/bin/ccache /usr/local/bin/gcc
ln -s /usr/local/bin/ccache /usr/local/bin/g++
ln -s /usr/local/bin/ccache /usr/local/bin/cc
This will work as long as /usr/local/bin comes before the
path to gcc (which is usually in /usr/bin). After
installing you may wish to run "which gcc" to make sure
that the correct link is being used.
Note! Do not use a hard link, use a symbolic link. A
hardlink will cause "interesting" problems.
EXTRA OPTIONS
When run as a compiler front end 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 that the
next option is definitely not a input filename, and should
be passed along to the compiler as-is.
The reason this can be important is that ccache does need
to parse the command line and determine what is an input
filename and what is a compiler option, as it needs the
input filename to determine the name of the resulting
object file (among other things). The heuristic ccache
uses in this parse is that any string on the command line
that exists as a file is treated as an input file name
(usually a C file). By using --ccache-skip you can force
an option to not be treated as an input file name and
instead be passed along to the compiler as a command line
option.
ENVIRONMENT VARIABLES
ccache uses a number of environment variables to control
operation. In most cases you won't need any of these as
the defaults will be fine.
CCACHE_DIR
the CCACHE_DIR environment variable specifies where
ccache will keep its cached compiler output. The
default is "$HOME/.ccache".
CCACHE_TEMPDIR
the CCACHE_TEMPDIR environment variable specifies
where ccache will put temporary files. The default
is the same as CCACHE_DIR. Note that the
CCACHE_TEMPDIR path must be on the same filesystem
as the CCACHE_DIR path, so that renames of files
between the two directories can work.
CCACHE_LOGFILE
If you set the CCACHE_LOGFILE environment variable
then ccache will write some log information on
cache hits and misses in that file. This is useful
for tracking down problems.
CCACHE_PATH
You can optionally set CCACHE_PATH to a colon sepa-
rated path where ccache will look for the real com-
pilers. If you don't do this then ccache will look
for the first executable matching the compiler name
in the normal PATH that isn't a symbolic link to
ccache itself.
CCACHE_CC
You can optionally set CCACHE_CC to force the name
of the compiler to use. If you don't do this then
ccache works it out from the command line.
CCACHE_PREFIX
This option adds a prefix to the command line that
ccache runs when invoking the compiler. Also see
the section below on using ccache with distcc.
CCACHE_DISABLE
If you set the environment variable CCACHE_DISABLE
then ccache will just call the real compiler,
bypassing the cache completely.
CCACHE_READONLY
the CCACHE_READONLY environment variable tells
ccache to attempt to use existing cached object
files, but not to try to add anything new to the
cache. If you are using this because your
CCACHE_DIR is read-only, then you may find that you
also need to set CCACHE_TEMPDIR as otherwise ccache
will fail to create the temporary files.
CCACHE_CPP2
If you set the environment variable CCACHE_CPP2
then ccache will not use the optimisation of avoid-
ing the 2nd call to the pre-processor by compiling
the pre-processed output that was used for finding
the hash in the case of a cache miss. This is pri-
marily a debugging option, although it is possible
that some unusual compilers will have problems with
the intermediate filename extensions used in this
optimisation, in which case this option could allow
ccache to be used.
CCACHE_NOSTATS
If you set the environment variable CCACHE_NOSTATS
then ccache will not update the statistics files on
each compile.
CCACHE_NLEVELS
The environment variable CCACHE_NLEVELS allows you
to choose the number of levels of hash in the cache
directory. The default is 2. The minimum is 1 and
the maximum is 8.
CCACHE_HARDLINK
If you set the environment variable CCACHE_HARDLINK
then ccache will attempt to use hard links from the
cache directory when creating the compiler output
rather than using a file copy. Using hard links is
faster, but can confuse programs like 'make' that
rely on modification times.
CCACHE_RECACHE
This forces ccache to not use any cached results,
even if it finds them. New results are still
cached, but existing cache entries are ignored.
CCACHE_UMASK
This sets the umask for ccache and all child pro-
cesses (such as the compiler). This is mostly use-
ful when you wish to share your cache with other
users. Note that this also affects the file permis-
sions set on the object files created from your
compilations.
CCACHE_HASHDIR
This tells ccache to hash the current working
directory when calculating the hash that is used to
distinguish two compiles. This prevents a problem
with the storage of the current working directory
in the debug info of a object file, which can lead
ccache to give a cached object file that has the
working directory in the debug info set incor-
rectly. This option is off by default as the incor-
rect setting of this debug info rarely causes prob-
lems. If you strike problems with gdb not using the
correct directory then enable this option.
CCACHE_UNIFY
If you set the environment variable CCACHE_UNIFY
then ccache will use the C/C++ unifier when hashing
the pre-processor output if -g is not used in the
compile. The unifier is slower than a normal hash,
so setting this environment variable loses a little
bit of speed, but it means that ccache can take
advantage of not recompiling when the changes to
the source code consist of reformatting only. Note
that using CCACHE_UNIFY changes the hash, so cached
compiles with CCACHE_UNIFY set cannot be used when
CCACHE_UNIFY is not set and vice versa. The reason
the unifier is off by default is that it can give
incorrect line number information in compiler warn-
ing messages.
CCACHE_EXTENSION
Normally ccache tries to automatically determine
the extension to use for intermediate C pre-proces-
sor files based on the type of file being compiled.
Unfortunately this sometimes doesn't work, for
example when using the aCC compiler on HP-UX. On
systems like this you can use the CCACHE_EXTENSION
option to override the default. On HP-UX set this
environment variable to "i" if you use the aCC com-
piler.
CACHE SIZE MANAGEMENT
By default ccache has a one gigabyte limit on the cache
size and no maximum number of files. You can set a differ-
ent limit using the "ccache -M" and "ccache -F" options,
which set the size and number of files limits.
When these limits are reached ccache will reduce the cache
to 20% below the numbers you specified in order to avoid
doing the cache clean operation too often.
HOW IT WORKS
The basic idea is to detect when you are compiling exactly
the same code a 2nd time and use the previously compiled
output. You detect that it is the same code by forming a
hash of:
o the pre-processor output from running the compiler
with -E
o the command line options
o the real compilers size and modification time
o any stderr output generated by the compiler
These are hashed using md4 (a strong hash) and a cache
file is formed based on that hash result. When the same
compilation is done a second time ccache is able to supply
the correct compiler output (including all warnings etc)
from the cache.
ccache has been carefully written to always produce
exactly the same compiler output that you would get with-
out the cache. If you ever discover a case where ccache
changes the output of your compiler then please let me
know.
USING CCACHE WITH DISTCC
distcc is a very useful program for distributing compila-
tion across a range of compiler servers. It is often use-
ful to combine distcc with ccache, so that compiles that
are done are sped up by distcc, but that ccache avoids the
compile completely where possible.
To use distcc with ccache I recommend using the
CCACHE_PREFIX option. You just need to set the environment
variable CCACHE_PREFIX to 'distcc' and ccache will prefix
the command line used with the compiler with the command
'distcc'.
SHARING A CACHE
A group of developers can increase the cache hit rate by
sharing a cache directory. The hard links however cause
unwanted side effects, as all links to a cached file share
the file's modification timestamp. This results in false
dependencies to be triggered by timestamp-based build sys-
tems whenever another user links to an existing file. Typ-
ically, users will see that their libraries and binaries
are relinked without reason. To share a cache without
side effects, the following conditions need to be met:
o Use the same CCACHE_DIR environment variable set-
ting
o Set the CCACHE_NOLINK environment variable
o Make sure everyone sets the CCACHE_UMASK environ-
ment variable to 002, this ensures that cached
files are accessible to everyone in the group.
o Make sure that all users have write permission in
the entire cache directory (and that you trust all
users of the shared cache).
o Make sure that the setgid bit is set on all direc-
tories in the cache. This tells the filesystem to
inherit group ownership for new directories. The
command "chmod g+s `find $CCACHE_DIR -type d`"
might be useful for this.
HISTORY
ccache was inspired by the compilercache shell script
script written by Erik Thiele and I would like to thank
him for an excellent piece of work. See
http://www.erikyyy.de/compilercache/ for the Erik's
scripts.
I wrote ccache because I wanted to get a bit more speed
out of a compiler cache and I wanted to remove some of the
limitations of the shell-script version.
DIFFERENCES FROM COMPILERCACHE
The biggest differences between Erik's compilercache
script and ccache are:
o ccache is written in C, which makes it a bit faster
(calling out to external programs is mostly what
slowed down the scripts).
o ccache can automatically find the real compiler
o ccache keeps statistics on hits/misses
o ccache can do automatic cache management
o ccache can cache compiler output that includes
warnings. In many cases this gives ccache a much
higher cache hit rate.
o ccache can handle a much wider ranger of compiler
options
o ccache avoids a double call to cpp on a cache miss
BUGS
When the cache is stored on an NFS filesystem, the
filesystem must be exported with the no_subtree_check
option to make renames between directories reliable.
CREDITS
Thanks to the following people for their contributions to
ccache
o Erik Thiele for the original compilercache script
o Luciano Rocha for the idea of compiling the pre-
processor output to avoid a 2nd cpp pass
o Paul Russell for many suggestions and the debian
packaging
AUTHOR
ccache was written by Andrew Tridgell
http://samba.org/~tridge/
If you wish to report a problem or make a suggestion then
please email bugs@ccache.samba.org
ccache is released under the GNU General Public License
version 2 or later. Please see the file COPYING for
license details.
April 2002 ccache(1)