# 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")
import("//build/rust/rustc_test.gni")
import("//build/toolchain/restat.gni")

# Defines a Rust procedural macro
#
# Parameters
#
#   output_name (optional)
#   name (optional, deprecated)
#     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 (optional)
#     Semver version of the crate as seen on crates.io.
#
#   edition (optional)
#     Edition of the Rust language to be used.
#     Options are "2015" and "2018". Defaults to "2018".
#
#   configs (optional)
#     A list of config labels applying to this target.
#
#   enforce_source_listing (optional)
#     When true, enforces that any source files used by the Rust compiler are
#     listed in `sources`. Defaults to true.
#
#   sources (optional)
#     List of source files which this crate is allowed to compile. Only
#     allowed when `enforce_source_listing = true`.
#     The Rust compiler discovers source files by following `mod` declarations
#     starting at the `source_root`. The discovered source files must match this
#     list.
#
#   inputs (optional)
#     List of additional non-source files read by the compiler. These are typically
#     configuration or test-data files included in the build with the `include_str!`
#     macro. Only allowed when `enforce_source_listing = true`.
#
#   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:<cratename>".
#
#   test_deps (optional)
#     List of rust_library GN targets on which this crate's tests depend.
#
#   non_rust_deps (optional)
#     List of non-rust_library GN targets on which this crate depends.
#     Obsolete. Please use deps instead.
#
#   data_deps (optional)
#     List of GN targets that are only needed at runtime.
#
#   with_unit_tests (optional)
#     Builds unit tests associated with the library. This will create a
#     `<name>_test` test file in the output directory. Equivalent to adding a
#     `rustc_test` target with that name and the same source_root.
#
#   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_dir (optional)
#     Directory that the resulting macro should be placed in.
#     See: `gn help output_dir`
#
#   disable_rbe (optional)
#     Set to true to force this target to build locally, overriding the global `enable_rbe`.
#
#   disable_clippy (optional)
#     Don't run clippy on this target.
#
# Example of usage:
#
#   rustc_macro("foo") {
#     deps = [
#       "//garnet/public/rust/bar",
#       "//third_party/rust_crates:serde",
#       "//third_party/rust_crates:slab",
#     ]
#     sources = [ "src/lib.rs" ]
#   }
template("rustc_macro") {
  # Compiling procedural macros is... a bit awkward.
  #
  # Even though they're provided to crates that use them as if they were normal
  # external crates, they're actually '.so'/'.dylib's that are compiled for the host machine
  # and then linked into the compiler, so they and all their dependencies should
  # be built for the host target.
  #
  # Once this is done, the resulting artifacts are copied into the Fuchsia target
  # directories to act as if they had been built for Fuchsia. In order to avoid
  # conflicts, the outputs of the original (host) artifact are built with a
  # `_proc_macro` suffix added onto the end, which is removed when they're copied
  # into the final target directory.
  forward_variables_from(invoker, [ "visibility" ])

  proc_macro_target = "${target_name}_proc_macro"

  assert(!(defined(invoker.output_name) && defined(invoker.name)),
         "Only one of output_name and name may be specified.")

  # The 'is_host' var is true in situations that we don't want, such as
  # sanitizers and cross-compiling for _other_ hosts.
  #
  # We only want this to be run in _this_ machine's host_toolchain, and then
  # only in its base variant.

  # This confirms that this is running on _this_ machine's host_toolchain.
  in_host_compiler_toolchain = current_toolchain == host_toolchain

  # This confirms that it's also running on the base variant of the host_toolchain.
  in_host_base_variant =
      in_host_compiler_toolchain && current_toolchain == toolchain_variant.base

  # The actual host-target build of the proc macro crate.
  if (in_host_base_variant) {
    package_name = target_name
    if (defined(invoker.output_name)) {
      package_name = invoker.output_name
    } else if (defined(invoker.name)) {
      package_name = invoker.name
    }
    crate_name = string_replace(package_name, "-", "_")

    if (!defined(invoker.source_root)) {
      source_root = "src/lib.rs"
    } else {
      source_root = invoker.source_root
    }

    rustc_artifact(proc_macro_target) {
      target_type = "rust_proc_macro"
      configs = []
      configs = invoker.configs

      not_needed(invoker,
                 [
                   "version",
                   "non_rust_deps",
                   "force_opt",
                 ])
      crate_root = source_root
      clippy_crate_type = "proc-macro"
      pass_through = {
        forward_variables_from(invoker,
                               [
                                 "data_deps",
                                 "output_dir",
                                 "testonly",
                                 "visibility",
                               ])
        output_name = crate_name
      }

      forward_variables_from(invoker,
                             [
                               "disable_clippy",
                               "edition",
                               "enforce_source_listing",
                               "inputs",
                               "sources",
                             ])

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

      # TODO(https://fxbug.dev/43781) remove "non_rust_deps"
      if (defined(invoker.non_rust_deps)) {
        deps += invoker.non_rust_deps
      }
    }
  } else {
    not_needed(invoker, "*")
  }

  # If "with_unit_tests" is set to true, generate an additional rust test
  # target. Since the parent rule is used to compile macros, which only run on
  # the host, only run the test code for the macros on the host.
  # TODO(https://fxbug.dev/72931): accept a string.
  if (defined(invoker.with_unit_tests) && invoker.with_unit_tests == true) {
    if (in_host_compiler_toolchain) {
      rustc_test("${target_name}_test") {
        name = invoker.target_name + "_test"
        if (defined(invoker.name)) {
          name = invoker.name + "_test"
        }

        forward_variables_from(invoker, "*", [ "name" ])
        configs += [ "//build/config/rust:proc_macro_test" ]
      }
    } else {
      # For convenience, create a forwarding target that points to the on-host
      # test target. This allows developers to list "${target_name}_test" in a
      # test group instead of "${target_name}_test($host_toolchain)" to include
      # the test target generated for this rule.
      group("${target_name}_test") {
        public_deps = [ ":${target_name}($host_toolchain)" ]
        testonly = true
      }
    }
  }

  # proc_macros are loadable modules that are used by the rustc compiler itself,
  # and as such, need to be compiled in the _base_ (non-sanitizer) variant of
  # host toolchain.
  #
  # The following creates a set of dependencies through groups that
  # link from the current toolchain to the base toolchain of the host_toolchain
  # variant:
  #
  # target_name($current_toolchain)   // omitted if already in host.
  #  |- target_name($host_toolchain)
  #      |- proc_macro_target($host_toolchain_base)

  # If not in _this_ machine's host_toolchain, switch to it.
  if (!in_host_compiler_toolchain) {
    group(target_name) {
      public_deps = [ ":${target_name}($host_toolchain)" ]
    }

    # the proc_macro_target isn't used.
    not_needed([ "proc_macro_target" ])
  } else {
    # now in the proper host_toolchain, have the group depend on the base of the host
    # toolchain's variant
    group(target_name) {
      public_deps = [ ":${proc_macro_target}(${toolchain_variant.base})" ]
    }
  }
}
