# Copyright 2018 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/config/clang/clang.gni")
import("//build/config/compiler.gni")
import("//build/config/sysroot.gni")
import("//build/fidl/toolchain.gni")
if (is_mac) {
  # For mac_sdk_min:
  import("//build/config/mac/mac_sdk.gni")
}

declare_args() {
  # Sets a custom base directory for `rustc` and `cargo`.
  # This can be used to test custom Rust toolchains.
  rustc_prefix = "//prebuilt/third_party/rust/${host_platform}/bin"

  # Sets the default LTO type for rustc bulids.
  rust_lto = ""

  # Sets the fuchsia toolchain target triple suffix (after arch)
  rust_toolchain_triple_suffix = "fuchsia"

  # Sets whether Rust compiler warnings cause errors or not.
  # "deny" will make all warnings into errors, "warn" presents them as warnings, while "allow" will
  # ignore warnings
  rust_cap_lints = "deny"

  # Overrides the optimization level for all Rust builds, regardless of
  # debug/release flags or the `force_opt` arg to the rustc_ templates.
  # Valid values are 0-3, o, and z.
  rust_override_opt = ""

  # Overrides the LTO setting for all Rust builds, regardless of
  # debug/release flags or the `with_lto` arg to the rustc_ templates.
  # Valid values are "none", "thin", and "fat".
  rust_override_lto = ""
}

_sysroot = sysroot
_sysroot_deps = []

# TODO(BLD-230): sysroot.gni should provide the correct label and path to the Fuchsia sysroot.
if (is_fuchsia) {
  _sysroot_deps = [ "//sdk:zircon_sysroot_export" ]
  _sysroot = rebase_path(
          "$root_out_dir/sdk/exported/zircon_sysroot/arch/$target_cpu/sysroot")
}

_std_deps = []
if (is_fuchsia) {
  _std_deps += [
    # These libraries are required by libstd.
    "//zircon/public/lib/backtrace",
    "//zircon/public/lib/fdio",
  ]
}

_platform_args = []
if (is_mac) {
  _platform_args += [
    "--mmacosx-version-min",
    mac_sdk_min,
  ]
}

assert(current_os == "mac" || current_os == "linux" || current_os == "fuchsia",
       "current_os was neither mac, linux, nor fuchsia")
if (current_os == "mac") {
  _target = "x86_64-apple-darwin"
  assert(current_cpu == "x64")
} else if (current_os == "linux") {
  assert(current_cpu == "x64")
  _target = "x86_64-unknown-linux-gnu"
} else if (current_os == "fuchsia") {
  assert(current_cpu == "x64" || current_cpu == "arm64")
  if (current_cpu == "x64") {
    _target = "x86_64-$rust_toolchain_triple_suffix"
  } else if (current_cpu == "arm64") {
    _target = "aarch64-$rust_toolchain_triple_suffix"
  }
}

_host_os_cpu = "${host_os}-${host_cpu}"
if ("linux-x64" == _host_os_cpu) {
  host = "x86_64-unknown-linux-gnu"
} else if ("linux-arm64" == _host_os_cpu) {
  host = "aarch64-unknown-linux-gnu"
} else if ("mac-x64" == _host_os_cpu) {
  host = "x86_64-apple-darwin"
} else {
  assert(false, "Unsupported host os/cpu: ${_host_os_cpu}")
}

clang_prefix_rebased = rebase_path(clang_prefix, "", root_build_dir)

clang_resource_dir = exec_script(rebase_path("$clang_prefix_rebased/clang"),
                                 [
                                   "--target=$_target",
                                   "-print-resource-dir",
                                 ],
                                 "trim string",
                                 [])

# rust_config collects common arguments and dependencies for rustc builds
rust_build_args =
    [
      "--rustc",
      rebase_path("$rustc_prefix/rustc"),
      "--cmake-dir",
      rebase_path("//prebuilt/third_party/cmake/${host_platform}/bin"),
      "--lib-dir",
      rebase_path(get_label_info(":any($shlib_toolchain)", "root_out_dir")),
      "--target",
      _target,
      "--sysroot",
      _sysroot,
      "--clang_prefix",
      rebase_path(clang_prefix_rebased, "", root_build_dir),
      "--clang-resource-dir",
      clang_resource_dir,
      "--symbol-level",
      "$symbol_level",
    ] + _platform_args

rust_build_deps = _sysroot_deps + _std_deps

# We want to force a recompile of the Rust world whenever Rust toolchain
# changes since artifacts from an older version of the toolchain may or
# may not be compatible with newer ones.
# To achieve this, we insert a build dependency on the rust version.
rust_build_inputs = [
  "//prebuilt/third_party/rust/${host_platform}/.versions/rust.cipd_version",
]
