# 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
# macro_include: overrides the include for DISABLE_CFI_ICALL
# (default: base/compiler_specific.h)
# macro_deps: override the dependency for macro_include (default: //base)
#
# 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,
]
}
if (defined(invoker.macro_include)) {
args += [
"--macro-include",
invoker.macro_include,
]
}
args += rebase_path(invoker.sigs, root_build_dir)
}
source_set(target_name) {
forward_variables_from(invoker,
[
"deps",
"public_deps",
"macro_deps",
"visibility",
])
if (!defined(deps)) {
deps = []
}
if (!defined(macro_deps)) {
deps += [ "//base" ]
} else {
deps += macro_deps
}
if (!defined(public_deps)) {
public_deps = []
}
public_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
}
}
}