blob: 213ece222b342bae6e3306dd59b8841a1767bd15 [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 (required)
# [string] Only compile APIs available at this Fuchsia API level. For more
# information, look for --available in `fidlc --help`.
#
# 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):
#
# available (required)
# sources (required)
# experimental_flags
# goldens_dir
# non_fidl_deps
# public_deps
# testonly
# versioned
# 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.available), "available 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",
"visibility",
"target_api_level",
])
visibility = [ ":*" ]
}
main_target_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 ]
deps = [ ":$fidlc_target_name" ]
metadata = {
_summary_basename = get_path_info(invoker.out_json_summary, "file")
_new_golden_file = "${invoker.goldens_dir}/${invoker.target_api_level}/${_summary_basename}"
compatibility_testing_goldens = [
{
api_level = invoker.target_api_level
src = rebase_path(invoker.out_json_summary, root_build_dir)
dst = rebase_path(_new_golden_file, root_build_dir)
},
]
}
}
}
group(target_name) {
forward_variables_from(invoker,
[
"testonly",
"visibility",
])
public_deps = main_target_deps
}
}