|  | # 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") { | 
|  | 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 | 
|  | } | 
|  | } |