# Copyright 2021 The Pigweed Authors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.
import("//build_overrides/pigweed.gni")
import("//build_overrides/pigweed_environment.gni")
import("$dir_pw_toolchain/rbe.gni")

_default_llvm_prefix = ""
_default_rust_prefix = ""

# If Pigweed's CIPD environment setup was run, assume a LLVM toolchain and Rust
# compiler are present there.
if (defined(pw_env_setup_CIPD_PIGWEED)) {
  _default_llvm_prefix = pw_env_setup_CIPD_PIGWEED + "/bin/"
  _default_rust_prefix = pw_env_setup_CIPD_PIGWEED + "/rust/bin/"
}

declare_args() {
  # This flag allows you to specify a prefix to use for clang, clang++,
  # and llvm-ar binaries to use when compiling with a clang-based toolchain.
  # This is useful for debugging toolchain-related issues by building with an
  # externally-provided toolchain.
  #
  # Pigweed toolchains should NOT override this variable so projects or users
  # can control it via `.gn` or by setting it as a regular gn argument (e.g.
  # `gn gen --args='pw_toolchain_CLANG_PREFIX=/path/to/my-llvm-'`).
  #
  # Examples:
  #   pw_toolchain_CLANG_PREFIX = ""
  #   command: "clang" (from PATH)
  #
  #   pw_toolchain_CLANG_PREFIX = "my-"
  #   command: "my-clang" (from PATH)
  #
  #   pw_toolchain_CLANG_PREFIX = "/bin/my-"
  #   command: "/bin/my-clang" (absolute path)
  #
  #   pw_toolchain_CLANG_PREFIX = "//environment/clang_next/"
  #   command: "../environment/clang_next/clang" (relative path)
  #
  # GN templates should use `pw_toolchain_clang_tools.*` to get the intended
  # command string rather than relying directly on pw_toolchain_CLANG_PREFIX.
  #
  # If the prefix begins with "//", it will be rebased to be relative to the
  # root build directory.
  pw_toolchain_CLANG_PREFIX = _default_llvm_prefix

  # This flag allows you to specify a prefix for rustc.
  #
  # This follows the same rules as pw_toolchain_CLANG_PREFIX, see above for
  # more information.
  #
  # If the prefix begins with "//", it will be rebased to be relative to the
  # root build directory.
  pw_toolchain_RUST_PREFIX = _default_rust_prefix
}

pw_toolchain_clang_tools = {
  ar = "llvm-ar"
  cc = "clang"
  cxx = "clang++"
  ld = cxx
  llvm_cov = "llvm-cov"
  llvm_profdata = "llvm-profdata"
  rustc = "rustc"

  _toolchain_prefix = pw_toolchain_CLANG_PREFIX
  if (_toolchain_prefix != "") {
    # If the prefix is a GN-absolute path, rebase it so it's relative to the
    # root of the build directory.
    _split_prefix = string_split(_toolchain_prefix, "//")
    if (_split_prefix[0] == "") {
      _toolchain_prefix = rebase_path(_toolchain_prefix, root_build_dir)
    }
    if (host_os == "win") {
      _toolchain_prefix = "./" + _toolchain_prefix
      _toolchain_prefix = string_replace(_toolchain_prefix, "/", "\\")
    }
    ar = _toolchain_prefix + ar
    cc = _toolchain_prefix + cc
    cxx = _toolchain_prefix + cxx
    ld = _toolchain_prefix + ld
    llvm_cov = _toolchain_prefix + llvm_cov
    llvm_profdata = _toolchain_prefix + llvm_profdata
  }

  _rust_prefix = pw_toolchain_RUST_PREFIX
  if (host_os == "win") {
    _rust_prefix = string_replace(_rust_prefix, "/", "\\")
  }
  if (_rust_prefix != "") {
    # If the prefix is a GN-absolute path, rebase it so it's relative to the
    # root of the build directory.
    _split_rust_prefix = string_split(_rust_prefix, "//")
    if (_split_rust_prefix[0] == "") {
      _rust_prefix = rebase_path(_rust_prefix, root_build_dir)
    }
    rustc = _rust_prefix + rustc
  }

  if (pw_toolchain_USE_RBE) {
    _rbe_debug_flag = ""
    if (pw_toolchain_RBE_DEBUG) {
      _rbe_debug_flag = " -v"
    }
    _exec_root = rebase_path("//")
    _rewrapper_binary = "rewrapper"
    _pw_rbe_config = pw_rbe_clang_config
    _rbe_toolchain_prefix =
        _rewrapper_binary +
        " --labels=type=compile,lang=cpp,compiler=clang --cfg=" +
        _pw_rbe_config + " --exec_root=" + _exec_root + " -- "

    cc = _rbe_toolchain_prefix + cc + _rbe_debug_flag
    cxx = _rbe_toolchain_prefix + cxx + _rbe_debug_flag
  }
}
