# Copyright 2018 The Chromium 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("//third_party/fuchsia-sdk/sdk/build/component.gni")
import("//third_party/fuchsia-sdk/sdk/build/package.gni")

# DEPRECATED: Use the Fuchsia SDK's fuchsia_component() and fuchsia_package()
# templates directly, in new code.
#
# Creates a Fuchsia .far package file containing a Fuchsia component.
#
# Parameters are:
# package_name_override: Specifies the name of the package to generate,
#     if different than |target_name|.
# binary: The executable target which should be launched.
# manifest: A path to the manifest that will be used.
#     "testonly" targets default to using
#     //build/config/fuchsia/tests-with-exec.cmx.
#     Non-test targets must explicitly specify a |manifest|.
# additional_manifests: Manifest files that should be included in the package in
#     the /meta directory. This allows to package more than one component per
#     manifest. These manifest files must specify program/binary to run, which
#     is not required for the main manifest file where this parameter is added
#     during build.
# component_name_override: If set, specifies the name of the component.
#     By default, the component name is the same as the package name.
# deps: Additional targets to build and include in the package (optional).
#
# TODO(https://crbug.com/1050703): Migrate consumers to GN SDK equivalents.
template("cr_fuchsia_package") {
  assert(defined(invoker.binary))

  if (defined(invoker.package_name_override)) {
    _package_name = invoker.package_name_override
  } else {
    _package_name = invoker.target_name
  }

  _package_contents = [ invoker.binary ]
  if (defined(invoker.deps)) {
    _package_contents += invoker.deps
  }

  _component_cmx_target = target_name + "__cr-component-cmx"
  _component_target = target_name + "__cr-component"
  _package_components = [ ":${_component_target}" ]
  _component_manifest = "${target_gen_dir}/${target_name}.cmx"

  # Process the CMX fragment in |manifest| to get a full manifest.
  action(_component_cmx_target) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "testonly",
                           ])

    script = "//build/config/fuchsia/build_cmx_from_fragment.py"

    inputs = [ invoker.manifest ]
    outputs = [ _component_manifest ]

    args = [
      "--cmx-fragment",
      rebase_path(invoker.manifest),
      "--cmx",
      rebase_path(_component_manifest),
      "--program",
      get_label_info(invoker.binary, "name"),
    ]
  }

  # Declare the primary component for this package.
  fuchsia_component(_component_target) {
    forward_variables_from(invoker, [ "testonly" ])

    deps = [ ":${_component_cmx_target}" ]
    data_deps = _package_contents
    manifest = _component_manifest

    if (defined(invoker.component_name_override)) {
      manifest_output_name = "${invoker.component_name_override}"
    } else {
      manifest_output_name = "${_package_name}"
    }
  }

  # Bundle manifests providing additional entrypoints into the package.
  if (defined(invoker.additional_manifests)) {
    foreach(filename, invoker.additional_manifests) {
      _additional_component_target =
          target_name + "_" + get_path_info(filename, "name")
      _package_components += [ ":${_additional_component_target}" ]
      fuchsia_component(_additional_component_target) {
        forward_variables_from(invoker, [ "testonly" ])
        data_deps = _package_contents
        manifest = filename

        # Depend upon the invoker's |deps|, in case they include a dependency
        # responsible for generating this additional component's manifest file.
        deps = _package_contents
      }
    }
  }

  fuchsia_package(target_name) {
    forward_variables_from(invoker, [ "testonly" ])
    package_name = _package_name
    if (defined(invoker.excluded_files)) {
      excluded_files = invoker.excluded_files
    }
    deps = _package_components
  }
}
