# 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",
                             "deprecated_system_image",
                             "public_deps",
                             "testonly",
                             "meta",
                             "tests",
                             "resources",
                             "deprecated_no_cmx",
                           ])
    if (defined(deps)) {
      deps += [ ":${binary_rule}" ]
    } else {
      deps = [
        ":${binary_rule}",
      ]
    }

    if (!defined(deprecated_system_image) || !deprecated_system_image) {
      binary = binary_name
    } else {
      binaries = [
        {
          name = binary_name
        },
      ]
    }
  }
}
