| # 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/components.gni") |
| |
| # Defines a Fuchsia component for a fuzzer. |
| # See: https://fuchsia.dev/fuchsia-src/development/components/build |
| # |
| # This template extends `fuchsia_component` by automatically generating a fuzzer manifest to act as |
| # the component manifest. A fuzzer is a binary that generates and tests inputs in a (possibly open- |
| # ended) loop, looking for evidence of defects (e.g. crashes, memory corruptions, hangs, etc.). |
| # |
| # This template is NOT typically used directly. Instead, use templates like `fuzzer` from |
| # //build/fuzzing/fuzzer.gni |
| # |
| # Parameters: |
| # |
| # fuzzer (required) |
| # [string] The name of the fuzzer. |
| # |
| # label (required) |
| # [label] The GN label of the associated fuzzer. |
| # |
| # deps (required) |
| # [list of labels] Same meaning as for `fuchsia_component`, but required. This typically |
| # includes the fuzzer binary. It may also include the fuzzer corpus and dictionary, when |
| # present. |
| # |
| # options (optional) |
| # [list of strings] Key-value pairs representing libFuzzer options, e.g. "foo=bar". See |
| # See https://llvm.org/docs/LibFuzzer.html#options. |
| # |
| template("fuzzer_component") { |
| if (current_toolchain == default_toolchain) { |
| assert(defined(invoker.fuzzer), |
| "missing 'fuzzer' for fuzzer_component($target_name)") |
| assert(defined(invoker.label), |
| "missing 'label' for fuzzer_component($target_name)") |
| assert(defined(invoker.deps), |
| "missing 'deps' for fuzzer_component($target_name)") |
| |
| meta_target_name = "${target_name}_metadata" |
| |
| fuchsia_unittest_component(target_name) { |
| forward_variables_from(invoker, [ "visibility" ]) |
| component_name = invoker.fuzzer |
| deps = invoker.deps + [ ":$meta_target_name" ] |
| |
| # TODO(fxbug.dev/76528) Support fuzzers in v2 testing. |
| v2 = false |
| } |
| |
| group(meta_target_name) { |
| testonly = true |
| deps = invoker.deps + [ "//build/fuzzing:includes_cmx" ] |
| |
| metadata = { |
| test_component_manifest_cmx = [ |
| { |
| forward_variables_from(invoker, [ "include" ]) |
| program = { |
| if (defined(invoker.options)) { |
| args = [] |
| foreach(option, invoker.options) { |
| args += [ "-$option" ] |
| } |
| } |
| } |
| }, |
| ] |
| |
| fuzz_spec = [ |
| { |
| label = invoker.label |
| fuzzer = invoker.fuzzer |
| manifest = get_target_outputs(":${invoker.target_name}") |
| manifest = get_path_info(manifest[0], "file") |
| }, |
| ] |
| } |
| } |
| } else { |
| group(target_name) { |
| testonly = true |
| deps = [ ":$target_name($default_toolchain)" ] |
| } |
| not_needed(invoker, "*") |
| } |
| } |