blob: 7274598279c01d0a52736cd460bcb21efa829500 [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/cpp/fidl_cpp.gni")
import("//build/fuzzing/fuzzer.gni")
# Defines service provider for a generated FIDL fuzzer
#
# The fidl() template supports a list of `fuzzers` that contain a `protocol`
# string and optional list of `methods`. Each of the fidl()'s `fuzzers`
# generates a library target of the form:
#
# [fidl() target name]_libfuzzer_[protocol]_[method1 name]_[method2 name]...
#
# The target contains the core fuzzer logic, but relies on symbols that must be
# defined by the FIDL service implementer for providing an instance of the
# service to fuzz.
#
# This template is a helper for tying together the above-mentioned target and
# the sources and/or deps necessary to provide the above-mentioned symbols.
#
# NOTE: The `protocol` and `methods` passed to this template must _exactly_
# match one of the `fuzzers` defined on the corresponding fidl() rule.
#
# Parameters
#
# fidl (required)
# [label] The `fidl()` label that includes the protocol to be fuzzed.
#
# protocol (required)
# [fully-qualified FIDL protocol name] The fully-qualified name of the FIDL
# protocol to be fuzzed.
#
# methods (optional)
# [list of strings] The names of the methods to be fuzzed, as they appear in
# the FIDL file. These are translated into defines that enable fuzzing code
# for the appropriate methods. Defaults to special define value for fuzzing
# all methods of the specified protocol.
#
# Other parameters are precisely those of an `executable`, with their usual GN
# meanings; these parameters are forwarded to the generated fuzzer() template.
template("fidl_protocol_fuzzer") {
if (is_fuchsia) {
assert(
defined(invoker.protocol),
"FIDL fuzzer service provider must set protocol: the fully-qualified name of the protocol to be fuzzed.")
assert(
defined(invoker.fidl),
"FIDL fuzzer service provider must set fidl: the fidl() target defining the corresponding fuzzer.")
protocol_suffix = string_replace(invoker.protocol, ".", "_")
if (defined(invoker.methods)) {
foreach(method, invoker.methods) {
protocol_suffix = "${protocol_suffix}_${method}"
}
}
if (defined(invoker.deps)) {
fuzzer_deps = invoker.deps
} else {
fuzzer_deps = []
}
fuzzer_deps += [
"${invoker.fidl}_libfuzzer_${protocol_suffix}",
"//sdk/lib/fidl/cpp/fuzzing",
]
fuzzer(target_name) {
forward_variables_from(invoker,
[
"aliased_deps",
"all_dependent_configs",
"asmflags",
"cflags_c",
"cflags_cc",
"cflags_objc",
"cflags_objcc",
"cflags",
"check_includes",
"manifest",
"configs",
"crate_name",
"crate_root",
"data_deps",
"data",
"dictionary",
"edition",
"friend",
"include_dirs",
"inputs",
"inputs",
"ldflags",
"lib_dirs",
"libs",
"metadata",
"options",
"output_extension",
"output_name",
"precompiled_header",
"precompiled_source",
"public_configs",
"public_deps",
"public",
"rustenv",
"rustflags",
"sources",
"testonly",
"visibility",
])
deps = fuzzer_deps
}
} else {
# Dummy targets for host toolchains. These match the expectations `fuzzer_package`.
#
# TODO(fxbug.dev/106057): Remove these once the transition to v2 GN templates is complete.
group(target_name) {
}
group("${target_name}_executable") {
}
group("${target_name}_test_executable") {
}
not_needed(invoker, "*")
}
}