# Copyright 2013 The Flutter 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("//flutter/common/fuchsia_config.gni")

# The inputs to this template are 'binary_path' and a boolean 'unstripped'.
# If 'unstripped' is specified, we append '.debug' to the symbols name.
template("_copy_debug_symbols") {
  assert(defined(invoker.binary_path), "'binary_path' needs to be defined.")
  assert(defined(invoker.unstripped), "'unstripped' needs to be defined.")

  action(target_name) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "unstripped",
                             "binary_path",
                             "testonly",
                           ])

    script = "//flutter/tools/fuchsia/copy_debug_symbols.py"

    sources = [ binary_path ]

    _dest_base = "${root_out_dir}/flutter-debug-symbols-${flutter_runtime_mode}-${target_os}-${target_cpu}"

    args = [
      "--executable-name",
      target_name,
      "--executable-path",
      rebase_path(binary_path),
      "--destination-base",
      rebase_path(_dest_base),
      "--read-elf",
      rebase_path("//fuchsia/toolchain/$host_os/bin/llvm-readelf"),
    ]

    if (unstripped) {
      args += [ "--unstripped" ]
    }

    outputs = [ "${_dest_base}/.${target_name}_success" ]
  }
}

# Takes a binary and generates its debug symbols following
# the Fuchsia packaging convention.
template("fuchsia_debug_symbols") {
  assert(defined(invoker.binary), "'binary' needs to be defined.")

  _copy_debug_symbols("_${target_name}_stripped") {
    forward_variables_from(invoker, "*")
    binary_path = rebase_path("${root_out_dir}/$binary")
    unstripped = false
  }

  _copy_debug_symbols("_${target_name}_unstripped") {
    forward_variables_from(invoker, "*")
    binary_path = "${root_out_dir}/exe.unstripped/$binary"
    unstripped = true
  }

  group(target_name) {
    forward_variables_from(invoker, [ "testonly" ])
    deps = [
      ":_${target_name}_stripped",
      ":_${target_name}_unstripped",
    ]
  }
}
