# Copyright 2020 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("fuchsia_component.gni")
import("fuchsia_package.gni")

# Defines a package that contains shell commands.
# See: https://fuchsia.dev/fuchsia-src/development/components/build
#
# Parameters
#
#   package_name (optional)
#     The name of the package.
#     Type: string
#     Default: target_name
#
#   manifest (optional)
#     If your shell program can also be launched as a component,
#     then specify the component manifest here.
#     Type: path
#
#   data_deps
#   deps
#   testonly
#   visibility
template("fuchsia_shell_package") {
  if (current_toolchain == default_toolchain) {
    package_name = target_name
    if (defined(invoker.package_name)) {
      package_name = invoker.package_name
    }

    if (defined(invoker.manifest)) {
      component_target = "${target_name}_component"
      fuchsia_component(component_target) {
        forward_variables_from(invoker,
                               [
                                 "data_deps",
                                 "deps",
                                 "manifest_deps",
                                 "testonly",
                               ])
        visibility = [ ":*" ]
        manifest = invoker.manifest
        component_name = package_name
      }
    }

    fuchsia_package(target_name) {
      forward_variables_from(invoker,
                             [
                               "data_deps",
                               "deps",
                               "disable_elf_binaries_checks",
                               "renameable_subpackages",
                               "shell_commands",
                               "subpackages",
                               "testonly",
                               "visibility",
                             ])
      is_shell_package = true
      package_name = package_name
      if (!defined(deps)) {
        deps = []
      }
      if (defined(component_target)) {
        deps += [ ":$component_target" ]
      }
      deps += [ "//build/validate:shell_command_tag" ]

      # The shell environment is not intended for production use.
      deps += [ "//build/validate:non_production_tag" ]
    }
  } else {
    group(target_name) {
      forward_variables_from(invoker,
                             [
                               "testonly",
                               "visibility",
                             ])
      deps = [ ":$target_name($default_toolchain)" ]
    }
    not_needed(invoker, "*")
  }
}
