#
# Copyright OpenEmbedded Contributors
#
# SPDX-License-Identifier: MIT
#

#
# Usage:
# - Enable ccache
#   Add the following line to a conffile such as conf/local.conf:
#   INHERIT += "ccache"
#
# - Disable ccache for a recipe
#   Add the following line to the recipe if it can't be built with ccache:
#   CCACHE_DISABLE = '1'
#
# - Share ccache files between different builds
#   Set CCACHE_TOP_DIR to a shared dir
#   CCACHE_TOP_DIR = /path/to/shared_ccache/
#
# - TO debug ccahe
#   export CCACHE_DEBUG = "1"
#   export CCACHE_LOGFILE = "${CCACHE_DIR}/logfile.log"
#   And also set PARALLEL_MAKE = "-j 1" to get make the log in order
#

# Set it to a shared location for different builds, so that cache files can
# be shared between different builds.
CCACHE_TOP_DIR ?= "${TMPDIR}/ccache"

# ccahe removes CCACHE_BASEDIR from file path, so that hashes will be the same
# in different builds.
export CCACHE_BASEDIR ?= "${TMPDIR}"

# Used for sharing cache files after compiler is rebuilt
export CCACHE_COMPILERCHECK ?= "%compiler% -dumpspecs"

export CCACHE_CONFIGPATH ?= "${COREBASE}/meta/conf/ccache.conf"

export CCACHE_DIR ?= "${CCACHE_TOP_DIR}/${MULTIMACH_TARGET_SYS}/${PN}"

# Fixed errors:
# ccache: error: Failed to create directory /run/user/0/ccache-tmp: Permission denied
export CCACHE_TEMPDIR ?= "${CCACHE_DIR}/tmp"

# We need to stop ccache considering the current directory or the
# debug-prefix-map target directory to be significant when calculating
# its hash. Without this the cache would be invalidated every time
# ${PV} or ${PR} change.
export CCACHE_NOHASHDIR ?= "1"

python() {
    """
    Enable ccache for the recipe
    """
    pn = d.getVar('PN')
    # quilt-native doesn't need ccache since no c files
    if not (bb.data.inherits_class("native", d) or
            bb.utils.to_boolean(d.getVar('CCACHE_DISABLE'))):
        d.appendVar('DEPENDS', ' ccache-native')
        d.setVar('CCACHE', 'ccache ')
}

addtask cleanccache after do_clean
python do_cleanccache() {
    import shutil

    ccache_dir = d.getVar('CCACHE_DIR')
    if os.path.exists(ccache_dir):
        bb.note("Removing %s" % ccache_dir)
        shutil.rmtree(ccache_dir)
    else:
        bb.note("%s doesn't exist" % ccache_dir)
}
addtask cleanall after do_cleanccache
do_cleanccache[nostamp] = "1"
