#
# 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 ccache
#   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
#
# By default this class will only use ccache for target builds, and build
# our own ccache-native.  It is possible to use a host-provided ccache that
# can then be used by native recipes too by setting:
#   ASSUME_PROVIDED += "ccache-native"
#   HOSTTOOLS += "ccache"

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

# ccache-native and cmake-native have a circular dependency
# that affects other native recipes, but not all.
# Allows to use ccache in specified native recipes.
CCACHE_NATIVE_RECIPES_ALLOWED ?= ""

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

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

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

python() {
    """
    Enable ccache for the recipe
    """
    pn = d.getVar('PN')
    if (not bb.utils.to_boolean(d.getVar('CCACHE_DISABLE')) and
        ("ccache" in d.getVar("HOSTTOOLS").split() or
        pn in d.getVar('CCACHE_NATIVE_RECIPES_ALLOWED') or
        not bb.data.inherits_class("native", d))):
        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"
