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

  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,
      meta_merkle,
    ]

    deps = [
      "//garnet/go/src/pm:pm_bin($host_toolchain)",
    ]

    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) ]
    }
  }

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