# 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.

# Generate a signed, sealed package file from a prebuilt archive.
#
# Parameters
#
#   archive (required)
#     Path to archive containing a package.
#
#   package_name (optional)
#     Name of the package.
#     Defaults to the target's name.
#
#   deps (optional)
#   testonly (optional)
#   visibility (optional)
#     Usual GN meanings.
#
template("prebuilt_package") {
  pkg_target_name = target_name
  pkg_name = target_name
  if (defined(invoker.package_name)) {
    pkg_name = invoker.package_name
  }

  meta_dir = target_out_dir + "/" + pkg_name + ".meta"
  blobs_json = "$meta_dir/blobs.json"
  package_manifest_json = "$meta_dir/package_manifest.json"

  pkg = {
    package_name = pkg_name
    package_version = 0
  }

  action(target_name) {
    forward_variables_from(invoker,
                           [
                             "testonly",
                             "visibility",
                           ])

    archive = invoker.archive

    script = "//build/packages/prebuilt_package.py"

    system_rsp = "$target_out_dir/$pkg_name.system.rsp"
    meta_merkle = "$meta_dir/meta.far.merkle"
    blobs_manifest = "$meta_dir/blobs.manifest"

    args = [
      "--pm-tool",
      rebase_path("$root_out_dir/host_$host_cpu/pm"),
      "--name",
      pkg_name,
      "--archive",
      rebase_path(archive),
      "--workdir",
      rebase_path(meta_dir, root_build_dir),
      "--system-rsp",
      rebase_path(system_rsp, root_build_dir),
    ]
    inputs = [
      archive,
    ]
    outputs = [
      blobs_manifest,
      system_rsp,
      blobs_json,
      package_manifest_json,
      meta_merkle,
    ]

    deps = [
      "//garnet/go/src/pm:pm_bin($host_toolchain)",
    ]
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }

    blobs_json_path = rebase_path(blobs_json, root_build_dir)

    # Package metadata must be kept in sync between package.gni and
    # prebuilt_package.gni. The template package_metadata_list in package.gni
    # documents the fields required to be implemented by both templates.
    metadata = {
      # We only ever want to collect the following package manifests from
      # packages, not from dependencies of packages, so the barrier prevents us
      # from walking any further in the dependency chain. See `gn help
      # walk_keys` for more information on the mechanic.
      package_barrier = []

      package_names = [ pkg_name ]

      snapshot_entries =
          [ "${pkg.package_name}/${pkg.package_version}=$blobs_json_path" ]

      blob_manifests = [ rebase_path(blobs_manifest, root_build_dir) ]

      meta_far_index_entries =
          [ "${pkg.package_name}/${pkg.package_version}=" +
            rebase_path("$meta_dir/meta.far", root_build_dir) ]

      meta_far_merkle_index_entries =
          [ "${pkg.package_name}/${pkg.package_version}=" +
            rebase_path("$meta_dir/meta.far.merkle", root_build_dir) ]

      package_output_manifests = [ package_manifest_json ]
    }
  }

  group(target_name + ".manifest") {
    forward_variables_from(invoker, [ "testonly" ])
    public_deps = [
      ":$pkg_target_name",
    ]
  }
}
