| OLD | NEW |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright 2014 The Chromium Authors. All rights reserved. | 2 # Copyright 2014 The Chromium Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 | 5 |
| 6 """Creates IPC fuzzer packages suitable for uploading to ClusterFuzz. Stores | 6 """Creates IPC fuzzer packages suitable for uploading to ClusterFuzz. Stores |
| 7 the packages into chrome build directory. See fuzzer_list below for the list of | 7 the packages into chrome build directory. See fuzzer_list below for the list of |
| 8 fuzzers. | 8 fuzzers. |
| 9 """ | 9 """ |
| 10 | 10 |
| 11 import argparse | 11 import argparse |
| 12 import distutils.archive_util | 12 import distutils.archive_util |
| 13 import os | 13 import os |
| 14 import shutil | 14 import shutil |
| 15 import sys | 15 import sys |
| 16 import tempfile | 16 import tempfile |
| 17 | 17 |
| 18 FUZZER_LIST = [ | 18 FUZZER_LIST = [ |
| 19 'ipc_fuzzer_mut', | 19 'ipc_fuzzer_mut', |
| 20 'ipc_fuzzer_gen', | 20 'ipc_fuzzer_gen', |
| 21 ] | 21 ] |
| 22 | 22 |
| 23 class CFPackageBuilder: | 23 class CFPackageBuilder: |
| 24 def __init__(self): | 24 def __init__(self): |
| 25 self.fuzzer_list = FUZZER_LIST | 25 self.fuzzer_list = FUZZER_LIST |
| 26 | 26 |
| 27 def parse_args(self): | 27 def parse_arguments(self): |
| 28 desc = 'Builder of IPC fuzzer packages for ClusterFuzz' | 28 desc = 'Builder of IPC fuzzer packages for ClusterFuzz' |
| 29 parser = argparse.ArgumentParser(description=desc) | 29 parser = argparse.ArgumentParser(description=desc) |
| 30 parser.add_argument('--out-dir', dest='out_dir', default='out', | 30 parser.add_argument('--out-dir', dest='out_dir', default='out', |
| 31 help='output directory under src/ directory') | 31 help='output directory under src/ directory') |
| 32 parser.add_argument('--build-type', dest='build_type', default='Release', | 32 parser.add_argument('--build-type', dest='build_type', default='Release', |
| 33 help='Debug vs. Release build') | 33 help='Debug vs. Release build') |
| 34 self.args = parser.parse_args() | 34 self.args = parser.parse_args() |
| 35 | 35 |
| 36 def get_paths(self): | 36 def set_application_paths(self): |
| 37 script_path = os.path.realpath(__file__) | 37 script_path = os.path.realpath(__file__) |
| 38 self.mutate_dir = os.path.dirname(script_path) | 38 self.mutate_dir = os.path.dirname(script_path) |
| 39 src_dir = os.path.join(self.mutate_dir, os.pardir, os.pardir, os.pardir) | 39 src_dir = os.path.join(self.mutate_dir, os.pardir, os.pardir, os.pardir) |
| 40 src_dir = os.path.abspath(src_dir) | 40 src_dir = os.path.abspath(src_dir) |
| 41 out_dir = os.path.join(src_dir, self.args.out_dir) | 41 out_dir = os.path.join(src_dir, self.args.out_dir) |
| 42 self.build_dir = os.path.join(out_dir, self.args.build_type) | 42 self.build_dir = os.path.join(out_dir, self.args.build_type) |
| 43 | 43 |
| 44 def enter_tmp_workdir(self): | 44 def switch_to_temp_work_directory(self): |
| 45 self.old_cwd = os.getcwd() | 45 self.old_cwd = os.getcwd() |
| 46 self.work_dir = tempfile.mkdtemp() | 46 self.work_dir = tempfile.mkdtemp() |
| 47 os.chdir(self.work_dir) | 47 os.chdir(self.work_dir) |
| 48 | 48 |
| 49 def rm_tmp_workdir(self): | 49 def remove_temp_work_directory(self): |
| 50 os.chdir(self.old_cwd) | 50 os.chdir(self.old_cwd) |
| 51 shutil.rmtree(self.work_dir) | 51 shutil.rmtree(self.work_dir) |
| 52 | 52 |
| 53 def build_package(self, fuzzer): | 53 def build_package(self, fuzzer): |
| 54 os.makedirs(fuzzer) | 54 os.makedirs(fuzzer) |
| 55 fuzzer_src_path = os.path.join(self.mutate_dir, fuzzer + '.py') | 55 fuzzer_src_path = os.path.join(self.mutate_dir, fuzzer + '.py') |
| 56 fuzzer_dst_path = os.path.join(fuzzer, 'run.py') | 56 fuzzer_dst_path = os.path.join(fuzzer, 'run.py') |
| 57 shutil.copyfile(fuzzer_src_path, fuzzer_dst_path) | 57 shutil.copyfile(fuzzer_src_path, fuzzer_dst_path) |
| 58 utils_src_path = os.path.join(self.mutate_dir, 'utils.py') |
| 59 utils_dst_path = os.path.join(fuzzer, 'utils.py') |
| 60 shutil.copyfile(utils_src_path, utils_dst_path) |
| 58 distutils.archive_util.make_zipfile(fuzzer, fuzzer) | 61 distutils.archive_util.make_zipfile(fuzzer, fuzzer) |
| 59 package_name = fuzzer + '.zip' | 62 package_name = fuzzer + '.zip' |
| 60 shutil.copy(package_name, self.build_dir) | 63 shutil.copy(package_name, self.build_dir) |
| 61 final_package_path = os.path.join(self.build_dir, package_name) | 64 final_package_path = os.path.join(self.build_dir, package_name) |
| 62 print 'Built %s' % final_package_path | 65 print 'Built %s.' % final_package_path |
| 63 | 66 |
| 64 def main(self): | 67 def main(self): |
| 65 self.parse_args() | 68 self.parse_arguments() |
| 66 self.get_paths() | 69 self.set_application_paths() |
| 67 self.enter_tmp_workdir() | 70 self.switch_to_temp_work_directory() |
| 68 for fuzzer in self.fuzzer_list: | 71 for fuzzer in self.fuzzer_list: |
| 69 self.build_package(fuzzer) | 72 self.build_package(fuzzer) |
| 70 self.rm_tmp_workdir() | 73 self.remove_temp_work_directory() |
| 74 |
| 71 return 0 | 75 return 0 |
| 72 | 76 |
| 73 if __name__ == "__main__": | 77 if __name__ == "__main__": |
| 74 builder = CFPackageBuilder() | 78 builder = CFPackageBuilder() |
| 75 sys.exit(builder.main()) | 79 sys.exit(builder.main()) |
| OLD | NEW |