blob: 20e8549db466faac1a93502e0451b64bff8a0ceb [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/dart/toolchain.gni")
import("//build/fidl/toolchain.gni")
import("//build/go/toolchain.gni")
# Declares a FIDL library.
#
# It expands to different targets depending on $current_toolchain:
#
# fidl_toolchain
# ${target_name}
# Invokes fidlc to produce JSON IR. Also runs fidl-lint and SDK checks.
# ${target_name}_${binding_name}_generate
# (Bindings: rust, hlcpp, llcpp, banjo_{c,cpp,rust}, bindlib)
# Invokes fidlgen_${binding_name} on IR from ${target_name}($fidl_toolchain).
# go_toolchain, dart_toolchain
# ${target_name}
# Invokes fidlgen_{go,dart} on IR from ${target_name}($fidl_toolchain),
# and compiles the result as a library.
# all other toolchains
# ${target_name}_${binding_name}
# (Bindings: rust, hlcpp, llcpp, banjo_{c,cpp,rust}, bindlib)
# Compiles ${target_name}_${binding_name}_generate($fidl_toolchain) as a
# source_set or rustc_library.
# ${target_name}_tables
# Compiles the coding tables from ${target_name}($fidl_toolchain).
# ${target_name}_c
# Compiles the C simple client/server from ${target_name}($fidl_toolchain).
#
# Running code generators in the FIDL toolchain ensures we only codegen once
# rather than N times for fuchsia/host, x64/arm, ASan, etc.
#
# Users of the bindings should depend on:
#
# ${target_name}($dart_toolchain) for Dart bindings
# ${target_name}($go_toolchain) for Go bindings
# ${target_name}_${binding_name} for all other bindings
#
# Parameters
#
# sources (required)
# List of paths to library source files.
#
# name (optional)
# Name of the library.
# Defaults to the target's name.
#
# sdk_category (optional)
# Publication level of the library in SDKs.
# See //build/sdk/sdk_atom.gni.
#
# api (optional)
# Path to the file representing the API of this library.
# This file is used to ensure modifications to the library's API are
# explicitly acknowledged. It is mandatory for publication categories of
# "partner" or "public".
# Defaults to "<target name>.api".
#
# excluded_checks (optional)
# A list of fidl-lint check IDs to ignore (by passing the command line flag
# "-e some-check-id" for each value).
#
# fuzzers (optional)
# Protocol/methods for which to generate LibFuzzer fuzz targets. Example:
# [
# {
# # Required:
# protocol = "fully.qualified.FIDLProtocolName"
# # Optional. Default: All methods in protocol.
# methods = [ "MethodName1", "MethodName2", ... ]
# },
# ...
# ]
#
# golden_fuzzer (optional)
# Boolean flag to generate a LibFuzzer fuzz target for all protocols, used
# to ensure fuzzers for golden libraries compile successfully.
#
# experimental_flags (optional)
# A list of experimental fidlc features to enable.
#
# goldens_dir (optional, default "//sdk/history")
# The directory containing golden files for this FIDL API, per API level.
# Should not contain a trailing slash. This is only used if the API is
# publishable in an SDK.
#
# non_fidl_deps (optional)
# A list of non-FIDL dependency targets, i.e. targets that don't contribute
# FIDL artifacts, but should be built before this target regardless. This is
# typically used when `sources` contains files generated by another target.
#
# should_lint (optional, boolean)
# If set to false, the linting step is skipped.
#
# lenient_api_summary (optional, boolean, default false)
# If false, the builder will check the generated FIDL API summary files against
# their checked in version. If true, the checks will emit warnings instead
# of errors. This switch is used to deploy API summary checks across petals
# without breaking global integration.
#
# dart_analysis (optional, boolean, default false)
# If set to true, dart analysis is run on generated Dart bindings.
# Dart analysis can take tens of seconds to finish, so running it for all
# generated Dart bindings is wasteful. This parameter allows us to only run
# analysis on goldens, and skip for other generated bindings. See fxb/82975
# for details.
#
# contains_drivers (optional, boolean, default false)
# Indicates if any of the FIDL files contain the driver transport or
# references to the driver transport.
#
# public_deps
# testonly
# visibility
#
template("fidl") {
assert(defined(invoker.sources), "A FIDL library requires some sources.")
assert(!defined(invoker.deps),
"All FIDL dependencies are inherently " +
"public, use 'public_deps' instead of 'deps'.")
# Parameters forwarded to nearly every internal template.
common_parameters = [
"name",
"public_deps",
"sdk_category",
"testonly",
"visibility",
]
# Parameters forwarded only to fidl_library.
fidl_only_parameters = [
"api",
"excluded_checks",
"experimental_flags",
"goldens_dir",
"lenient_api_summary",
"non_fidl_deps",
"should_lint",
"sources",
]
# Parameters forwarded only to fidl_dart.
dart_only_parameters = [ "dart_analysis" ]
# Parameters forwarded only to fidl_go.
go_only_parameters = []
# Parameters forwarded only to fidl_cpp_family.
cpp_only_parameters = [
"contains_drivers",
"fuzzers",
"golden_fuzzer",
]
all_parameters =
common_parameters + fidl_only_parameters + dart_only_parameters +
go_only_parameters + cpp_only_parameters
# Allow generated targets visibility to their dependant generated targets
if (defined(invoker.visibility)) {
invoker.visibility += [ ":*" ]
}
if (current_toolchain == fidl_toolchain) {
needed_parameters =
common_parameters + fidl_only_parameters + cpp_only_parameters
not_needed(invoker, all_parameters - needed_parameters)
# FIDL toolchain: run fidlc to generate the JSON IR.
import("//build/fidl/fidl_library.gni")
fidl_library(target_name) {
forward_variables_from(invoker, common_parameters + fidl_only_parameters)
}
# The targets below generate bindings from the JSON IR, but they do not
# build them. That is done in the target toolchain (when current_toolchain
# is anything other than {fidl,go,dart}_toolchain).
import("//build/cpp/fidl_cpp.gni")
fidl_cpp_family(target_name) {
forward_variables_from(invoker, common_parameters + cpp_only_parameters)
}
import("//build/banjo/fidl_banjo.gni")
fidl_banjo(target_name) {
forward_variables_from(invoker, common_parameters)
}
import("//build/rust/fidl_rust.gni")
fidl_rust(target_name) {
forward_variables_from(invoker, common_parameters)
}
import("//build/bind/fidl_bind_library.gni")
fidl_bind_library(target_name) {
forward_variables_from(invoker, common_parameters)
}
} else if (current_toolchain == dart_toolchain) {
# Dart toolchain: generate Dart bindings and build/analyze them.
import("//build/dart/fidl_dart.gni")
dart_parameters = common_parameters + dart_only_parameters
not_needed(invoker, all_parameters - dart_parameters)
fidl_dart(target_name) {
forward_variables_from(invoker, dart_parameters)
}
} else if (current_toolchain == go_toolchain) {
# Go toolchain: generate Go bindings and build them.
import("//build/go/fidl_go.gni")
go_parameters = common_parameters + go_only_parameters
not_needed(invoker, all_parameters - go_parameters)
fidl_go(target_name) {
forward_variables_from(invoker, go_parameters)
}
} else {
needed_parameters = common_parameters + cpp_only_parameters
not_needed(invoker, all_parameters - needed_parameters)
# The targets below build code that was generated in the FIDL toolchain.
import("//build/cpp/fidl_cpp.gni")
fidl_cpp_family(target_name) {
forward_variables_from(invoker, common_parameters + cpp_only_parameters)
}
import("//build/banjo/fidl_banjo.gni")
fidl_banjo(target_name) {
forward_variables_from(invoker, common_parameters)
}
import("//build/rust/fidl_rust.gni")
fidl_rust(target_name) {
forward_variables_from(invoker, common_parameters)
}
import("//build/bind/fidl_bind_library.gni")
fidl_bind_library(target_name) {
forward_variables_from(invoker, common_parameters)
}
import("//build/c/fidl_c.gni")
fidl_tables(target_name) {
forward_variables_from(invoker, common_parameters)
}
# The C client/server are only provided on Fuchsia, not host.
if (is_fuchsia) {
fidl_c(target_name) {
forward_variables_from(invoker, common_parameters)
}
}
}
}