# Copyright 2018 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/toolchain/toolchain.gni")

# Extracts symbols from a binary into a symbol file using dump_app_syms.py.
#
# Args:
#   binary: Path to the binary containing symbols to extract, e.g.:
#       "$root_out_dir/chrome"
#   symbol_file: Desired output file for symbols, e.g.:
#       "$root_out_dir/chrome.breakpad.$current_cpu"
template("extract_symbols") {
  forward_variables_from(invoker,
                         [
                           "deps",
                           "testonly",
                         ])
  action("${target_name}") {
    dump_syms_label = "//third_party/breakpad:dump_syms($host_toolchain)"
    dump_syms_binary =
        get_label_info(dump_syms_label, "root_out_dir") + "/" + "dump_syms"

    pool = "//build/toolchain:link_pool($default_toolchain)"
    script = "//build/linux/dump_app_syms.py"
    inputs = [
      invoker.binary,
      dump_syms_binary,
    ]
    outputs = [ invoker.symbol_file ]
    args = [
      "./" + rebase_path(dump_syms_binary, root_build_dir),
      "0",  # strip_binary = false
      rebase_path(invoker.binary, root_build_dir),
      rebase_path(invoker.symbol_file, root_build_dir),
    ]

    deps += [ dump_syms_label ]
  }
}
