blob: c76706c4a882c62fa318c7350f13942cf07e69c3 [file] [log] [blame]
# Copyright 2022 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/fuzzing/internal/library_fuzzer.gni")
# Creates a fuzzer binary.
#
# When built in a fuzzer toolchain variant, this template produces a fuzzer that uses libfuzzer as
# its fuzzing engine, and that is linked directly against one or more target libraries in the same
# process. The fuzzer generates and tests inputs in a loop, automatically discovering code paths and
# finding bugs.
#
# When built with a non-fuzzer toolchain variant, it produces a "fuzzer test" that exercises the
# same code as above with a set of fixed inputs. This is useful for ensuring the fuzzer code is
# buildable and, if inputs that previously caused are added to the fixed set, acting as a regression
# test.
#
# Parameters are the same as `executable` except that:
# $testonly cannot be set
# $variant_selector_target_type cannot be set
#
template("fuchsia_library_fuzzer") {
# Include the fuzzer executable.
fuzzer_target = "${target_name}_bin"
fuzzer_name = target_name
if (defined(invoker.output_name)) {
fuzzer_name = invoker.output_name
}
library_fuzzer(fuzzer_target) {
output_name = fuzzer_name
forward_variables_from(invoker,
"*",
[
"configs",
"output_name",
"target_type",
"visibility",
])
target_configs = invoker.configs
}
# Assemble the group.
group(target_name) {
testonly = true
forward_variables_from(invoker, [ "visibility" ])
deps = [
":$fuzzer_target",
"//src/sys/fuzzing/libfuzzer",
]
}
}
set_defaults("fuchsia_library_fuzzer") {
configs = default_executable_configs
}