# 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/packages/package_metadata.gni")
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
  }
  pkg_version = 0
  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"
  blobs_manifest = "$meta_dir/blobs.manifest"
  blobs_json_path = rebase_path(blobs_json, root_build_dir)

  unpack_action_name = target_name + ".debug-archive"

  if (defined(invoker.debug_archive) && unpack_debug_archives) {
    prebuilt_binaries(unpack_action_name) {
      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
            }
          },
        ]
      }
    }
  }

  metadata_target_name = "${target_name}_metadata"
  define_package_metadata(metadata_target_name) {
    package_name = pkg_name
    snapshot_entry = "$pkg_name/$pkg_version=$blobs_json_path"
    blob_manifest = blobs_manifest
    meta_far_merkle_index_entry =
        "$pkg_name/$pkg_version=" +
        rebase_path("$meta_dir/meta.far.merkle", root_build_dir)
    package_output_manifest = package_manifest_json
  }

  action(target_name) {
    all_outputs_fresh = false

    forward_variables_from(invoker,
                           [
                             "metadata",
                             "testonly",
                             "visibility",
                           ])

    archive = invoker.archive

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

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

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

    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 = [
      ":$metadata_target_name",
      ":$unpack_action_name($default_toolchain)",
      "//src/sys/pkg/bin/pm:pm_bin($host_toolchain)",
    ]
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }
  }

  group(manifest_target_name) {
    forward_variables_from(invoker, [ "testonly" ])
    public_deps = [ ":$pkg_target_name" ]
  }
}
