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

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