# 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",
    ]

    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,
      ]
    }

    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

    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"),
      ]
    }
  }
}
