blob: 0b2688995ffaa50b792b732a63c2756331a5a307 [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/bind/fidl_bind_library.gni")
import("//build/dart/toolchain.gni")
import("//build/fidl/toolchain.gni")
import("//build/go/toolchain.gni")
# Declares a FIDL library.
#
# Depending on the toolchain in which this targets is expanded, it will yield
# different results:
# - in the FIDL toolchain, it will compile its source files into an
# intermediate representation consumable by language bindings generators;
# - in the target or shared toolchain, this will produce a source_set
# containing C++ 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)
# 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.
# Defaults to //sdk/history.
#
# 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.
#
# 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.
template("fidl") {
if (defined(invoker.sdk_category)) {
not_needed(invoker, [ "sdk_category" ])
}
if (defined(invoker.api)) {
not_needed(invoker, [ "api" ])
}
if (defined(invoker.excluded_checks)) {
not_needed(invoker, [ "excluded_checks" ])
}
if (defined(invoker.fuzzers)) {
not_needed(invoker, [ "fuzzers" ])
}
if (defined(invoker.golden_fuzzer)) {
not_needed(invoker, [ "golden_fuzzer" ])
}
if (defined(invoker.experimental_flags)) {
not_needed(invoker, [ "experimental_flags" ])
}
if (defined(invoker.goldens_dir)) {
not_needed(invoker, [ "goldens_dir" ])
}
if (defined(invoker.lenient_api_summary)) {
not_needed(invoker, [ "lenient_api_summary" ])
}
if (defined(invoker.dart_analysis)) {
not_needed(invoker, [ "dart_analysis" ])
}
if (defined(invoker.contains_drivers)) {
not_needed(invoker, [ "contains_drivers" ])
}
if (defined(invoker.should_lint)) {
not_needed(invoker, [ "should_lint" ])
}
# Allow generated targets visibility to their dependant generated targets
if (defined(invoker.visibility)) {
invoker.visibility += [ ":*" ]
}
assert(!defined(invoker.deps),
"All FIDL dependencies are inherently " +
"public, use 'public_deps' instead of 'deps'.")
deps = []
if (defined(invoker.non_fidl_deps)) {
deps += invoker.non_fidl_deps
}
if (current_toolchain == dart_toolchain) {
import("//build/dart/fidl_dart.gni")
fidl_dart(target_name) {
forward_variables_from(invoker, "*")
}
} else if (current_toolchain == go_toolchain) {
import("//build/go/fidl_go.gni")
fidl_go(target_name) {
forward_variables_from(invoker, "*")
}
} else {
if (current_toolchain == fidl_toolchain) {
import("//build/fidl/fidl_library.gni")
fidl_library(target_name) {
forward_variables_from(invoker, "*")
}
}
# Define the C++ family of generated bindings
import("//build/cpp/fidl_cpp.gni")
fidl_cpp_family(target_name) {
forward_variables_from(invoker, "*")
}
# Define FIDL coding tables target, used by C and C++
import("//build/c/fidl_c.gni")
fidl_tables(target_name) {
forward_variables_from(invoker,
[
"testonly",
"visibility",
])
}
import("//build/banjo/fidl_banjo.gni")
fidl_banjo(target_name) {
forward_variables_from(invoker, "*")
}
# TODO(cramertj): remove pending fxbug.dev/26853.
import("//build/rust/fidl_rust.gni")
fidl_rust(target_name) {
forward_variables_from(invoker, "*")
}
fidl_bind_library(target_name) {
forward_variables_from(invoker, "*")
}
# Define the C generated bindings
if (is_fuchsia) {
fidl_c_header(target_name) {
forward_variables_from(invoker, "*")
}
fidl_c_client(target_name) {
forward_variables_from(invoker, "*")
}
fidl_c_server(target_name) {
forward_variables_from(invoker, "*")
}
group("${target_name}_c") {
forward_variables_from(invoker,
[
"testonly",
"visibility",
])
public_deps = [
":${target_name}_client",
":${target_name}_header",
":${target_name}_server",
]
}
}
}
}