| # This file introduces a templates for defining fuzzers. |
| # |
| # All parameters valid for executable() targets are valid (cflags, defines, |
| # deps, include_dirs, sources, ...). In addition to that: |
| # |
| # dummy_main (required) |
| # Path to a cpp file containing main(), used when neither |
| # llvm_use_sanitize_coverage nor llvm_use_sanitize_coverage are set. |
| # |
| # Example of usage: |
| # |
| # fuzzer("llvm-opt-fuzzer") { |
| # deps = [ ... ] |
| # dummy_main = "DummyOptFuzzer.cpp" |
| # sources = [ "llvm-opt-fuzzer.cpp" ] |
| # } |
| |
| declare_args() { |
| # Set to the path of a static library containing a fuzzing engine, e.g. |
| # oss-fuzz's $LIB_FUZZING_ENGINE. |
| llvm_lib_fuzzing_engine = "" |
| |
| # If true, pass -fsanitize=fuzzer to the compiler for fuzzer() targets. |
| # Likely only makes sense to set if you know that the host compiler is clang. |
| llvm_use_sanitize_coverage = false |
| } |
| |
| template("fuzzer") { |
| assert(defined(invoker.dummy_main), "must set 'dummy_main' in $target_name") |
| assert(defined(invoker.sources), "must set 'sources' for $target_name") |
| executable(target_name) { |
| forward_variables_from(invoker, "*", [ "dummy_main" ]) |
| if (llvm_lib_fuzzing_engine != "") { |
| if (!defined(libs)) { |
| libs = [] |
| } |
| libs += [ llvm_lib_fuzzing_engine ] |
| not_needed(invoker, [ "dummy_main" ]) |
| } else if (llvm_use_sanitize_coverage) { |
| if (!defined(cflags)) { |
| cflags = [] |
| } |
| cflags += [ "-fsanitize=fuzzer" ] |
| not_needed(invoker, [ "dummy_main" ]) |
| } else { |
| sources += [ invoker.dummy_main ] |
| } |
| } |
| } |