# Copyright 2021 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.
#
# Args:
#   binary_input: Path to the binary containing symbols to extract, e.g.:
#       "$root_out_dir/chrome"
#   symbol_output: Desired output file for symbols, e.g.:
#       "$root_out_dir/chrome.debug"
#   stripped_binary_output: Desired output file for stripped file, e.g.:
#       "$root_out_dir/chrome.stripped"
template("strip_binary") {
  forward_variables_from(invoker,
                         [
                           "deps",
                           "testonly",
                         ])
  action("${target_name}") {
    eu_strip_binary = "//buildtools/third_party/eu-strip/bin/eu-strip"
    script = "//build/linux/strip_binary.py"

    if (defined(invoker.stripped_binary_output)) {
      stripped_binary_output = invoker.stripped_binary_output
    } else {
      stripped_binary_output = invoker.binary_input + ".stripped"
    }
    if (defined(invoker.symbol_output)) {
      symbol_output = invoker.symbol_output
    } else {
      symbol_output = invoker.binary_input + ".debug"
    }

    inputs = [
      invoker.binary_input,
      eu_strip_binary,
    ]
    outputs = [
      symbol_output,
      stripped_binary_output,
    ]
    args = [
      "--eu-strip-binary-path",
      rebase_path(eu_strip_binary, root_build_dir),
      "--symbol-output",
      rebase_path(symbol_output, root_build_dir),
      "--stripped-binary-output",
      rebase_path(stripped_binary_output, root_build_dir),
      "--binary-input",
      rebase_path(invoker.binary_input, root_build_dir),
    ]
  }
}
