# Copyright 2021 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/toolchain/zircon/clang.gni")

_llvm_elfabi = "$clang_tool_dir/llvm-elfabi"

# Define a linkable shared library built from a text ABI (.tbe) specification.
#
# This uses a `.tbe` file kept in the source tree to create a linkable ELF
# shared library stub file.  This can be used at link time to build executable
# and (non-stub) shared library binaries without reference to the actual
# runtime shared library.  The real (non-stub) shared library to be used at
# runtime must be compiled separately and included at runtime as necessary.
# This target only takes care of satisfying any link-time dependencies.
# Its label is used in `deps` like a shared_library() target.
#
# This defines two targets.  The main target acts like shared_library() for
# linking purposes, but is not a GN target with outputs.  An additional target
# "$target_name.stub" is defined whose outputs include the linking stub ELF
# file itself, e.g. for use as input to a copy() target or the like.
#
# Parameters
#
#   * abi
#     - Required: Source path to a `.tbe` file defining the library's ELF ABI.
#     - Type: file
#
#   * output_name
#     - Optional: The plain name of the linkable library file to write,
#     without the `lib` prefix or the `.so` extension.
#     - Type: string
#     - Default: $target_name
#
#   * public, public_configs, public_deps
#     - Optional: As for shared_library().
#
template("elfabi_shared_library") {
  main_target = target_name
  stub_target = "$target_name.stub"

  if (defined(invoker.output_name)) {
    output_name = invoker.output_name
  } else {
    output_name = target_name
  }

  stub_file = "$root_out_dir/lib$output_name.so"

  source_set(main_target) {
    forward_variables_from(invoker,
                           [
                             "visibility",
                             "public",
                             "public_configs",
                             "public_deps",
                             "testonly",
                           ])
    libs = [ stub_file ]
    deps = [ ":$stub_target" ]
  }

  action(stub_target) {
    forward_variables_from(invoker,
                           [
                             "visibility",
                             "testonly",
                           ])
    if (defined(visibility)) {
      visibility += [ ":$main_target" ]
    }

    # Output timestamps are not freshened if contents do not change.
    all_outputs_fresh = false

    script = _llvm_elfabi
    sources = [ invoker.abi ]
    outputs = [ stub_file ]
    args = [
      "--tbe",
      "--write-if-changed",
      "--output-target=elf64-little",
      rebase_path(invoker.abi, root_build_dir),
      rebase_path(stub_file, root_build_dir),
    ]
  }
}
