# Copyright 2019 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/package.gni")

# Produce a package that collects all binaries entries produced by packages
# declared in deps, into a new package.
#
# Paramters
#   deps (optional)
#   public_deps (optional)
#   data_deps (optional)
#   testonly (optional)
#     Usual GN meanings.
template("shell_commands") {
  shell_commands_manifest = "shell-commands-extra.manifest"
  shell_commands_manifest_path = target_gen_dir + "/" + shell_commands_manifest

  generated_file(shell_commands_manifest) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "public_deps",
                             "data_deps",
                             "testonly",
                           ])

    # This contract is known to package.gni.
    data_keys = [ "shell_binary_entries" ]
    walk_keys = [ "shell_binary_barrier" ]
    outputs = [
      shell_commands_manifest_path,
    ]
  }

  package(target_name) {
    metadata = {
      shell_binary_barrier = []
    }
    forward_variables_from(invoker,
                           [
                             "testonly",
                             "visibility",
                           ])
    extra = [ shell_commands_manifest_path ]
    deps = [
      ":$shell_commands_manifest",
    ]
  }
}
