# Copyright 2022 The IREE Authors
#
# Licensed under the Apache License v2.0 with LLVM Exceptions.
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

# ccache (https://ccache.dev/) setup, with read/write + local/remote options.
#
# Defaults to only reading from the shared remote cache (hosted on GCS) used by
# our Linux CI. The postsubmit CI writes to the cache, for presubmit CI and
# local builds to read from.
#
# Local caches can also be used to interface with external remote caches
# (like https://github.com/actions/cache) by
#   1. downloading the cache directory
#   2. sourcing with IREE_READ_LOCAL_CCACHE=1 IREE_WRITE_LOCAL_CCACHE=[0,1]
#   3. building with CMake
#   4. uploading the cache directory (if writing)
#
# Note: this file must be *sourced* not executed.

set -euo pipefail

# Configuration environment variables.
IREE_READ_REMOTE_CCACHE="${IREE_READ_REMOTE_CCACHE:-1}"
IREE_WRITE_REMOTE_CCACHE="${IREE_WRITE_REMOTE_CCACHE:-0}"
IREE_READ_LOCAL_CCACHE="${IREE_READ_LOCAL_CCACHE:-0}"
IREE_WRITE_LOCAL_CCACHE="${IREE_WRITE_LOCAL_CCACHE:-0}"

if (( ${IREE_WRITE_REMOTE_CCACHE} == 1 && ${IREE_READ_REMOTE_CCACHE} != 1 )); then
  echo "Can't have 'IREE_WRITE_REMOTE_CCACHE' (${IREE_WRITE_REMOTE_CCACHE})" \
       " set without 'IREE_READ_REMOTE_CCACHE' (${IREE_READ_REMOTE_CCACHE})"
fi
if (( ${IREE_WRITE_LOCAL_CCACHE} == 1 && ${IREE_READ_LOCAL_CCACHE} != 1 )); then
  echo "Can't have 'IREE_WRITE_LOCAL_CCACHE' (${IREE_WRITE_LOCAL_CCACHE})" \
       " set without 'IREE_READ_LOCAL_CCACHE' (${IREE_READ_LOCAL_CCACHE})"
fi

if (( IREE_READ_REMOTE_CCACHE == 1 || IREE_READ_LOCAL_CCACHE == 1 )); then
  export IREE_USE_CCACHE=1
  export CMAKE_C_COMPILER_LAUNCHER="$(which ccache)"
  export CMAKE_CXX_COMPILER_LAUNCHER="$(which ccache)"

  # LLVM builds with precompiled headers by default when using Clang >= 18.
  # ccache refuses to cache any compilation that uses a PCH
  export CCACHE_SLOPPINESS="${CCACHE_SLOPPINESS:+${CCACHE_SLOPPINESS},}pch_defines,time_macros"

  ccache --zero-stats
  ccache --show-stats
else
  export IREE_USE_CCACHE=0
fi

if (( IREE_READ_LOCAL_CCACHE == 1 && IREE_WRITE_LOCAL_CCACHE == 0 )); then
  export CCACHE_READONLY=1
fi

if (( IREE_READ_REMOTE_CCACHE == 1 && IREE_READ_LOCAL_CCACHE == 0 )); then
  export CCACHE_REMOTE_ONLY=1
fi

if (( IREE_READ_REMOTE_CCACHE == 1 )); then
  export CCACHE_REMOTE_STORAGE="http://storage.googleapis.com/iree-sccache/ccache"
  if (( IREE_WRITE_REMOTE_CCACHE == 1 )); then
    set +x # Don't leak the token (even though it's short-lived)
    export CCACHE_REMOTE_STORAGE="${CCACHE_REMOTE_STORAGE}|bearer-token=${IREE_CCACHE_GCP_TOKEN}"
    set -x
  else
    export CCACHE_REMOTE_STORAGE="${CCACHE_REMOTE_STORAGE}|read-only"
  fi
fi
