cf_package_builder.py 2.6 KB

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