# 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 the maximum lint level.
  # "deny" will make all warnings into errors, "warn" preserves them as warnings, and "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",
]
