blob: 0dae0282c36dd0cc2b19831cd9079a572e7c3cde [file] [log] [blame]
# Copyright 2018 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/compiled_action.gni")
import("//build/fidl/toolchain.gni")
# Declares a source_set that contains code generated by fidlmerge from a
# template and a FIDL JSON file.
#
# Parameters
#
# fidl_target (required)
# Specifies the fidl target from which to read fidl json. For example,
# "//zircon/system/fidl/fuchsia-mem" for fuchsia.mem or
# "//sdk/fidl/fuchsia.sys" for fuchsia.sys.
#
# template_path (required)
# Specifies the template to use to generate the source code for the
# source_set. For example, "//garnet/public/build/fostr/fostr.fidlmerge".
#
# generated_source_base (required)
# The base file name from which the source_set's 'source' file names are
# generated. For example, "formatting".
#
# generated_source_extensions (optional)
# The list of extensions of source_set 'source' files that will be generated
# and included in the source set. By default, this is [ ".cc", ".h" ]
#
# options (optional)
# A single string with comma-separated key=value pairs.
#
# amendments_path (optional)
# Specifies a JSON file that contains amendments to be made to the fidl
# model before the template is applied. For example,
# "//garnet/public/build/fostr/fidl/fuchsia.media/amendments.fidlmerge".
# See the fidlmerge README for details.
#
# deps, public_deps, test_only, visibility (optional)
# These parameters are forwarded to the source_set.
#
template("fidlmerge_cpp") {
assert(defined(invoker.fidl_target),
"fidlmerge_cpp requires parameter fidl_target.")
assert(defined(invoker.template_path),
"fidlmerge_cpp requires parameter template_path.")
assert(defined(invoker.generated_source_base),
"fidlmerge_cpp requires parameter generated_source_base.")
fidl_target = invoker.fidl_target
template_path = invoker.template_path
source_base = invoker.generated_source_base
if (defined(invoker.generated_source_extensions)) {
generated_source_extensions = invoker.generated_source_extensions
} else {
generated_source_extensions = [
".cc",
".h",
]
}
main_target_name = target_name
generation_target_name = "${target_name}_generate"
fidl_target_gen_dir =
get_label_info("$fidl_target($fidl_toolchain)", "target_gen_dir")
fidl_target_name = get_path_info(fidl_target_gen_dir, "file")
json_representation = "$fidl_target_gen_dir/$fidl_target_name.fidl.json"
# Subtle: rebase dance, so that we allow paths up to and including the build
# dir to contain periods:
include_stem =
string_replace(rebase_path(target_gen_dir, root_build_dir), ".", "/")
file_stem = "$root_build_dir/$include_stem/$source_base"
compiled_action(generation_target_name) {
forward_variables_from(invoker, [ "testonly" ])
visibility = [ ":$main_target_name" ]
tool = "//garnet/go/src/fidlmerge"
inputs = [
json_representation,
template_path,
]
outputs = []
foreach(ext, generated_source_extensions) {
outputs += [ "$file_stem$ext" ]
}
args = [
"--template",
rebase_path(template_path, root_build_dir),
"--json",
rebase_path(json_representation, root_build_dir),
"--output-base",
rebase_path(file_stem, root_build_dir),
]
if (defined(invoker.options)) {
args += [
"--options",
invoker.options,
]
}
if (defined(invoker.amendments_path)) {
args += [
"--amend",
rebase_path(invoker.amendments_path, root_build_dir),
]
}
deps = [ "$fidl_target($fidl_toolchain)" ]
if (defined(invoker.deps)) {
deps += invoker.deps
}
}
source_set(main_target_name) {
forward_variables_from(invoker,
[
"deps",
"testonly",
"visibility",
])
sources = []
foreach(ext, generated_source_extensions) {
sources += [ "$file_stem$ext" ]
}
public_deps = [ ":$generation_target_name" ]
if (defined(invoker.public_deps)) {
public_deps += invoker.public_deps
}
}
}