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
- 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
- It's backwards compatible with the existing environment variables.

I expect that the overhead of reading the configuration file(s) will be

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
  - 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.


[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
[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
ccache mailing list

Reply via email to