[ccache] Configuration file plan
Joel Rosdahl
joel at rosdahl.net
Wed Apr 6 14:12:55 MDT 2011
Hi,
I would like to improve ccache's configurability. As you know, configuration of
ccache is today done by setting a bunch of environment variables, but that's
becoming increasingly messy; there are currently 24 CCACHE_* variables in the
development version of ccache. I think it's time to move settings to a
configuration file while keeping the ability to override configuration by
setting environment variables.
I actually envision two configuration files:
- <sysconfdir>/ccache.conf (typically /etc/ccache.conf)
- <ccachedir>/ccache.conf (typically $HOME/.ccache/ccache.conf)
ccache reads both (if they exist) each time it's run. Settings then have the
following priority:
1. Environment variables.
2. <ccachedir>/ccache.conf
3. <sysconfdir>/ccache.conf
4. Compile-time defaults.
This means that:
- The administrator can choose default settings for the system by editing
<sysconfdir>/ccache.conf.
- The user can override the system settings with his/her own default settings
by editing <ccachedir>/ccache.conf. (If <ccachedir> is shared by several
users, the settings are of course also shared.)
- The user can override the default settings temporarily by setting environment
variables.
- It's backwards compatible with the existing environment variables.
I expect that the overhead of reading the configuration file(s) will be
negligible.
The "max files" and "max size" settings (set by command-line options
-F/--max-files and -M/--max-size) are today stored in the "stats" files in the
cache, but these will find a much better place in <ccachedir>/ccache.conf.
I think the configuration file syntax should be a simple text format like this:
# A comment.
key = value
No quotes around strings (at least not mandatory). Whitespace is trimmed at the
beginning and end of values.
Mapping between environment variables and keys in the configuration files:
Environment variable Config key Type Default Note
-----------------------------------------------------------------------
CCACHE_BASEDIR base_dir string "" [1]
CCACHE_CC compiler string "" [2]
CCACHE_COMPILERCHECK compiler_check string mtime
CCACHE_COMPRESS compression boolean false
CCACHE_CPP2 run_second_cpp boolean false
CCACHE_DETECT_SHEBANG detect_shebang boolean false
CCACHE_DIR cache_dir string $HOME/.ccache
CCACHE_DIRECT direct_mode boolean true
CCACHE_DISABLE disable boolean false
CCACHE_EXTENSION cpp_extension string "" [3]
CCACHE_EXTRAFILES extra_files_to_hash string ""
CCACHE_HARDLINK hard_link boolean false
CCACHE_HASHDIR hash_dir boolean false
CCACHE_LOGFILE log_file string "" [4]
NEW CCACHE_MAXFILES max_files integer 0 [5]
NEW CCACHE_MAXSIZE max_size integer 1G [6]
CCACHE_NLEVELS cache_dir_levels integer 2
CCACHE_PATH path string "" [7]
CCACHE_PREFIX prefix_command string "" [8]
CCACHE_READONLY read_only boolean false
CCACHE_RECACHE recache boolean false
CCACHE_SLOPPINESS sloppiness string ""
CCACHE_STATS stats boolean true
CCACHE_TEMPDIR temporary_dir string "" [9]
CCACHE_UMASK umask integer - [10]
CCACHE_UNIFY unify boolean false
String and integer settings are handled in a straight-forward manner, but
boolean settings are a bit special for backward-compatibility reasons:
- A boolean CCACHE_FOO set to any value (even the empty string) means true;
unset means false.
- For each boolean CCACHE_FOO, there is also a CCACHE_NOFOO with the inverse
logic. CCACHE_FOO (if set) has higher priority than CCACHE_NOFOO. (Some
settings are quite silly in their NO variant, but I think it's worth it for
consistency.)
- The possible values of a boolean setting in the configuration file are
spelled "true" and "false".
$VARIABLE and ${VARIABLE} references will be expanded as expected in variables
that specify paths.
Notes:
[1] The empty string means "don't rewrite absolute paths".
[2] The empty string means find compiler from the command line.
[3] The empty string means auto-detect.
[4] The empty string means no logging.
[5] New setting corresponding to the old -F command-line option. 0 means
unlimited.
[6] New setting corresponding to the old -M command-line option. 0 means
unlimited. Suffix G, M or K may be used; default suffix: G.
[7] The empty string means use the normal PATH.
[8] The empty string means no prefix.
[9] The empty string means "use <cache_dir>/tmp".
[10] Not set means "don't change the umask". The integer is interpreted as an
octal number.
New command-line options to ccache:
-o, --set-option=K=V set configuration setting K to V
-p, --print-config print current configuration settings
The -F and -M command-line options will update the configuration file instead
of the stats file (and those entries in the stats files will become obsolete).
What do you think? Comments are welcome!
-- Joel
More information about the ccache
mailing list