# 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/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) {
      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
            }
          },
        ]
      }
    }
  }

  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) {
    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"

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