----------
Unreleased
-High-level summary of changes (work in progress)
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- Compilation results are now stored in single aggregated files; before up to
- seven files per cached result were used.
+Tooling
+~~~~~~~
+
+- CMake is now used instead of Autoconf for build configuration.
+
+- A C++11 compiler, a C99 compiler and CMake 3.4.3 or newer are now required to
+ build ccache.
+
+- Ccache can now be built using Microsoft Visual C++.
+
+
+Functional changes
+~~~~~~~~~~~~~~~~~~
-- Result and manifest files are now compressed by the real-time compression
- algorithm Zstandard by default.
+- All data of a cached result is now stored in a single file called “result”
+ instead of up to seven files. This reduces i-node usage and improves data
+ locality.
-- BLAKE3 is now used instead of MD4 for hashing input.
+- Added compression of result and manifest files using the
+ http://zstd.net[Zstandard] algorithm. Compression is enabled by default with
+ compression level 1. This makes ccache able to store more data in the cache.
+ Previously compression with zlib (deflate) was available but disabled by
+ default. Files can be recompressed with a another compression level later
+ with the `-X/--recompress` option described further below.
-- Added checksumming of result files using XXH3 to detect data corruption.
+- Switched to use the https://blake3.io[BLAKE3] algorithm instead of MD4 for
+ hashing input. This improves performance and reduces the risk of hash
+ collisions.
-- Made the hard link mode less error prone.
+- Added checksumming of result and manifest files using the
+ http://xxhash.com[XXH3] algorithm to detect data corruption.
-- Added opt-in support for using file cloning (on Btrfs/XFS/APFS) to copy data
- to and from the cache.
+- Ccache now follows the
+ https://specifications.freedesktop.org/basedir-spec/[XDG base directory
+ specification]. This means that the default cache directory on Unix systems
+ is `$XDG_CACHE_HOME/ccache` (with `$HOME/.cache/ccache` as the fallback if
+ `XDG_CACHE_HOME` is not set) and the configuration file is
+ `$XDG_CONFIG_HOME/ccache/ccache.conf` (with
+ `$HOME/.config/ccache/ccache.conf` as the fallback). On macOS, the fallbacks
+ are `$HOME/Library/Caches/ccache` and
+ `$HOME/Library/Preferences/ccache/ccache.conf`. On Windows, the fallbacks are
+ `%APPDATA%/ccache` and `%APPDATA%/ccache/ccache.conf`. Exception: If the
+ legacy `$HOME/.ccache` directory exists, that directory is used for the
+ default cache location and `$HOME/.ccache/ccache.conf` for the configuration
+ file.
-- A C++11 compiler is now required to build ccache.
+- Cache statistics are now stored in files on cache level 2 to reduce lock
+ contention when there are many parallel compilations.
-- Build tooling switched from Autoconf to CMake.
+- An appropriate cache directory level structure is now chosen automatically.
+ The `cache_dir_levels` (`CCACHE_NLEVELS`) configuration option has therefore
+ been removed.
-- Added a `-x/--show-compression` option which shows some statistics about
- cache compression.
+- Added an experimental “inode cache” for file hashes, allowing computed hash
+ values to be reused both within and between builds. The inode cache is off by
+ default but can be enabled by setting `inode_cache` (`CCACHE_INODECACHE`) to
+ `true`.
-- Added a `-X/--recompress` option which can be used to recompress the cache
- data with another compression level (or make it uncompressed). If you choose
- to disable compression by default or to use a level with a low compression
- ratio, you can recompress the cache with a higher compression level after the
- build or at another time when there are more CPU cycles available, for
- instance every night.
+- Added support for using file cloning (AKA “reflinks”) on Btrfs, XFS and APFS
+ to copy data to and from the cache very efficiently.
+
+- Two measures have been implemented to make the hard link mode safer:
+ hard-linked files are made read-only and inadvertent content changes that
+ affect file size are detected.
+
+- Added a command line option `-x/--show-compression` which shows statistics
+ about cache compression.
+
+- Added a command line option `-X/--recompress` which can be used to recompress
+ the cache data with another compression level or make it uncompressed. If you
+ choose to disable compression by default, or to use a compression level with
+ a low compression ratio, you can recompress the cache with a higher
+ compression level after the build or at another time when there are more CPU
+ cycles available, for instance every night.
+
+- Added a command line option `--evict-older-than` which can be used to remove
+ cache entries older than a certain age.
+
+- Added a command line option `-d/--directory` which can be used to specify
+ cache directory to operate on instead of having to set `CCACHE_DIR`
+ temporarily.
- A progress bar has been added to show the progress of time-consuming options
- like `-c/--cleanup`, `-C/--clear`, `-x/--show-compression` and
- `-X/--recompress`.
+ like `-c/--cleanup`, `-C/--clear`, `--evict-older-than`,
+ `-x/--show-compression` and `-X/--recompress`.
- When supported by the CPU, a SIMD-friendly (using AVX2) algorithm is now used
- to scan input source code for `__DATE__` and `__TIME__` macros. This can
- decrease the number of CPU cycles for a direct cache hit with up to 15% in
- some cases.
+ to scan input source code for `__DATE__`, `__TIME__` and `__TIMESTAMP__`
+ macros. This can decrease the number of CPU cycles for a direct cache hit
+ with up to 15% in some cases.
-- Added a new inode cache for file hashes, allowing computed hash values to be
- reused both within and between builds.
+- Some unnecessary `stat(2)` system calls are now avoided when verifying header
+ files.
- Compiler diagnostic messages are now always cached in color, and ccache
- strips the color codes on the fly when requested explicitly by command-line
+ strips the color codes on the fly when requested explicitly by a command-line
option or when stderr does not refer to a TTY. This allows IDEs and terminals
to share cached compilation results.
-- (More to be written.)
+- Added optional logging to syslog.
+
+- The compiler option `-fmodules` is now handled in “depend mode”. If “depend
+ mode” is disabled the option is still considered too hard and ccache will
+ fall back to running the compiler.
+
+- `realpath(3)` is no longer used for normalization when computing relative
+ paths. This makes it possible to get cache hits when the source or build
+ directory is a symbolic link to an absolute path that includes unstable
+ information like build IDs or timestamps.
+
+- Added a new `ignore_options` (`CCACHE_IGNOREOPTIONS`) configuration option
+ which makes it possible to exclude compiler options from the hash.
+
+- Added an `absolute_paths_in_stderr` (`CCACHE_ABSSTDERR`) configuration option
+ which, if set, makes ccache rewrite absolute paths in compiler warnings and
+ errors to relative.
+
+- Improved handling of umask. The configured `umask` (`CCACHE_UMASK`) is now
+ only applied to files and directories in the cache directory. Previously the
+ umask was applied to all files produced by ccache and the executed compiler.
+
+- Ccache is now able to share cache entries for different object file names
+ when using `-MD` or `-MMD`.
+
+- Clang’s `-Xclang` (used by CMake for precompiled headers),
+ `-fno-pch-timestamp`, `-emit-pch`, `-emit-pth` and `-include-pth` options are
+ now understood.
+
+- Added support for the HIP (“C++ Heterogeneous-Compute Interface for
+ Portability”) language.
+
+- The manifest format now allows for header files larger than 4 GiB.
+
+- Made it possible to once again cache compilations with `__DATE__` in the
+ source code.
+
+- Added handling of the `__TIMESTAMP__` macro.
+
+- An absolute input source path is now rewritten to a relative path when using
+ `base_dir`.
+
+- `waitpid` system calls interrupted by a signal are now handled correctly.
+
+- Made handling of `.dwo` files and interaction between `-gsplit-dwarf` and
+ other `-g*` options more robust.
+
+- The “couldn't find compiler” statistics counter is no longer incremented when
+ ccache exits with a fatal error.
+
+- Failure to run a `compiler_check` command is no longer a fatal error.
+
+- Added command line options `--dump-result` and `--extract-result` for
+ inspecting and extracting result files.
+
+- Added a command line option `--checksum-file` for debugging or evaluating the
+ checksum algorithm.
+
+- Improved error message for “ccache -o=K=V” (trying to set a configuration
+ option named “=K”).
+
+- Made timestamps in statistics files Y2038-proof.
+
+- Removed code for populating a newly created configuration file with cache
+ size values for cache directories created by ccache versions older than 3.2
+ (released 2014).
+
+- Removed knowledge about a top-level stats file created by ccache versions
+ older than 3.1 (released 2010).
+
+
+Other improvements
+~~~~~~~~~~~~~~~~~~
+
+- Improved help text and documentation of command line options.
+
+- Improved documentation of the `base_dir` configuration option.
+
+- Improved documentation of preprocessor and direct modes.
+
+- Added HTML anchors to configuration options in the manual so that it is
+ possible to construct a URL to a specific item.
+
+- Tweaked placement of “(readonly)” in output of `ccache -s`.
+
+- Improved visibility of color output from the test suite.
+
+- Fixed test suite problems on macOS.
+
+- Disabled hardlink tests on AFS since it lacks such support.
+
+- Disabled read-only tests on file systems that lack such support.
ccache 3.7.12