Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(190)

Side by Side Diff: win_toolchain/get_toolchain_if_necessary.py

Issue 1181943003: make `python build/vs_toolchain.py update` work a bit better on non-windows (Closed) Base URL: https://chromium.googlesource.com/chromium/tools/depot_tools.git@master
Patch Set: . Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 """Downloads and unpacks a toolchain for building on Windows. The contents are 6 """Downloads and unpacks a toolchain for building on Windows. The contents are
7 matched by sha1 which will be updated when the toolchain is updated. 7 matched by sha1 which will be updated when the toolchain is updated.
8 8
9 Having a toolchain script in depot_tools means that it's not versioned 9 Having a toolchain script in depot_tools means that it's not versioned
10 directly with the source code. That is, if the toolchain is upgraded, but 10 directly with the source code. That is, if the toolchain is upgraded, but
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
121 return True 121 return True
122 return subprocess.call( 122 return subprocess.call(
123 ['git', '-c', 'core.askpass=true', 'remote', 'show', 123 ['git', '-c', 'core.askpass=true', 'remote', 'show',
124 'https://chrome-internal.googlesource.com/chrome/src-internal/'], 124 'https://chrome-internal.googlesource.com/chrome/src-internal/'],
125 shell=True, stdin=nul, stdout=nul, stderr=nul) == 0 125 shell=True, stdin=nul, stdout=nul, stderr=nul) == 0
126 126
127 127
128 def LooksLikeGoogler(): 128 def LooksLikeGoogler():
129 """Checks for a USERDOMAIN environment variable of 'GOOGLE', which 129 """Checks for a USERDOMAIN environment variable of 'GOOGLE', which
130 probably implies the current user is a Googler.""" 130 probably implies the current user is a Googler."""
131 return os.environ.get('USERDOMAIN').upper() == 'GOOGLE' 131 return os.environ.get('USERDOMAIN', '').upper() == 'GOOGLE'
132 132
133 133
134 def CanAccessToolchainBucket(): 134 def CanAccessToolchainBucket():
135 """Checks whether the user has access to gs://chrome-wintoolchain/.""" 135 """Checks whether the user has access to gs://chrome-wintoolchain/."""
136 gsutil = download_from_google_storage.Gsutil( 136 gsutil = download_from_google_storage.Gsutil(
137 download_from_google_storage.GSUTIL_DEFAULT_PATH, boto_path=None) 137 download_from_google_storage.GSUTIL_DEFAULT_PATH, boto_path=None)
138 code, _, _ = gsutil.check_call('ls', 'gs://chrome-wintoolchain/') 138 code, _, _ = gsutil.check_call('ls', 'gs://chrome-wintoolchain/')
139 return code == 0 139 return code == 0
140 140
141 141
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
183 assert os.path.basename(filename) == filename 183 assert os.path.basename(filename) == filename
184 target_path = os.path.join(temp_dir, filename) 184 target_path = os.path.join(temp_dir, filename)
185 gsutil = download_from_google_storage.Gsutil( 185 gsutil = download_from_google_storage.Gsutil(
186 download_from_google_storage.GSUTIL_DEFAULT_PATH, boto_path=None) 186 download_from_google_storage.GSUTIL_DEFAULT_PATH, boto_path=None)
187 code = gsutil.call('cp', 'gs://chrome-wintoolchain/' + filename, target_path) 187 code = gsutil.call('cp', 'gs://chrome-wintoolchain/' + filename, target_path)
188 if code != 0: 188 if code != 0:
189 sys.exit('gsutil failed') 189 sys.exit('gsutil failed')
190 return temp_dir, target_path 190 return temp_dir, target_path
191 191
192 192
193 def RmDir(path):
194 """Deletes path and all the files it contains."""
195 if sys.platform != 'win32':
196 shutil.rmtree(path, ignore_errors=True)
197 else:
198 # shutil.rmtree() doesn't delete read-only files on Windows.
199 subprocess.check_call('rmdir /s/q "%s"' % path, shell=True)
200
201
193 def DoTreeMirror(target_dir, tree_sha1): 202 def DoTreeMirror(target_dir, tree_sha1):
194 """In order to save temporary space on bots that do not have enough space to 203 """In order to save temporary space on bots that do not have enough space to
195 download ISOs, unpack them, and copy to the target location, the whole tree 204 download ISOs, unpack them, and copy to the target location, the whole tree
196 is uploaded as a zip to internal storage, and then mirrored here.""" 205 is uploaded as a zip to internal storage, and then mirrored here."""
197 temp_dir, local_zip = DownloadUsingGsutil(tree_sha1 + '.zip') 206 temp_dir, local_zip = DownloadUsingGsutil(tree_sha1 + '.zip')
198 sys.stdout.write('Extracting %s...\n' % local_zip) 207 sys.stdout.write('Extracting %s...\n' % local_zip)
199 sys.stdout.flush() 208 sys.stdout.flush()
200 with zipfile.ZipFile(local_zip, 'r', zipfile.ZIP_DEFLATED, True) as zf: 209 with zipfile.ZipFile(local_zip, 'r', zipfile.ZIP_DEFLATED, True) as zf:
201 zf.extractall(target_dir) 210 zf.extractall(target_dir)
202 if temp_dir: 211 if temp_dir:
203 subprocess.check_call('rmdir /s/q "%s"' % temp_dir, shell=True) 212 RmDir(temp_dir)
204 213
205 214
206 def main(): 215 def main():
207 if not sys.platform.startswith(('cygwin', 'win32')): 216 if not sys.platform.startswith(('cygwin', 'win32')):
208 return 0 217 return 0
209 218
210 parser = optparse.OptionParser(description=sys.modules[__name__].__doc__) 219 parser = optparse.OptionParser(description=sys.modules[__name__].__doc__)
211 parser.add_option('--output-json', metavar='FILE', 220 parser.add_option('--output-json', metavar='FILE',
212 help='write information about toolchain to FILE') 221 help='write information about toolchain to FILE')
213 options, args = parser.parse_args() 222 options, args = parser.parse_args()
214 223
215 if sys.platform == 'cygwin': 224 if sys.platform == 'cygwin':
216 # This script requires Windows Python, so invoke with depot_tools' Python. 225 # This script requires Windows Python, so invoke with depot_tools' Python.
217 def winpath(path): 226 def winpath(path):
218 return subprocess.check_output(['cygpath', '-w', path]).strip() 227 return subprocess.check_output(['cygpath', '-w', path]).strip()
219 python = os.path.join(DEPOT_TOOLS_PATH, 'python.bat') 228 python = os.path.join(DEPOT_TOOLS_PATH, 'python.bat')
220 cmd = [python, winpath(__file__)] 229 cmd = [python, winpath(__file__)]
221 if options.output_json: 230 if options.output_json:
222 cmd.extend(['--output-json', winpath(options.output_json)]) 231 cmd.extend(['--output-json', winpath(options.output_json)])
223 cmd.extend(args) 232 cmd.extend(args)
224 sys.exit(subprocess.call(cmd)) 233 sys.exit(subprocess.call(cmd))
234 assert sys.platform != 'cygwin'
225 235
226 # We assume that the Pro hash is the first one. 236 # We assume that the Pro hash is the first one.
227 desired_hashes = args 237 desired_hashes = args
228 if len(desired_hashes) == 0: 238 if len(desired_hashes) == 0:
229 sys.exit('Desired hashes are required.') 239 sys.exit('Desired hashes are required.')
230 240
231 # Move to depot_tools\win_toolchain where we'll store our files, and where 241 # Move to depot_tools\win_toolchain where we'll store our files, and where
232 # the downloader script is. 242 # the downloader script is.
233 os.chdir(os.path.normpath(os.path.join(BASEDIR))) 243 os.chdir(os.path.normpath(os.path.join(BASEDIR)))
234 toolchain_dir = '.' 244 toolchain_dir = '.'
(...skipping 21 matching lines...) Expand all
256 if not should_use_gs: 266 if not should_use_gs:
257 print('Please follow the instructions at ' 267 print('Please follow the instructions at '
258 'http://www.chromium.org/developers/how-tos/' 268 'http://www.chromium.org/developers/how-tos/'
259 'build-instructions-windows') 269 'build-instructions-windows')
260 return 1 270 return 1
261 print('Windows toolchain out of date or doesn\'t exist, updating (Pro)...') 271 print('Windows toolchain out of date or doesn\'t exist, updating (Pro)...')
262 print(' current_hash: %s' % current_hash) 272 print(' current_hash: %s' % current_hash)
263 print(' desired_hashes: %s' % ', '.join(desired_hashes)) 273 print(' desired_hashes: %s' % ', '.join(desired_hashes))
264 sys.stdout.flush() 274 sys.stdout.flush()
265 DelayBeforeRemoving(target_dir) 275 DelayBeforeRemoving(target_dir)
266 # This stays resident and will make the rmdir below fail. 276 if sys.platform == 'win32':
267 with open(os.devnull, 'wb') as nul: 277 # This stays resident and will make the rmdir below fail.
268 subprocess.call(['taskkill', '/f', '/im', 'mspdbsrv.exe'], 278 with open(os.devnull, 'wb') as nul:
269 stdin=nul, stdout=nul, stderr=nul) 279 subprocess.call(['taskkill', '/f', '/im', 'mspdbsrv.exe'],
280 stdin=nul, stdout=nul, stderr=nul)
270 if os.path.isdir(target_dir): 281 if os.path.isdir(target_dir):
271 subprocess.check_call('rmdir /s/q "%s"' % target_dir, shell=True) 282 RmDir(target_dir)
272 283
273 DoTreeMirror(target_dir, desired_hashes[0]) 284 DoTreeMirror(target_dir, desired_hashes[0])
274 285
275 got_new_toolchain = True 286 got_new_toolchain = True
276 287
277 win_sdk = os.path.join(abs_target_dir, 'win_sdk') 288 win_sdk = os.path.join(abs_target_dir, 'win_sdk')
278 try: 289 try:
279 with open(os.path.join(target_dir, 'VS_VERSION'), 'rb') as f: 290 with open(os.path.join(target_dir, 'VS_VERSION'), 'rb') as f:
280 vs_version = f.read().strip() 291 vs_version = f.read().strip()
281 except IOError: 292 except IOError:
(...skipping 29 matching lines...) Expand all
311 322
312 if options.output_json: 323 if options.output_json:
313 shutil.copyfile(os.path.join(target_dir, '..', 'data.json'), 324 shutil.copyfile(os.path.join(target_dir, '..', 'data.json'),
314 options.output_json) 325 options.output_json)
315 326
316 return 0 327 return 0
317 328
318 329
319 if __name__ == '__main__': 330 if __name__ == '__main__':
320 sys.exit(main()) 331 sys.exit(main())
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698