# 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/rust/rustc_artifact.gni")

# Defines a Rust static library
#
# Parameters
#
#   name
#     Name of the crate as defined in its manifest file. If not specified, it is
#     assumed to be the same as the target name.
#
#   version
#     Semver version of the crate as seen on crates.io.
#
#   deps (optional)
#     List of rust_library GN targets on which this crate depends.
#     Third party crates can be included through paths like
#     "//third_party/rust-crates/rustc_deps:<cratename>",
#
#   non_rust_deps (optional)
#     List of non-rust_library GN targets on which this crate depends.
#
#   with_unit_tests (optional)
#     Builds unit tests associated with the binary. This will create a
#     `<name>-bin-unit-test` test file in the output directory.
#
#   source_root (optional)
#     Location of the crate root (e.g. `src/main.rs` or `src/lib.rs`).
#     This defaults to `./src/main.rs` for binaries and `./src/lib.rs` for libraries,
#     and should only be changed when absolutely necessary
#     (such as in the case of generated code).
#
#   output_name (optional)
#     Name of the output file.
#
# Example of usage:
#
#   rustc_staticlib("foo") {
#     deps = [
#       "//garnet/public/rust/bar",
#       "//third_party/rust-crates/rustc_deps:clap",
#       "//third_party/rust-crates/rustc_deps:serde",
#       "//third_party/rust-crates/rustc_deps:slab",
#     ]
#     with_unit_tests = true
#   }
template("rustc_staticlib") {
  rustc_target = "_${target_name}_rustc_artifact"
  group_target = "${target_name}"

  if (defined(invoker.name)) {
    rustc_artifact_name = invoker.name
  } else {
    rustc_artifact_name = target_name
  }

  rustc_artifact(rustc_target) {
    forward_variables_from(invoker,
                           [
                             "version",
                             "deps",
                             "edition",
                             "non_rust_deps",
                             "with_unit_tests",
                             "output_name",
                             "source_root",
                             "testonly",
                           ])
    name = rustc_artifact_name
    type = "staticlib"
  }

  public_hdrs = []
  if (defined(invoker.public)) {
    public_hdrs += invoker.public
  }

  header_target = "_${target_name}_staticlib_headers"
  config_target = "_${target_name}_staticlib_config"

  source_set(header_target) {
    public = public_hdrs
    visibility = [ ":$group_target" ]
  }

  first_party_crate_root = "${root_out_dir}/rust_crates"
  crate_name = string_replace(rustc_artifact_name, "-", "_")
  build_output = "${first_party_crate_root}/staticlib${crate_name}.a"

  config(config_target) {
    libs = [ build_output ]
    visibility = [ ":$group_target" ]
  }

  group(target_name) {
    public_configs = [ ":$config_target" ]
    public_deps = [
      ":$header_target",
      ":$rustc_target",
    ]
  }
}
