update-external-binaries.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #!/usr/bin/env python
  2. import argparse
  3. import errno
  4. import json
  5. import os
  6. from lib.config import PLATFORM, get_target_arch
  7. from lib.util import add_exec_bit, download, extract_zip, rm_rf, \
  8. safe_mkdir, tempdir
  9. SOURCE_ROOT = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
  10. def parse_args():
  11. parser = argparse.ArgumentParser(
  12. description='Download binaries for Electron build')
  13. parser.add_argument('--base-url', required=False,
  14. help="Base URL for all downloads")
  15. return parser.parse_args()
  16. def parse_config():
  17. config_path = os.path.join(SOURCE_ROOT, 'script', 'external-binaries.json')
  18. with open(config_path, 'r') as config_file:
  19. config = json.load(config_file)
  20. return config
  21. def main():
  22. args = parse_args()
  23. config = parse_config()
  24. base_url = args.base_url if args.base_url is not None else config['baseUrl']
  25. version = config['version']
  26. output_dir = os.path.join(SOURCE_ROOT, 'external_binaries')
  27. version_file = os.path.join(output_dir, '.version')
  28. if (is_updated(version_file, version)):
  29. return
  30. rm_rf(output_dir)
  31. safe_mkdir(output_dir)
  32. for binary in config['binaries']:
  33. if not binary_should_be_downloaded(binary):
  34. continue
  35. temp_path = download_binary(base_url, version, binary['url'])
  36. # We assume that all binaries are in zip archives.
  37. extract_zip(temp_path, output_dir)
  38. # Hack alert. Set exec bit for sccache binaries.
  39. # https://bugs.python.org/issue15795
  40. if 'sccache' in binary['url']:
  41. add_exec_bit_to_sccache_binary(output_dir)
  42. with open(version_file, 'w') as f:
  43. f.write(version)
  44. def is_updated(version_file, version):
  45. existing_version = ''
  46. try:
  47. with open(version_file, 'r') as f:
  48. existing_version = f.readline().strip()
  49. except IOError as e:
  50. if e.errno != errno.ENOENT:
  51. raise
  52. return existing_version == version
  53. def binary_should_be_downloaded(binary):
  54. if 'platform' in binary and binary['platform'] != PLATFORM:
  55. return False
  56. if 'targetArch' in binary and binary['targetArch'] != get_target_arch():
  57. return False
  58. return True
  59. def download_binary(base_url, version, binary_url):
  60. full_url = '{0}/{1}/{2}'.format(base_url, version, binary_url)
  61. temp_path = download_to_temp_dir(full_url, filename=binary_url)
  62. return temp_path
  63. def download_to_temp_dir(url, filename):
  64. download_dir = tempdir(prefix='electron-')
  65. file_path = os.path.join(download_dir, filename)
  66. download(text='Download ' + filename, url=url, path=file_path)
  67. return file_path
  68. def add_exec_bit_to_sccache_binary(binary_dir):
  69. binary_name = 'sccache'
  70. if PLATFORM == 'win32':
  71. binary_name += '.exe'
  72. binary_path = os.path.join(binary_dir, binary_name)
  73. add_exec_bit(binary_path)
  74. if __name__ == '__main__':
  75. main()