[ccache] Possible to merge ccache dirs?

Michael Bazzinotti bazz at bazz1.com
Wed Jan 17 09:30:00 UTC 2018

On 15/01/18 20:44 +0100, Joel Rosdahl wrote:
>On 14 January 2018 at 12:01, Michael Bazzinotti via ccache
><ccache at lists.samba.org> wrote:

>Try something like this:
>    cd ~mainuser/.ccache
>    cp -a --parents ? ~root/.ccache
>    ccache -c


Thanks for the tip. I had mistakenly expected `cp` to overwrite dest dirs
having the same name, rather than merge, but that is not the case

That's clever, using the ? pattern. I hadn't learned it until now.

I suppose the ccache file naming scheme assures files with the 
same name in different cache's would refer to the same data afterall, huh.

Now, here are the verbatim commands I had used to merge to one shared cache:

    # cd ~/.ccache
    cp -a --parents ? ~bazz/.ccache
    find $CCACHE_DIR -type d | xargs chmod g+s
    chown -R bazz:wheel ~bazz/.ccache
    chmod -R o=rwx,g=rwx,o=rx ~bazz/.ccache

Note: CCACHE_DIR pointed to ~bazz/.ccache

That got the root cache into the mainuser's cache, and then set proper
permissions on all the files for a shared cache.

To anyone reading, I would like to share further info!

The ? is a bash special pattern character that matches any one
character. So that means only the cache directories are copied and not
the configuration file or the tmp directory from the source cache.

I tried turning my verbatim lines into a script that anyone can use
to merge 2 ccache directories into a shared cache. I suppose you could
chain run it several times invoking different settings to merge >2 caches.

    # DISCLAIMER: untested; use at your own risk.
    # adjust these settings

    # $dst_cache does *not* need to be in a home directory
    # use $dst_user to specify (desired) owner of the files in dst_cache.

    cd "${src_cache}"
    cp -a --parents ? "${dst_cache}"
    # Alter permissions for cache-sharing on dst_cache
    chown -R ${dst_user}:${shr_group} "${dst_cache}"
    chmod -R o=rwx,g=rwx,o=rx "${dst_cache}"
    # Make sure dst_cache folders are still setgid
    find "${dst_cache}" -type d | xargs chmod g+s
    # ccache -c

After running the script, you can remove the source cache if things went

After ensuring your ccache settings point to dst_cache,

    `ccache -c`

I'd like to share how I have my ccache settings shared to all users on my


    export CCACHE_DIR=/home/bazz/.ccache
    export CCACHE_UMASK='002'
    export CCACHE_TEMPDIR=/tmp
    export CCACHE_MAXSIZE=10G
    #export CCACHE_LOGFILE=/tmp/ccache.log
    export CC="ccache gcc"
    export CXX="ccache g++"

I use the symlink method to get ccache invoked as well, which is
documented in ccache already. I'm not sure if invoking ccache through both
symlink and env variables introduces any issues, yet I haven't had a

Let that help someone.

Michael Bazzinotti
Technologist & Musician

More information about the ccache mailing list