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

import("//build/config/fuchsia/zircon.gni")
import("//build/gn/packages.gni")
import("//build/images/manifest.gni")
import("//build/packages/package_internal.gni")

# 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_label = get_label_info(":$pkg_target_name", "label_no_toolchain")
  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"

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

    archive = invoker.archive

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

    blobs_rsp = "$target_out_dir/$pkg_name.blobs.rsp"
    manifest = "$target_out_dir/$pkg_name.manifest"
    system_rsp = "$target_out_dir/$pkg_name.system.rsp"
    ids_txt = "$target_out_dir/$pkg_name.manifest.ids.txt"
    meta_merkle = "$meta_dir/meta.far.merkle"

    args = [
      "--pm-tool",
      rebase_path("$root_out_dir/host_$host_cpu/pm"),
      "--merkleroot-tool",
      rebase_path("$zircon_tools_dir/merkleroot"),
      "--name",
      pkg_name,
      "--archive",
      rebase_path(archive),
      "--workdir",
      rebase_path(meta_dir, root_build_dir),
      "--manifest",
      rebase_path(manifest, root_build_dir),
      "--blobs-rsp",
      rebase_path(blobs_rsp, root_build_dir),
      "--system-rsp",
      rebase_path(system_rsp, root_build_dir),
      "--ids-txt",
      rebase_path(ids_txt, root_build_dir),
      "--blobs-json",
      rebase_path(blobs_json, root_build_dir),
      "--meta-merkle",
      rebase_path(meta_merkle, root_build_dir),
    ]
    inputs = [
      archive,
    ]
    outputs = [
      blobs_rsp,
      manifest,
      ids_txt,
      system_rsp,
      blobs_json,
      meta_merkle,
    ]

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

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

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

  pkg = {
    package_name = target_name
    package_version = 0
  }

  generate_system_index(target_name + ".system_index.rsp") {
    deprecated_system_image = false
    meta_target = ":$pkg_target_name"

    foreach(name, available_packages) {
      if (name == pkg_label) {
        package_set = "available"
      }
    }
    foreach(name, preinstall_packages) {
      if (name == pkg_label) {
        package_set = "preinstall"
      }
    }
    foreach(name, monolith_packages) {
      if (name == pkg_label) {
        package_set = "monolith"
      }
    }

    package_name = pkg.package_name
    package_version = pkg.package_version
    blobs_json = blobs_json
  }

  generate_response_file("${pkg_target_name}.shell_commands.rsp") {
    response_file_contents = []
  }

  foreach(index,
          [
            {
              name = "pkgsvr_index"
              file = "meta.far.merkle"
            },
            {
              name = "amber_index"
              file = "meta.far"
            },
          ]) {
    generate_index("${pkg_target_name}.${index.name}.rsp") {
      deprecated_system_image = false
      index_file = "${meta_dir}/${index.file}"
      package_name = pkg.package_name
      package_version = pkg.package_version
      pkg_label = pkg_label
      deps = [
        ":$pkg_target_name",
      ]
    }
  }
}
