blob: 1a28c45a4bd983885948d60a00c3a8de6a40d1c8 [file] [log] [blame]
# Copyright 2019 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("config/config.gni")
# Define a Fuchsia FIDL library component() target.
#
# $namespace.$library_name must match the the library name specified in the FIDL
# files.
#
# Parameters
#
# sources
# Required: List of .fidl files.
#
# library_name
# Optional: Name of the library. target_name is used if name
# is not specified explicitly.
#
# namespace
# Optional: Namespace for the library.
#
# deps
# Optional: List of other fidl_library() targets that this
# FIDL library depends on.
#
template("fidl_library") {
forward_variables_from(invoker, [ "namespace" ])
_library_basename = target_name
if (defined(invoker.library_name)) {
_library_basename = invoker.library_name
}
if (defined(namespace)) {
_library_name = "${namespace}.${_library_basename}"
_namespace_path = string_replace(namespace, ".", "/")
_library_path = "${_namespace_path}/${_library_basename}"
} else {
_library_name = _library_basename
_library_path = string_replace(_library_basename, ".", "/")
}
_response_file = "$target_gen_dir/$target_name.rsp"
_json_representation = "$target_gen_dir/${_library_name}.fidl.json"
_output_gen_dir = "$target_gen_dir/fidl"
_output_base = "$_output_gen_dir/${_library_path}/cpp/fidl"
_tables_file = "$_output_gen_dir/${_library_name}.fidl-tables.c"
action("${target_name}_response_file") {
script = "${fuchsia_sdk}/build/gen_fidl_response_file.py"
forward_variables_from(invoker,
[
"deps",
"public_deps",
"sources",
"testonly",
])
_libraries_file = "$target_gen_dir/${invoker.target_name}.fidl_libraries"
outputs = [
_response_file,
_libraries_file,
]
args = [
"--out-response-file",
rebase_path(_response_file, root_build_dir),
"--out-libraries",
rebase_path(_libraries_file, root_build_dir),
"--tables",
rebase_path(_tables_file, root_build_dir),
"--json",
rebase_path(_json_representation, root_build_dir),
"--name",
_library_name,
"--sources",
] + rebase_path(sources, root_build_dir)
if (defined(invoker.deps) || defined(invoker.public_deps)) {
merged_deps = []
if (defined(invoker.deps)) {
merged_deps += invoker.deps
}
if (defined(invoker.public_deps)) {
merged_deps += invoker.public_deps
}
dep_libraries = []
deps = []
foreach(dep, merged_deps) {
gen_dir = get_label_info(dep, "target_gen_dir")
dep_toolchain = get_label_info(dep, "toolchain")
name = get_label_info(dep, "name")
dep_libraries += [ "$gen_dir/$name.fidl_libraries" ]
dep_dir =
get_label_info(get_label_info(dep, "label_no_toolchain"), "dir")
deps += [ "${dep_dir}:${name}_response_file($dep_toolchain)" ]
}
inputs = dep_libraries
args += [ "--dep-libraries" ] + rebase_path(dep_libraries, root_build_dir)
}
}
action("${target_name}_compile") {
forward_variables_from(invoker, [ "testonly" ])
visibility = [ ":*" ]
deps = [ ":${invoker.target_name}_response_file" ]
script = "${fuchsia_sdk}/build/gn_run_binary.py"
inputs = [
# Depend on the SDK hash, to ensure rebuild if the SDK tools change.
fuchsia_sdk_manifest_file,
_response_file,
]
outputs = [
_json_representation,
_tables_file,
]
rebased_response_file = rebase_path(_response_file, root_build_dir)
args = [
rebase_path("${fuchsia_sdk}/tools/fidlc", root_build_dir),
"@$rebased_response_file",
]
}
action("${target_name}_cpp_gen") {
visibility = [ ":${invoker.target_name}" ]
forward_variables_from(invoker, [ "testonly" ])
deps = [ ":${invoker.target_name}_compile" ]
inputs = [
# Depend on the SDK hash, to ensure rebuild if the SDK tools change.
fuchsia_sdk_manifest_file,
_json_representation,
]
outputs = [
"${_output_base}.h",
"${_output_base}.cc",
]
script = "${fuchsia_sdk}/build/gn_run_binary.py"
args = [
rebase_path("${fuchsia_sdk}/tools/fidlgen", root_build_dir),
"-generators",
"cpp",
"-json",
rebase_path(_json_representation, root_build_dir),
"-include-base",
rebase_path(_output_gen_dir, root_build_dir),
"-output-base",
rebase_path("${_output_base}", root_build_dir),
]
}
config("${target_name}_config") {
visibility = [ ":${invoker.target_name}" ]
include_dirs = [ _output_gen_dir ]
}
source_set(target_name) {
forward_variables_from(invoker,
[
"deps",
"public_deps",
"testonly",
"visibility",
])
sources = [
"${_output_base}.cc",
"${_output_base}.h",
_tables_file,
]
# Metadata to allow us to query all FIDL IR files.
metadata = {
fidl_json = [ rebase_path(_json_representation, root_build_dir) ]
}
if (!defined(deps)) {
deps = []
}
deps += [ ":${invoker.target_name}_compile" ]
deps += [ ":${invoker.target_name}_cpp_gen" ]
if (!defined(public_deps)) {
public_deps = []
}
public_deps += [ "${fuchsia_sdk}/pkg/fidl" ]
public_deps += [ "${fuchsia_sdk}/pkg/fidl_cpp" ]
public_configs = [ ":${invoker.target_name}_config" ]
}
}