forked from electron/electron
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathupdate-external-binaries.py
executable file
·108 lines (75 loc) · 2.75 KB
/
update-external-binaries.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#!/usr/bin/env python
import argparse
import errno
import json
import os
from lib.config import PLATFORM, get_target_arch
from lib.util import add_exec_bit, download, extract_zip, rm_rf, \
safe_mkdir, tempdir
SOURCE_ROOT = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
def parse_args():
parser = argparse.ArgumentParser(
description='Download binaries for Electron build')
parser.add_argument('--base-url', required=False,
help="Base URL for all downloads")
return parser.parse_args()
def parse_config():
config_path = os.path.join(SOURCE_ROOT, 'script', 'external-binaries.json')
with open(config_path, 'r') as config_file:
config = json.load(config_file)
return config
def main():
args = parse_args()
config = parse_config()
base_url = args.base_url if args.base_url is not None else config['baseUrl']
version = config['version']
output_dir = os.path.join(SOURCE_ROOT, 'external_binaries')
version_file = os.path.join(output_dir, '.version')
if (is_updated(version_file, version)):
return
rm_rf(output_dir)
safe_mkdir(output_dir)
for binary in config['binaries']:
if not binary_should_be_downloaded(binary):
continue
temp_path = download_binary(base_url, version, binary['url'])
# We assume that all binaries are in zip archives.
extract_zip(temp_path, output_dir)
# Hack alert. Set exec bit for sccache binaries.
# https://bugs.python.org/issue15795
if 'sccache' in binary['url']:
add_exec_bit_to_sccache_binary(output_dir)
with open(version_file, 'w') as f:
f.write(version)
def is_updated(version_file, version):
existing_version = ''
try:
with open(version_file, 'r') as f:
existing_version = f.readline().strip()
except IOError as e:
if e.errno != errno.ENOENT:
raise
return existing_version == version
def binary_should_be_downloaded(binary):
if 'platform' in binary and binary['platform'] != PLATFORM:
return False
if 'targetArch' in binary and binary['targetArch'] != get_target_arch():
return False
return True
def download_binary(base_url, version, binary_url):
full_url = '{0}/{1}/{2}'.format(base_url, version, binary_url)
temp_path = download_to_temp_dir(full_url, filename=binary_url)
return temp_path
def download_to_temp_dir(url, filename):
download_dir = tempdir(prefix='electron-')
file_path = os.path.join(download_dir, filename)
download(text='Download ' + filename, url=url, path=file_path)
return file_path
def add_exec_bit_to_sccache_binary(binary_dir):
binary_name = 'sccache'
if PLATFORM == 'win32':
binary_name += '.exe'
binary_path = os.path.join(binary_dir, binary_name)
add_exec_bit(binary_path)
if __name__ == '__main__':
main()