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