# Copyright 2018 The Chromium 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/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",
                         ])
  symbol_target_name = "${target_name}_symbols"

  action("${symbol_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"

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