# Copyright 2021 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/rust/rust_target.gni")

# Defines a Rust executable.
#
# This is identical to the built-in gn intrinsic 'executable' but
# supports some additional parameters, as below:
#
#   edition (optional)
#     Edition of the Rust language to be used.
#     Options are "2015", "2018" and "2021". Defaults to "2021".
#
#   test_deps (optional)
#     List of GN targets on which this crate's tests depend, in addition
#     to deps.
#
#   build_native_rust_unit_tests (optional)
#     Builds native unit tests (under #[cfg(test)]) written inside the Rust
#     crate. This will create a `<name>_unittests` executable in the output
#     directory when set to true.
#     Chromium code should not set this, and instead prefer to split the code
#     into a library and write gtests against it. See how to do that in
#     //testing/rust_gtest_interop/README.md.
#
#   unit_test_target (optional)
#     Overrides the default name for the unit tests target
#
#   features (optional)
#     A list of conditional compilation flags to enable. This can be used
#     to set features for crates built in-tree which are also published to
#     crates.io. Each feature in the list will be passed to rustc as
#     '--cfg feature=XXX'
#
#   inputs (optional)
#     Additional input files needed for compilation (such as `include!`ed files)
#
#   test_inputs (optional)
#     Same as above but for the unit tests target
#
# Example of usage:
#
#   rust_executable("foo_bar") {
#     deps = [
#       "//boo/public/rust/bar",
#     ]
#     sources = [ "src/main.rs" ]
#   }
#
# This template is intended to serve the same purpose as 'rustc_library'
# in Fuchsia.
template("rust_executable") {
  rust_target(target_name) {
    forward_variables_from(invoker,
                           "*",
                           TESTONLY_AND_VISIBILITY + [ "configs" ])
    forward_variables_from(invoker, TESTONLY_AND_VISIBILITY)
    executable_configs = invoker.configs
    target_type = "executable"
    assert(!defined(cxx_bindings))

    # Executable targets should be unique names as they all get placed in the
    # root output dir. We want their exe file name to be the same as the GN
    # target, not a mangled name including the full GN path, and the exe file
    # name comes from the crate name.
    if (!defined(invoker.crate_name)) {
      crate_name = target_name
    }
  }
}

set_defaults("rust_executable") {
  configs = default_executable_configs
}
