# Copyright 2019 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/config/clang/clang.gni")
import("//build/zircon/c_utils.gni")

# Extracts the list of imported symbols from a prebuilt library or
# a library generated by another target.
#
# IMPORTANT: Building a shared library with an instrumented build
# variant (e.g. "asan") typically introduces extra ibstrumentation
# specific symbols (e.g. `__asan_init`) which will fail a later
# comparison with verify_imported_symbols().
#
# Due to this, callers of this template should ensure that the
# 'library_target' passed here as argument is never built with
# an instrumented variant (a simple way to do that is to use
# `exclude_toolchain_tags = [ "instrumented" ]`).
#
# Parameters
#
#   library (optional)
#     Location of the prebuilt library.
#
#   library_target (optional)
#     GN label of the target that generates the library.
#     Note that either one of 'library' or 'library_target' is required.
#
#   symbols
#     Location of the output symbol list. It should fall within the output
#     directory for the build.

template("extract_imported_symbols") {
  assert(defined(invoker.symbols), "symbols must be specified")

  assert(
      !(defined(invoker.library) && defined(invoker.library_target)),
      "Only one of 'library' or 'library_target' can be set when calling extract_imported_symbols().")

  if (defined(invoker.library)) {
    # Nothing here.
  } else if (defined(invoker.library_target)) {
    # Generate a response file that will contain the path to the library file.
    _library_rsp_target = "${target_name}_library.rsp"
    _library_rsp_file = "$target_gen_dir/${target_name}_library.rsp"
    link_output_rspfile(_library_rsp_target) {
      deps = [ invoker.library_target ]
      outputs = [ _library_rsp_file ]
    }
  } else {
    assert(
        false,
        "Either 'library' or 'library_target' must be set when calling extract_imported_symbols().")
  }

  action(target_name) {
    script = "//build/cpp/extract_imported_symbols.sh"

    forward_variables_from(invoker,
                           [
                             "deps",
                             "testonly",
                             "visibility",
                           ])

    outputs = [ invoker.symbols ]

    inputs = [ "$clang_prefix/llvm-nm" ]

    if (defined(invoker.library)) {
      inputs += [ invoker.library ]
      args = [
        "$rebased_clang_prefix/llvm-nm",
        rebase_path(invoker.library, root_build_dir),
        rebase_path(invoker.symbols, root_build_dir),
      ]
    } else {
      depfile = "$target_gen_dir/${target_name}.d"
      inputs += [ _library_rsp_file ]
      args = [
        "$rebased_clang_prefix/llvm-nm",
        "@" + rebase_path(_library_rsp_file, root_build_dir),
        rebase_path(invoker.symbols, root_build_dir),
        rebase_path(depfile, root_build_dir),
      ]
      if (!defined(deps)) {
        deps = []
      }
      deps += [ ":${_library_rsp_target}" ]
    }
  }
}
