OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright 2013 The Chromium Authors. All rights reserved. | 2 # Copyright 2013 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 """Extracts a Windows VS2013 toolchain from various downloadable pieces.""" | 6 """Extracts a Windows VS2013 toolchain from various downloadable pieces.""" |
7 | 7 |
8 | 8 |
9 import ctypes | 9 import ctypes |
10 import optparse | 10 import optparse |
(...skipping 19 matching lines...) Expand all Loading... |
30 | 30 |
31 | 31 |
32 def RunOrDie(command): | 32 def RunOrDie(command): |
33 subprocess.check_call(command, shell=True) | 33 subprocess.check_call(command, shell=True) |
34 | 34 |
35 | 35 |
36 def TempDir(): | 36 def TempDir(): |
37 """Generates a temporary directory (for downloading or extracting to) and keep | 37 """Generates a temporary directory (for downloading or extracting to) and keep |
38 track of the directory that's created for cleaning up later. | 38 track of the directory that's created for cleaning up later. |
39 """ | 39 """ |
40 global g_temp_dirs | |
41 temp = tempfile.mkdtemp() | 40 temp = tempfile.mkdtemp() |
42 g_temp_dirs.append(temp) | 41 g_temp_dirs.append(temp) |
43 return temp | 42 return temp |
44 | 43 |
45 | 44 |
46 def DeleteAllTempDirs(): | 45 def DeleteAllTempDirs(): |
47 """Removes all temporary directories created by |TempDir()|.""" | 46 """Removes all temporary directories created by |TempDir()|.""" |
48 global g_temp_dirs | 47 global g_temp_dirs |
49 if g_temp_dirs: | 48 if g_temp_dirs: |
50 sys.stdout.write('Cleaning up temporaries...\n') | 49 sys.stdout.write('Cleaning up temporaries...\n') |
(...skipping 19 matching lines...) Expand all Loading... |
70 | 69 |
71 def Download(url, local_path): | 70 def Download(url, local_path): |
72 """Downloads a large-ish binary file and print some status information while | 71 """Downloads a large-ish binary file and print some status information while |
73 doing so. | 72 doing so. |
74 """ | 73 """ |
75 sys.stdout.write('Downloading %s...\n' % url) | 74 sys.stdout.write('Downloading %s...\n' % url) |
76 req = urllib2.urlopen(url) | 75 req = urllib2.urlopen(url) |
77 content_length = int(req.headers.get('Content-Length', 0)) | 76 content_length = int(req.headers.get('Content-Length', 0)) |
78 bytes_read = 0L | 77 bytes_read = 0L |
79 terminator = '\r' if sys.stdout.isatty() else '\n' | 78 terminator = '\r' if sys.stdout.isatty() else '\n' |
80 with open(local_path, 'wb') as file: | 79 with open(local_path, 'wb') as file_handle: |
81 while True: | 80 while True: |
82 chunk = req.read(1024 * 1024) | 81 chunk = req.read(1024 * 1024) |
83 if not chunk: | 82 if not chunk: |
84 break | 83 break |
85 bytes_read += len(chunk) | 84 bytes_read += len(chunk) |
86 file.write(chunk) | 85 file_handle.write(chunk) |
87 sys.stdout.write('... %d/%d%s' % (bytes_read, content_length, terminator)) | 86 sys.stdout.write('... %d/%d%s' % (bytes_read, content_length, terminator)) |
88 sys.stdout.flush() | 87 sys.stdout.flush() |
89 sys.stdout.write('\n') | 88 sys.stdout.write('\n') |
90 if content_length and content_length != bytes_read: | 89 if content_length and content_length != bytes_read: |
91 raise SystemExit('Got incorrect number of bytes downloading %s' % url) | 90 raise SystemExit('Got incorrect number of bytes downloading %s' % url) |
92 | 91 |
93 | 92 |
94 def ExtractIso(iso_path): | 93 def ExtractIso(iso_path): |
95 """Uses 7zip to extract the contents of the given .iso (or self-extracting | 94 """Uses 7zip to extract the contents of the given .iso (or self-extracting |
96 .exe). | 95 .exe). |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
174 def CopyToFinalLocation(extracted_dirs, target_dir): | 173 def CopyToFinalLocation(extracted_dirs, target_dir): |
175 sys.stdout.write('Copying to final location...\n') | 174 sys.stdout.write('Copying to final location...\n') |
176 mappings = { | 175 mappings = { |
177 'Program Files\\Microsoft Visual Studio 12.0\\': '.\\', | 176 'Program Files\\Microsoft Visual Studio 12.0\\': '.\\', |
178 'System64\\': 'sys64\\', | 177 'System64\\': 'sys64\\', |
179 'System\\': 'sys32\\', | 178 'System\\': 'sys32\\', |
180 'Windows Kits\\8.0\\': 'win8sdk\\', | 179 'Windows Kits\\8.0\\': 'win8sdk\\', |
181 } | 180 } |
182 matches = [] | 181 matches = [] |
183 for extracted_dir in extracted_dirs: | 182 for extracted_dir in extracted_dirs: |
184 for root, dirnames, filenames in os.walk(extracted_dir): | 183 for root, _, filenames in os.walk(extracted_dir): |
185 for filename in filenames: | 184 for filename in filenames: |
186 matches.append((extracted_dir, os.path.join(root, filename))) | 185 matches.append((extracted_dir, os.path.join(root, filename))) |
187 | 186 |
188 copies = [] | 187 copies = [] |
189 for prefix, full_path in matches: | 188 for prefix, full_path in matches: |
190 # +1 for trailing \. | 189 # +1 for trailing \. |
191 partial_path = full_path[len(prefix) + 1:] | 190 partial_path = full_path[len(prefix) + 1:] |
192 for map_from, map_to in mappings.iteritems(): | 191 for map_from, map_to in mappings.iteritems(): |
193 if partial_path.startswith(map_from): | 192 if partial_path.startswith(map_from): |
194 target_path = os.path.join(map_to, partial_path[len(map_from):]) | 193 target_path = os.path.join(map_to, partial_path[len(map_from):]) |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
258 parser.add_option('--targetdir', metavar='DIR', | 257 parser.add_option('--targetdir', metavar='DIR', |
259 help='put toolchain into DIR', | 258 help='put toolchain into DIR', |
260 default=os.path.join(BASEDIR, 'win_toolchain_2013')) | 259 default=os.path.join(BASEDIR, 'win_toolchain_2013')) |
261 parser.add_option('--noclean', action='store_false', dest='clean', | 260 parser.add_option('--noclean', action='store_false', dest='clean', |
262 help='do not remove temp files', | 261 help='do not remove temp files', |
263 default=True) | 262 default=True) |
264 parser.add_option('--local', metavar='DIR', | 263 parser.add_option('--local', metavar='DIR', |
265 help='use downloaded files from DIR') | 264 help='use downloaded files from DIR') |
266 parser.add_option('--express', | 265 parser.add_option('--express', |
267 help='use VS Express instead of Pro', action='store_true') | 266 help='use VS Express instead of Pro', action='store_true') |
268 options, args = parser.parse_args() | 267 options, _ = parser.parse_args() |
269 try: | 268 try: |
270 target_dir = os.path.abspath(options.targetdir) | 269 target_dir = os.path.abspath(options.targetdir) |
271 if os.path.exists(target_dir): | 270 if os.path.exists(target_dir): |
272 parser.error('%s already exists. Please [re]move it or use ' | 271 parser.error('%s already exists. Please [re]move it or use ' |
273 '--targetdir to select a different target.\n' % | 272 '--targetdir to select a different target.\n' % |
274 target_dir) | 273 target_dir) |
275 # Set the working directory to 7z subdirectory. 7-zip doesn't find its | 274 # Set the working directory to 7z subdirectory. 7-zip doesn't find its |
276 # codec dll very well, so this is the simplest way to make sure it runs | 275 # codec dll very well, so this is the simplest way to make sure it runs |
277 # correctly, as we don't otherwise care about working directory. | 276 # correctly, as we don't otherwise care about working directory. |
278 os.chdir(os.path.join(BASEDIR, '7z')) | 277 os.chdir(os.path.join(BASEDIR, '7z')) |
279 image = GetSourceImage(options.local, not options.express) | 278 image = GetSourceImage(options.local, not options.express) |
280 extracted = ExtractComponents(image) | 279 extracted = ExtractComponents(image) |
281 CopyToFinalLocation(extracted, target_dir) | 280 CopyToFinalLocation(extracted, target_dir) |
282 | 281 |
283 GenerateSetEnvCmd(target_dir, not options.express) | 282 GenerateSetEnvCmd(target_dir, not options.express) |
284 finally: | 283 finally: |
285 if options.clean: | 284 if options.clean: |
286 DeleteAllTempDirs() | 285 DeleteAllTempDirs() |
287 | 286 |
288 | 287 |
289 if __name__ == '__main__': | 288 if __name__ == '__main__': |
290 sys.exit(main()) | 289 sys.exit(main()) |
OLD | NEW |