# 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")
}

default_rustc_prefix =
    rebase_path("//prebuilt/third_party/rust/${host_platform}/bin",
                root_build_dir)

declare_args() {
  # Sets a custom base directory for `rustc` and `cargo`.
  # This can be used to test custom Rust toolchains.
  rustc_prefix = default_rustc_prefix

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

  # Sets the panic type for Rust on fuchsia.
  # Valid values are "unwind" and "abort".
  rust_panic = "abort"

  # 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 = ""
}

assert(rust_panic == "unwind" || rust_panic == "abort",
       "rust_panic was neither 'unwind' nor 'panic'")

# Always use panic=unwind on host, or proc macros won't work.
if (!is_fuchsia) {
  rust_panic = "unwind"
}

_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 == "unknown" && current_cpu == "wasm32"),
    "current_os was neither mac, linux, unknown, nor fuchsia")
assert(
    current_cpu == "x64" || current_cpu == "arm64" || current_cpu == "wasm32")
if (current_os == "mac") {
  _suffix = "apple-darwin"
} else if (current_os == "linux") {
  _suffix = "unknown-linux-gnu"
} else if (current_os == "fuchsia") {
  _suffix = rust_toolchain_triple_suffix
}
if (current_cpu == "x64") {
  rust_target = "x86_64-${_suffix}"
} else if (current_cpu == "arm64") {
  rust_target = "aarch64-${_suffix}"
} else if (current_cpu == "wasm32" && current_os == "unknown") {
  rust_target = "wasm32-unknown-unknown"
}

_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=$rust_target",
                                   "-print-resource-dir",
                                 ],
                                 "trim string",
                                 [])

# rust_config collects common arguments and dependencies for rustc builds
cmake_dir = rebase_path("//prebuilt/third_party/cmake/${host_platform}/bin")
rust_build_args =
    [
      "--rustc",
      "$rustc_prefix/rustc",
      "--cmake-dir",
      cmake_dir,
      "--lib-dir",
      rebase_path(get_label_info(":any($shlib_toolchain)", "root_out_dir")),
      "--target",
      rust_target,
      "--sysroot",
      _sysroot,
      "--clang_prefix",
      clang_prefix_rebased,
      "--clang-resource-dir",
      clang_resource_dir,
      "--symbol-level",
      "$symbol_level",
      "--panic",
      rust_panic,
    ] + _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",
]
