#!/usr/bin/env python # Copyright 2014 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Creates IPC fuzzer packages suitable for uploading to ClusterFuzz. Stores the packages into chrome build directory. See fuzzer_list below for the list of fuzzers. """ import argparse import distutils.archive_util import os import shutil import sys import tempfile FUZZER_LIST = [ 'ipc_fuzzer_mut', 'ipc_fuzzer_gen', ] class CFPackageBuilder: def __init__(self): self.fuzzer_list = FUZZER_LIST def parse_arguments(self): desc = 'Builder of IPC fuzzer packages for ClusterFuzz' parser = argparse.ArgumentParser(description=desc) parser.add_argument('--out-dir', dest='out_dir', default='out', help='output directory under src/ directory') parser.add_argument('--build-type', dest='build_type', default='Release', help='Debug vs. Release build') self.args = parser.parse_args() def set_application_paths(self): script_path = os.path.realpath(__file__) self.mutate_dir = os.path.dirname(script_path) src_dir = os.path.join(self.mutate_dir, os.pardir, os.pardir, os.pardir) src_dir = os.path.abspath(src_dir) out_dir = os.path.join(src_dir, self.args.out_dir) self.build_dir = os.path.join(out_dir, self.args.build_type) def switch_to_temp_work_directory(self): self.old_cwd = os.getcwd() self.work_dir = tempfile.mkdtemp() os.chdir(self.work_dir) def remove_temp_work_directory(self): os.chdir(self.old_cwd) shutil.rmtree(self.work_dir) def build_package(self, fuzzer): os.makedirs(fuzzer) fuzzer_src_path = os.path.join(self.mutate_dir, fuzzer + '.py') fuzzer_dst_path = os.path.join(fuzzer, 'run.py') shutil.copyfile(fuzzer_src_path, fuzzer_dst_path) utils_src_path = os.path.join(self.mutate_dir, 'utils.py') utils_dst_path = os.path.join(fuzzer, 'utils.py') shutil.copyfile(utils_src_path, utils_dst_path) distutils.archive_util.make_zipfile(fuzzer, fuzzer) package_name = fuzzer + '.zip' shutil.copy(package_name, self.build_dir) final_package_path = os.path.join(self.build_dir, package_name) print 'Built %s.' % final_package_path def main(self): self.parse_arguments() self.set_application_paths() self.switch_to_temp_work_directory() for fuzzer in self.fuzzer_list: self.build_package(fuzzer) self.remove_temp_work_directory() return 0 if __name__ == "__main__": builder = CFPackageBuilder() sys.exit(builder.main())