blob: de2116378ef55e0f9a8d2cea3a0b602914205e10 [file] [log] [blame]
# Copyright 2022 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/fidl/fidl_summary.gni")
import("//build/fidl/fidlc.gni")
# Compiles a FIDL library to IR and optionally generates API summaries.
#
# Compilation parameters
#
# fidl_target_name (required)
# [string] The name of the `fidl` target declaration.
#
# fidl_library_name (required)
# [string] The name of the `fidl` library.
#
# gen_dir (required)
# [path] Effectively replaces target_gen_dir. This is used to prevent
# multiple fidl targets from generating the same output files.
#
# json_representation (required)
# [path] Where to generate the FIDL IR. Must be relative to gen_dir.
#
# target_api_level
# [string] Only compile APIs available at this Fuchsia API level. See the
# FIDL compiler's --available flag for more info.
#
# out_summary
# [path] If set, generates an API summary file at the given path.
# Must be relative to gen_dir.
#
# out_json_summary
# [path] If set, generates a JSON API summary file at the given path.
# Must be relative to gen_dir.
#
# Other parameters (see //build/fidl/fidl.gni for descriptions):
#
# sources (required)
# goldens_dir
# experimental_flags
# non_fidl_deps
# public_deps
# testonly
# visibility
#
template("fidl_ir") {
assert(
current_toolchain == fidl_toolchain,
"This template can only be used in the FIDL toolchain $fidl_toolchain.")
assert(defined(invoker.fidl_target_name), "fidl_target_name is required")
assert(defined(invoker.fidl_library_name), "fidl_library_name is required")
assert(defined(invoker.gen_dir), "gen_dir is required")
assert(defined(invoker.json_representation),
"json_representation is required")
assert(defined(invoker.sources), "sources is required")
main_target_deps = []
fidlc_target_name = "${target_name}_fidlc"
fidlc(fidlc_target_name) {
forward_variables_from(invoker,
"*",
[
"goldens_dir",
"out_json_summary",
"out_summary",
"visibility",
])
visibility = [ ":*" ]
}
main_target_deps += [ ":$fidlc_target_name" ]
if (defined(invoker.out_summary)) {
fidl_summary_target_name = "${target_name}_summary"
main_target_deps += [ ":$fidl_summary_target_name" ]
fidl_summary(fidl_summary_target_name) {
forward_variables_from(invoker, [ "testonly" ])
visibility = [ ":*" ]
inputs = [ invoker.json_representation ]
outputs = [ invoker.out_summary ]
deps = [ ":$fidlc_target_name" ]
}
}
if (defined(invoker.out_json_summary)) {
fidl_summary_json_target_name = "${target_name}_summary_json"
main_target_deps += [ ":$fidl_summary_json_target_name" ]
fidl_summary_json(fidl_summary_json_target_name) {
forward_variables_from(invoker, [ "testonly" ])
visibility = [ ":*" ]
inputs = [ invoker.json_representation ]
outputs = [ invoker.out_json_summary ]
dest = "fidl"
deps = [ ":$fidlc_target_name" ]
metadata = {
compatibility_testing_goldens = [
{
src = rebase_path(invoker.out_json_summary, root_build_dir)
if (!defined(invoker.target_api_level) ||
invoker.target_api_level == "HEAD") {
dst = rebase_path(invoker.out_json_summary, root_build_dir)
} else {
dst = "${invoker.goldens_dir}/${invoker.target_api_level}/" +
get_path_info(invoker.out_json_summary, "file")
}
},
]
}
}
}
group(target_name) {
forward_variables_from(invoker,
[
"testonly",
"visibility",
])
public_deps = main_target_deps
}
}