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

# A package() that just contains a single binary created as an executable()
# under the name of the rule. We currently prefer packages with single binaries,
# because only such binaries can be executed directly from the package name in
# appmgr.
template("executable_package") {
  binary_rule = "${target_name}_bin"
  binary_name = target_name

  executable(binary_rule) {
    output_name = "${binary_name}"
    forward_variables_from(invoker,
                           [
                             "sources",
                             "deps",
                             "public_deps",
                             "testonly",
                           ])
  }

  package(target_name) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "public_deps",
                             "testonly",
                             "meta",
                             "tests",
                             "resources",
                           ])
    if (defined(deps)) {
      deps += [ ":${binary_rule}" ]
    } else {
      deps = [
        ":${binary_rule}",
      ]
    }

    binaries = [
      {
        name = binary_name
      },
    ]
  }
}
