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 |