# Create a source_set with generated stubs for a POSIX shared library.
#
# Based on C-style signatures, it will generate a source and a header file
# and expose it as a source_set.
#
# See //tools/generate_stubs/generate_stubs.py for more info.
#
# Variables
#   sigs: list of files with C-style signatures (*.sig)
#   output_name: name of the generated files: $output_name.h and $output_name.cc
#   extra_header: prepend the contents of this file to the generated .cc file
#   logging_function: override the used logging function (default: VLOG(1))
#   logging_include: override the additional include (default: base/logging.h)
#   path_from_source: relative path of generated files from the project root
#
# Example
#   generate_stubs("libfoo_stubs") {
#     sigs = [ "foo/foo.sigs" ]
#     extra_header = "foo/foo_stub_header.fragment"
#     output_name = "foo/foo_stubs"
#     deps = [
#       "//base",
#     ]
#   }
#
# Targets that depend on this target can `#include "path/to/foo/foo_stubs.h"`
template("generate_stubs") {
  forward_variables_from(invoker, [ "testonly" ])

  _gen_dir = get_path_info(invoker.output_name, "gen_dir")

  action("${target_name}__stubs_gen") {
    script = "//tools/generate_stubs/generate_stubs.py"
    sources = invoker.sigs
    inputs = [
      invoker.extra_header,
    ]
    outputs = [
      "${target_gen_dir}/${invoker.output_name}.cc",
      "${target_gen_dir}/${invoker.output_name}.h",
    ]
    args = [
      "--intermediate_dir",
      rebase_path(_gen_dir, root_build_dir),
      "--output",
      rebase_path(_gen_dir, root_build_dir),
      "--type",
      "posix_stubs",
      "--extra_stub_header",
      rebase_path(invoker.extra_header, root_build_dir),
      "--stubfile_name",
      get_path_info(invoker.output_name, "name"),
      "--path_from_source",
      rebase_path(_gen_dir, root_gen_dir),
    ]
    if (defined(invoker.path_from_source)) {
      args += [
        "--path_from_source",
        invoker.path_from_source,
      ]
    } else {
      args += [
        "--path_from_source",
        rebase_path(_gen_dir, root_gen_dir),
      ]
    }
    if (defined(invoker.logging_function)) {
      args += [
        "--logging-function",
        invoker.logging_function,
      ]
    }
    if (defined(invoker.logging_include)) {
      args += [
        "--logging-include",
        invoker.logging_include,
      ]
    }
    args += rebase_path(invoker.sigs, root_build_dir)
  }

  source_set(target_name) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "public_deps",
                             "visibility",
                           ])
    if (!defined(deps)) {
      deps = []
    }
    deps += [ ":${target_name}__stubs_gen" ]
    sources = [
      "${target_gen_dir}/${invoker.output_name}.cc",
      "${target_gen_dir}/${invoker.output_name}.h",
    ]
    libs = [ "dl" ]
    include_dirs = [ target_gen_dir ]
    if (defined(invoker.configs)) {
      configs += invoker.configs
    }
  }
}
