# 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/rust/config.gni")  # for rust_build_{args,deps,inputs}
import("//build/rust/rustc_artifact.gni")  # for rustc_third_party_artifact

third_party_lock = "//third_party/rust_crates/Cargo.lock"
third_party_toml = "//third_party/rust_crates/Cargo.toml"

fuchsia_cprng_dir = "//garnet/public/rust/fuchsia-cprng"

fuchsia_cprng_src =
    exec_script("//build/rust/list_files_in_dir.py",
                [
                  "--dir",
                  rebase_path("${fuchsia_cprng_dir}/src"),
                ],
                "list lines",
                # lib.rs will contain `mod` statements for all top-level files
                [ rebase_path("${fuchsia_cprng_dir}/src/lib.rs") ])

third_party_crate_names = exec_script("//build/rust/list_3p_crates.py",
                                      [
                                        "--cargo-toml",
                                        rebase_path(third_party_toml),
                                      ],
                                      "list lines",
                                      [ third_party_toml ])

foreach(crate_name, third_party_crate_names) {
  rustc_third_party_artifact(crate_name) {
    crate_name = crate_name
  }
}

# This target is implicitly depended upon by every
# rustc_artifact (rustc_binary or rustc_library) target
action("build-third-party") {
  script = "//build/rust/compile_3p_crates.py"

  inputs = [
    third_party_lock,
    third_party_toml,
  ]
  inputs += fuchsia_cprng_src

  out_dir = "${root_out_dir}/rust_third_party_crates"
  out_deps_data = "${out_dir}/deps_data.json"
  args = [
    "--cargo",
    rebase_path("${rustc_prefix}/cargo"),
    "--crate-root",
    rebase_path("//third_party/rust_crates"),
    "--out-dir",
    rebase_path(out_dir),
    "--out-deps-data",
    rebase_path(out_deps_data),
  ]

  args += rust_build_args
  deps = rust_build_deps
  inputs += rust_build_inputs

  outputs = [
    out_deps_data,
  ]
}
