# 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/sysroot.gni")
import("//build/fidl/toolchain.gni")
if (is_mac) {
  # For mac_sdk_min:
  import("//build/config/mac/config.gni")
}

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

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

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

_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 = [ "//garnet/public/sdk:zircon_sysroot_export" ]
  _sysroot = rebase_path("$root_out_dir/sdks/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"
  }
}


if (is_debug) {
  _rust_opt_level = "0"
} else {
  _rust_opt_level = "z"
}

# rust_config collects common arguments and dependencies for rustc builds
rust_build_args = [
      "--rustc",
      rebase_path("$rustc_prefix/rustc"),
      "--cmake-dir",
      rebase_path("//buildtools/cmake/bin"),
      "--shared-libs-root",
      rebase_path(
          get_label_info("//default($shlib_toolchain)", "root_out_dir")),
      "--target",
      _target,
      "--sysroot",
      _sysroot,
      "--clang_prefix",
      rebase_path(clang_prefix, "", root_build_dir),
      "--opt-level",
      _rust_opt_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 = [
  "//buildtools/${host_platform}/rust/.versions/rust.cipd_version"
]
