# 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/testing/host_test_data.gni")
import("config.gni")

group("disable_strict_sources_check_allowlist") {
  #  ________  _________  ________  ________
  # |\   ____\|\___   ___\\   __  \|\   __  \
  # \ \  \___|\|___ \  \_\ \  \|\  \ \  \|\  \
  #  \ \_____  \   \ \  \ \ \  \\\  \ \   ____\
  #   \|____|\  \   \ \  \ \ \  \\\  \ \  \___|
  #     ____\_\  \   \ \__\ \ \_______\ \__\
  #    |\_________\   \|__|  \|_______|\|__|
  #    \|_________|
  # This is an allowlist of packages that do not enforce that the source files
  # are listed in `source`. This is only intended to be used as a temporary
  # allowlist during soft migrations.
  #
  # All file dependencies of the targets in this list should be covered by the
  # paths in the skipAnalysisAllowlist in
  # //tools/integration/fint/should_build.go.
  visibility = []
}

cargo_toml_gen_desc_out = "$target_out_dir/cargo_toml_gen_desc.json"
action("cargo_toml_gen_desc") {
  visibility = [ ":cargo_toml_gen" ]
  script = "//scripts/generate_cargo_desc.py"
  sources = []
  inputs = []
  hermetic_deps = false

  # This target must leak the output directory because `fx gen-cargo`
  # generates symlinks in locations outside of //out. Those symlinks refer to
  # Cargo.toml files generated by the subsequent `cargo_toml_gen` action, and
  # `cargo` resolves paths relative to the location of the Cargo.toml symlink
  # itself.
  no_output_dir_leaks = false

  outputs = [ cargo_toml_gen_desc_out ]
  depfile = "$cargo_toml_gen_desc_out.d"
  args = [
    "--root_build_dir",
    ".",
    "--fuchsia_dir",
    rebase_path("//", root_build_dir),
    "--gn_binary",
    rebase_path("//prebuilt/third_party/gn/${host_platform}/gn",
                root_build_dir),
    "--output",
    rebase_path(cargo_toml_gen_desc_out, root_build_dir),
    "--depfile",
    rebase_path("$cargo_toml_gen_desc_out.d", root_build_dir),
  ]
}

# NOTE: This target is used by "fx set --cargo-toml-gen ..." which
# will do the following:
#
#  1) Ensure that "fx gen" (and "fx build") will pass `--ide-json`
#     to `gn gen`, which generates an up-to-date
#     `$root_build_dir/project.json` file, used here as input.
#
#  2) Add this target to the host_labels list to ensure its action script is
#     run by "fx build".
#
# For more details, see docs/development/language/rust/README.md
#
# Notes on transitioning this target from `base_package_labels` to `host_tools`:
#
#  1) Existing `args.gn` files created by `fx set --cargo-toml-gen` will have
#     added the target to the `base_package_labels` list.  This list assumes the
#     default toolchain.
#  2) `base_package_labels` currently feeds into
#       - `//:developer_base_package_labels`
#  3) New `args.gn` files created by `fx set --cargo-toml-gen` will instead use
#     the `host_labels` arg (which assumes the host toolchain).  That list is
#     currently being used with the `//:host` group, but it's being split into
#       - `//build/input/product:host_labels`
#       - `//build/input/board:host_labels`
#       - `//:host` will remain for developer-specified host tools to include in
#         the build.
#   4) Developers _may_ have added `//build/rust:cargo_toml_gen` to either of
#      following:
#        - `cache_package_labels` (`//:developer_cache_packages`)
#        - `universe_package_labels` (`//:developer_universe_packages`)
#      and those are being split as well, and so the following groups will need
#      to be added to visibility:
#        - `//:developer_cache_packages`
#        - `//:developer_universe_packages`
#
if (current_toolchain != default_toolchain) {
  # This is a redirect from the host toolchain to the default toolchain, as it
  # is added to the host_labels group, not the product definition inputs.
  group("cargo_toml_gen") {
    public_deps = [ ":cargo_toml_gen($default_toolchain)" ]
    visibility = [
      # This is the supported group for developers to add tools to, going
      # forward, and the group used by `fx set --cargo-toml-gen`.
      "//:host",
    ]
  }
} else {
  action("cargo_toml_gen") {
    # Nothing in-tree should depend on Cargo files.
    visibility = [
      # The only expected use of this target, going forward (the above group)
      ":cargo_toml_gen",

      # `fx set ... --cargo-toml-gen` previously used the `base_package_labels`
      # GN arg, which feeds into `//:developer_base_packages`.  This is here for
      # providing a transition for developers' existing `args.gn` files.
      "//:developer_base_packages",

      # Developers may have used these as well (also deprecated for this
      # target).
      "//:developer_cache_packages",
      "//:developer_universe_packages",

      # via --with-host or `host_labels`, and specifying the fuchsia toolchain:
      "//:host",
    ]
    script = "//scripts/generate_cargo.py"
    sources = []
    inputs = [
      cargo_toml_gen_desc_out,
      "//third_party/rust_crates/Cargo.toml",
    ]
    hermetic_deps = false

    outputs = [ "$root_build_dir/cargo/generate_cargo.stamp" ]
    depfile = "$root_build_dir/cargo/generate_cargo.stamp.d"
    args = [
      rebase_path(cargo_toml_gen_desc_out, root_build_dir),
      "--root_build_dir",
      ".",
      "--fuchsia_dir",
      rebase_path("//", root_build_dir),
    ]
    deps = [ ":cargo_toml_gen_desc" ]
  }
}

# When panic=abort, the Rust libtest framework requires sys.process.Launcher in
# every test manifest. This is so it can launch a subprocess for each unit
# test.
#
# We stick a test_needs_process_launcher flag in metadata so that any
# package which contains this test automatically has its manifest patched
# with the sys.process.Launcher capability (this is done in
# //build/package.gni).
#
# This group is included in every Rust test.
group("rust_test_metadata") {
  metadata = {
    cmx_patches_data = [
      {
        sandbox = {
          services = [ "fuchsia.process.Launcher" ]
        }
      },
    ]
  }
}

# Multiple integration tests rely on having a Rust toolchain available on the host test
# runner, and host_test_data does not appear to support multiple definitions of the
# same output path in the same build, so we provide a central target here to be used
# by integration tests that need cargo or rustc.
if (is_host) {
  action("make_toolchain_host_binaries") {
    script = "//build/copy_tree.py"

    _stamp = "$target_gen_dir/$target_name.stamp"
    _depfile = "$target_out_dir/$target_name.d"
    args = [
      rebased_rustc_prefix,
      out_rustc_prefix,
      rebase_path(_stamp, root_build_dir),
      "--depfile",
      rebase_path(_depfile, root_build_dir),
    ]
    outputs = [ _stamp ]
    depfile = _depfile
  }

  # This target adds llvm-profdata for the rust toolchain to tool_paths.json.
  # Since this tool has the same name as the clang counterpart, we need to
  # append -rust to the name to differentiate them. It also needs to be built
  # in the host_toolchain in order for the tool path to be correct.
  group("tool_paths.llvm-profdata-rust") {
    visibility = [ "//:tool_paths" ]
    deps = [ ":make_toolchain_host_binaries" ]
    metadata = {
      tool_paths = [
        {
          cpu = host_cpu
          label = get_label_info(":$target_name", "label_with_toolchain")
          name = "llvm-profdata-rust"
          os = host_os
          path = rebase_path("$rustc_prefix/bin/llvm-profdata", root_build_dir)
        },
      ]
    }
  }

  host_test_data("prebuilt_toolchain_host_test_data") {
    deps = [ ":make_toolchain_host_binaries" ]
    sources = [ "$root_build_dir/$out_rustc_prefix" ]
  }
}

group("tests") {
  testonly = true
  deps = [ "tests" ]
}
