# 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("config/config.gni")
import("pm_tool.gni")

# Define a Fuchsia component package target.
#
# Parameters
#
#   package_name:
#     Optional: Name of the package. Defaults to target_name
#
#   excluded_files
#     Optional: List of files to exclude from the package.
#
#   deps
#     Required: List of fuchsia_component() targets that this
#              package contains.
#
template("fuchsia_package") {
  if (!defined(invoker.package_name)) {
    package_name = target_name
  } else {
    package_name = invoker.package_name
  }
  if (!defined(invoker.excluded_files)) {
    excluded_files = []
  } else {
    excluded_files = invoker.excluded_files
  }

  _depfile = "${target_gen_dir}/${target_name}_stamp.d"

  # target names
  _manifest_target = "${target_name}__archive-manifest"
  _metadata_target = "${target_name}__archive-metadata"

  # output values
  _pkg_out_dir = "${target_gen_dir}/${package_name}"
  _runtime_deps_file = "$_pkg_out_dir/${package_name}.runtime_deps"
  _archive_manifest = "$_pkg_out_dir/${package_name}.archive_manifest"
  _build_ids_file = "$_pkg_out_dir/ids.txt"
  _package_file = "$_pkg_out_dir/package"

  _packaged_components_metadata =
      "${target_gen_dir}/${package_name}_packaged_components_metadata.json"

  _package_deps = []
  if (defined(invoker.deps)) {
    _package_deps += invoker.deps
  }
  if (defined(invoker.data_deps)) {
    _package_deps += invoker.data_deps
  }

  # Generates a JSON file containing the contents of each of the
  # components being included in this package.
  generated_file("${package_name}_packaged_components_metadata") {
    forward_variables_from(invoker, [ "testonly" ])
    outputs = [ _packaged_components_metadata ]
    data_keys = [ "contents" ]
    output_conversion = "json"
    deps = _package_deps
  }

  action(_manifest_target) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "testonly",
                           ])
    script = "${fuchsia_sdk}/build/prepare_package_inputs.py"

    inputs = [ _runtime_deps_file ]

    outputs = [
      _archive_manifest,
      _build_ids_file,
      _package_file,
    ]

    if (!defined(deps)) {
      deps = []
    }
    data_deps = _package_deps
    deps += _package_deps

    # Use a depfile to trigger package rebuilds if any of the files (static
    # assets, shared libraries, etc.) included by the package have changed.
    depfile = _depfile

    args = [
      "--root-dir",
      rebase_path("//", root_build_dir),
      "--out-dir",
      rebase_path(root_out_dir, root_build_dir),
      "--app-name",
      package_name,
      "--runtime-deps-file",
      rebase_path(_runtime_deps_file, root_build_dir),
      "--depfile-path",
      rebase_path(_depfile, root_build_dir),
      "--manifest-path",
      rebase_path(_archive_manifest, root_build_dir),
      "--build-ids-file",
      rebase_path(_build_ids_file, root_build_dir),
      "--json-file",
      rebase_path(_packaged_components_metadata),
    ]

    if (defined(excluded_files)) {
      foreach(filename, excluded_files) {
        args += [
          "--exclude-file",
          filename,
        ]
      }
    }
    write_runtime_deps = _runtime_deps_file
  }

  # Creates a Fuchsia metadata package.
  fuchsia_pm_tool(_metadata_target) {
    forward_variables_from(invoker, [ "testonly" ])
    package_name = package_name
    command = "build"
    archive_manifest = _archive_manifest
    public_deps = [ ":$_manifest_target" ]
  }

  fuchsia_pm_tool(target_name) {
    forward_variables_from(invoker, [ "testonly" ])
    package_name = package_name
    command = "archive"
    archive_manifest = _archive_manifest
    deps = [ ":$_metadata_target" ]
  }
}
