# Copyright 2020 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/compiled_action.gni")
import("//build/toolchain/breakpad.gni")

# Generate a manifest of prebuilt binaries provided in .build-id format.
#
# Parameters
#
#   build_id_dir (required)
#     Path to the .build-id directory to consume.
#
#   debug_archive (optional)
#     Path to archive containing a .build-id tarball.
#     TODO(fxbug.dev/41478): Delete me.
#
#   testonly (optional)
#     Usual GN meanings.
#
template("prebuilt_binaries") {
  assert(defined(invoker.build_id_dir) || defined(invoker.debug_archive),
         "build_id_dir or debug_archive is required")

  binary_manifest = "$target_gen_dir/${target_name}_binaries.json"

  compiled_action(target_name) {
    # TODO(fxbug.dev/41478) Make unconditionally testonly once separated from
    # prebuilt_package() instances.
    forward_variables_from(invoker, [ "testonly" ])
    hermetic_deps = false

    tool = "//tools/debug/unpack_debug_symbols"
    outputs = [ binary_manifest ]

    depfile = "$target_gen_dir/$target_name.d"

    args = [
      "-build-dir",
      rebase_path(root_build_dir),
      "-build-id-dir-out",
      rebase_path("$root_build_dir/.build-id"),
      "-cpu",
      target_cpu,
      "-os",
      target_os,
      "-output-manifest",
      rebase_path(binary_manifest, root_build_dir),
      "-dump-syms",
      breakpad_dump_syms,
      "-depfile",
      rebase_path(depfile),
    ]

    if (defined(invoker.debug_archive)) {
      args += [
        "-debug-archive",
        rebase_path(invoker.debug_archive),
      ]
    } else {
      args += [
        "-build-id-dir-in",
        rebase_path(invoker.build_id_dir),
      ]
    }

    metadata = {
      prebuilt_binaries = [
        {
          name = target_name
          manifest = rebase_path(binary_manifest, root_build_dir)
          if (defined(invoker.debug_archive)) {
            debug_archive = rebase_path(invoker.debug_archive, root_build_dir)
          }
        },
      ]
    }
  }
}
