| #!/usr/bin/env python3 | |
| # Copyright 2023 The Chromium Authors | |
| # Use of this source code is governed by a BSD-style license that can be | |
| # found in the LICENSE file. | |
| """Build all Chromium libfuzzer targets that have corresponding corpora. | |
| * Example usage: build_all_fuzzers.py --output-dir OUTPUT_DIR | |
| """ | |
| import argparse | |
| import coverage_consts | |
| import logging | |
| import subprocess | |
| def _ParseCommandArguments(): | |
| """Adds and parses relevant arguments for tool comands. | |
| Returns: | |
| A dictionary representing the arguments. | |
| """ | |
| arg_parser = argparse.ArgumentParser() | |
| arg_parser.usage = __doc__ | |
| arg_parser.add_argument( | |
| '--output-dir', | |
| type=str, | |
| help=( | |
| 'Directory where fuzzers are to be built. GN args are assumed to ' | |
| 'have already been set.' | |
| ), | |
| ) | |
| args = arg_parser.parse_args() | |
| return args | |
| args = _ParseCommandArguments() | |
| def try_build(total_fuzzer_target): | |
| subprocess_cmd = ['autoninja', '-C', args.output_dir] | |
| subprocess_cmd.extend(total_fuzzer_target) | |
| logging.info("Build command: %s" % subprocess_cmd) | |
| try: | |
| subprocess.check_call(subprocess_cmd) | |
| except: | |
| logging.error("An error occured while building the fuzzers.") | |
| exit | |
| logging.info("Building all fuzzers") | |
| total_fuzzer_target = [] | |
| for count, fuzzer_target in enumerate(coverage_consts.FUZZERS_WITH_CORPORA, 1): | |
| total_fuzzer_target.append(fuzzer_target) | |
| if count % 200 == 0: | |
| # Autoninja throws a "path has too many components" error if you try to | |
| # to build too many targets at once, so clear the buffer every 350 targets. | |
| try_build(total_fuzzer_target) | |
| total_fuzzer_target = [] | |
| if total_fuzzer_target: | |
| try_build(total_fuzzer_target) | |
| logging.info("Built all fuzzers") |