# 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/prebuilt_binaries.gni")

declare_args() {
  # To ensure that everything can be built without debug symbols present we
  # gate weather or not these are consumed on a build argument. When set,
  # unpack_debug_archives creates an additional build step that unpacks
  # debug archives in tar.bzip2 format into the .build-id directory
  unpack_debug_archives = false
}

# Generate a signed, sealed package file from a prebuilt archive.
#
# Parameters
#
#   archive (required)
#     Path to archive containing a package.
#
#   debug_archive (optional)
#     Path to archive containing a .build-id directory for the package.
#     TODO(fxbug.dev/41478): Delete me.
#
#   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
  }
  manifest_target_name = target_name + ".manifest"

  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
  }

  unpack_action_name = target_name + ".debug-archive"

  if (defined(invoker.debug_archive) && unpack_debug_archives) {
    prebuilt_binaries(unpack_action_name) {
      build_id_dir = "$root_build_dir/.build-id"

      forward_variables_from(invoker,
                             [
                               "debug_archive",
                               "testonly",
                             ])
    }
  } else {
    if (defined(invoker.debug_archive)) {
      not_needed(invoker, [ "debug_archive" ])
    }
    group(unpack_action_name) {
      metadata = {
        prebuilt_packages = [
          {
            archive = invoker.archive
            if (defined(invoker.package_name)) {
              package_name = invoker.package_name
            }
          },
        ]
      }
    }
  }

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

    archive = invoker.archive

    if (defined(visibility)) {
      visibility += [ ":$manifest_target_name" ]
    }

    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 = [
      ":$unpack_action_name($default_toolchain)",
      "//src/sys/pkg/bin/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(manifest_target_name) {
    forward_variables_from(invoker, [ "testonly" ])
    public_deps = [ ":$pkg_target_name" ]
  }
}
