# 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"
  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)",
    ]

    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") {
    public_deps = [
      ":$pkg_target_name",
    ]
  }
}
