# Copyright 2014 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/toolchain/goma.gni")
import("//build/toolchain/rbe.gni")

# Defines the configuration of cc wrapper
# ccache: a c/c++ compiler cache which can greatly reduce recompilation times.
# icecc, distcc: it takes compile jobs from a build and distributes them among
#                remote machines allowing a parallel build.
#
# TIPS
#
# 1) ccache
# Set clang_use_chrome_plugins=false if using ccache 3.1.9 or earlier, since
# these versions don't support -Xclang.  (3.1.10 and later will silently
# ignore -Xclang, so it doesn't matter if you disable clang_use_chrome_plugins
# or not).
#
# Use ccache 3.2 or later to avoid clang unused argument warnings:
# https://bugzilla.samba.org/show_bug.cgi?id=8118
#
# To avoid -Wparentheses-equality clang warnings, at some cost in terms of
# speed, you can do:
# export CCACHE_CPP2=yes
#
# 2) icecc
# Set clang_use_chrome_plugins=false because icecc cannot distribute custom
# clang libraries.
#
# To use icecc and ccache together, set cc_wrapper = "ccache" with
# export CCACHE_PREFIX=icecc

declare_args() {
  # Set to "ccache", "icecc" or "distcc".  Probably doesn't work on windows.
  cc_wrapper = ""

  if (is_starboard) {
    enable_sccache = getenv("SCCACHE") == "1"
  }
}

if (is_starboard) {
  declare_args() {
    # Set to false to completely ignore the cc_wrapper.
    enable_cc_wrapper = true
  }
  assert(enable_cc_wrapper || cc_wrapper == "",
         "Do not set `cc_wrapper` if you set `enable_cc_wrapper` to false.")
}

if (is_starboard && getenv("SCCACHE") == "") {
  enable_sccache = host_os == "win" && cobalt_fastbuild
}

if (is_starboard && enable_sccache) {
  _set_sccache_gcs_bucket = getenv("SCCACHE_GCS_BUCKET") != ""
  _set_sccache_gcs_key_path = getenv("SCCACHE_GCS_KEY_PATH") != ""
  _set_sccache_gcs_oauth_url = getenv("SCCACHE_GCS_OAUTH_URL") != ""
  _set_sccache_gcs_rw_mode = getenv("SCCACHE_GCS_RW_MODE") != ""
  _set_sccache_dir = getenv("SCCACHE_DIR") != ""
  assert(_set_sccache_dir ||
             (_set_sccache_gcs_bucket &&
                  (_set_sccache_gcs_key_path || _set_sccache_gcs_oauth_url) &&
                  _set_sccache_gcs_rw_mode),
         "Set Sccache environment variables before use.")
}

if (is_starboard && cc_wrapper == "" && enable_cc_wrapper) {
  # TODO(https://crbug.com/gn/273): Use sccache locally as well.
  if (enable_sccache) {
    cc_wrapper = "sccache"
  } else if (host_os != "win") {
    cc_wrapper = "ccache"
  }
  print("Build Accelerator: " + cc_wrapper)
}

assert(!use_goma || cc_wrapper == "",
       "use_goma and cc_wrapper can not be used together.")
assert(!use_remoteexec || cc_wrapper == "",
       "use_remoteexec and cc_wrapper can not be used together.")
