# Copyright 2017 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.

# Defines a Rust artifact
#
# Only for internal use, supporting rust_library and rust_binary.
template("rust_artifact") {

  if (defined(invoker.type)) {
    type = invoker.type
    assert(type == "bin" || type == "lib")
  } else {
    assert(false, "Must specify an artifact type")
  }

  if (defined(invoker.name)) {
    name = invoker.name
  } else {
    if (type == "lib") {
      name = exec_script("//build/rust/sanitize_target_name.py",
                         [ target_name ],
                         "trim string")
    } else {
      name = target_name
    }
  }

  rust_deps = []
  if (defined(invoker.deps)) {
    rust_deps = invoker.deps
  }

  source_dir = "."
  if (defined(invoker.source_dir)) {
    source_dir = invoker.source_dir
  }

  target_label = get_label_info(":$target_name", "label_no_toolchain")

  assert(current_os == "mac" || current_os == "linux" || current_os == "fuchsia")
  if (current_os == "mac") {
    target_triple = "x86_64-apple-darwin"
    assert(current_cpu == "x64")
  } else if (current_os == "linux") {
    assert(current_cpu == "x64")
    target_triple = "x86_64-unknown-linux-gnu"
  } else if (current_os == "fuchsia") {
    assert(current_cpu == "x64" || current_cpu == "arm64")
    if (current_cpu == "x64") {
      target_triple = "x86_64-unknown-fuchsia"
    } else if (current_cpu == "arm64") {
      target_triple = "aarch64-unknown-fuchsia"
    }
  }

  assert(host_cpu == "x64")
  assert(host_os == "mac" || host_os == "linux")
  if (host_os == "mac") {
    host_triple = "x86_64-apple-darwin"
  } else if (host_os == "linux") {
    host_triple = "x86_64-unknown-linux-gnu"
  }
  rust_base = "//buildtools/rust/rust-$host_triple"

  if (is_debug) {
    build_type = "debug"
  } else {
    build_type = "release"
  }

  if (type == "bin") {
    output_file = "$target_out_dir/$target_name.rust/$target_triple/$build_type/$name"
    output_depfile = "$output_file.d"
    build_target_name = "${target_name}_build"
  } else if (type == "lib") {
    output_base = "$target_out_dir/$target_name.rust/$target_triple/$build_type/lib$name"
    output_file = "$output_base.rmeta"
    output_depfile = "$output_base.d"
    build_target_name = target_name
  }

  main_target_name = target_name

  if (type == "bin") {
    copy(target_name) {
      sources = [
        output_file
      ]

      outputs = [
        "$root_out_dir/$name",
      ]

      deps = [
        ":$build_target_name",
      ]
    }
  }

  action(build_target_name) {
    script = "//build/rust/build_target.py"

    depfile = output_depfile

    inputs = [
      "${source_dir}/Cargo.toml",
      # This will trigger rebuilds whenever third-party crates are updated.
      "//third_party/rust-crates/.vendor-update.stamp",
    ]

    outputs = [
      output_file,
    ]
    if (type == "lib") {
      outputs += [
        "$target_gen_dir/$main_target_name.rust/$main_target_name.rust_name",
      ]
    }

    deps = rust_deps
    if (defined(invoker.non_rust_deps)) {
      deps += invoker.non_rust_deps
    }
    if (is_fuchsia) {
      clang_wrapper_target = "//rust/magenta-rs/tools:clang_wrapper($host_toolchain)"
      deps += [
        clang_wrapper_target,
      ]
    }

    if (defined(invoker.native_libs)) {
      native_libs = ["--native-libs"] + invoker.native_libs
    } else {
      native_libs = []
    }

    args = [
      "--type",
      type,
      "--name",
      name,
      "--out-dir",
      rebase_path("$target_out_dir/$main_target_name.rust"),
      "--gen-dir",
      rebase_path("$target_gen_dir/$main_target_name.rust"),
      "--root-out-dir",
      rebase_path(root_build_dir),
      "--root-gen-dir",
      rebase_path(root_gen_dir),
      "--crate-root",
      rebase_path(source_dir),
      "--cargo",
      rebase_path("$rust_base/bin/cargo"),
      "--rustc",
      rebase_path("$rust_base/bin/rustc"),
      "--target-triple",
      target_triple,
      "--label",
      target_label,
      "--cmake-dir",
      rebase_path("//buildtools/cmake/bin"),
      "--vendor-directory",
      rebase_path("//third_party/rust-crates/vendor"),
      "--deps",
    ] + rust_deps + native_libs

    if (!is_debug) {
      args += [
        "--release",
      ]
    }

    if (is_fuchsia) {
      wrapper_dir = get_label_info(clang_wrapper_target, "root_out_dir")
      args += [
        "--linker",
        rebase_path("$wrapper_dir/$target_triple-cc"),
      ]
    }
  }
}
