blob: 97ee47cf1b8474b082830407699221729a5b25a6 [file] [log] [blame]
# Copyright 2020 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 Measure Tape.
#
# This target generates an HLCPP measuring tape for one or multiple target types.
#
# Parameters
#
# target_bindings (required)
# The binding for which to create the measure tape. Both `hlcpp` and `rust`
# are supported.
#
# fidls (required)
# A list of GN depedencies. All those depedencies must be `fidl` targets.
#
# target_type (required)
# The fully qualified FIDL type for which to generate a measuring tape.
template("measure_tape") {
assert(defined(invoker.target_binding))
assert(defined(invoker.fidls))
assert(defined(invoker.target_type))
# targets
name = target_name
fidl_targets = invoker.fidls
gen_target_name = "${target_name}_gen"
out_cc = "${target_gen_dir}/measure_tape/hlcpp/${target_name}.cc"
out_h = "${target_gen_dir}/measure_tape/hlcpp/${target_name}.h"
out_rs_root = "${target_gen_dir}/${target_name}/rust"
out_rs = "${out_rs_root}/src/lib.rs"
# arguments for code generation tool
gen_args = [
"--target-binding",
invoker.target_binding,
"--target-type",
invoker.target_type,
"--out-cc",
rebase_path(out_cc),
"--out-h",
rebase_path(out_h),
"--out-rs",
rebase_path(out_rs),
"--h-include-path",
"measure_tape/hlcpp/${target_name}.h",
]
foreach(fidl, invoker.fidls) {
fidl_target =
get_label_info(fidl, "label_no_toolchain") + "($fidl_toolchain)"
json_file = get_label_info(fidl_target, "target_gen_dir") + "/" +
get_label_info(fidl_target, "name") + ".fidl.json"
gen_args += [
"--json",
rebase_path(json_file, root_build_dir),
]
}
if (invoker.target_binding == "hlcpp") {
config_target_name = "${target_name}_config"
# source set configuration to support `#include <...>`
config(config_target_name) {
include_dirs = [ target_gen_dir ]
}
# source set consisting of the two generated files
source_set(name) {
forward_variables_from(invoker,
[
"defines",
"testonly",
"visibility",
])
sources = [
out_cc,
out_h,
]
deps = [ ":$gen_target_name" ]
public_deps = fidl_targets
public_configs = [ ":$config_target_name" ]
}
generated_outputs = [
out_cc,
out_h,
]
} else if (invoker.target_binding == "rust") {
import("//build/rust/rustc_library.gni")
rustc_library(name) {
forward_variables_from(invoker,
[
"testonly",
"visibility",
])
deps = [
"//src/lib/fidl/rust/fidl",
"//src/lib/zircon/rust:fuchsia-zircon",
]
foreach(fidl_target, fidl_targets) {
label = get_label_info(fidl_target, "label_no_toolchain")
deps += [ "${label}-rustc" ]
}
non_rust_deps = [ ":$gen_target_name" ]
source_root = rebase_path(out_rs)
sources = [ rebase_path(out_rs) ]
}
generated_outputs = [ out_rs ]
}
# code generation
compiled_action(gen_target_name) {
tool = "//tools/fidl/measure-tape/src:measure-tape"
args = gen_args
outputs = generated_outputs
deps = fidl_targets
forward_variables_from(invoker, [ "testonly" ])
}
}