| Index: win_toolchain/get_toolchain_if_necessary.py
|
| diff --git a/win_toolchain/get_toolchain_if_necessary.py b/win_toolchain/get_toolchain_if_necessary.py
|
| index 7bb3eba5a2682f4c885d5351cc06f535ca7e806b..cb4b5da2c64e02936fae53d237b4ed9ea130bb1d 100755
|
| --- a/win_toolchain/get_toolchain_if_necessary.py
|
| +++ b/win_toolchain/get_toolchain_if_necessary.py
|
| @@ -33,13 +33,20 @@ import os
|
| import shutil
|
| import subprocess
|
| import sys
|
| +import tempfile
|
| import time
|
| +import zipfile
|
|
|
|
|
| BASEDIR = os.path.dirname(os.path.abspath(__file__))
|
| DEPOT_TOOLS_PATH = os.path.join(BASEDIR, '..')
|
| sys.path.append(DEPOT_TOOLS_PATH)
|
| -import download_from_google_storage
|
| +try:
|
| + import download_from_google_storage
|
| +except ImportError:
|
| + # Allow use of utility functions in this script from package_from_installed
|
| + # on bare VM that doesn't have a full depot_tools.
|
| + pass
|
|
|
| if sys.platform != 'cygwin':
|
| import ctypes.wintypes
|
| @@ -186,6 +193,32 @@ def DelayBeforeRemoving(target_dir):
|
| print
|
|
|
|
|
| +def DownloadUsingGsutil(filename):
|
| + """Downloads the given file from Google Storage chrome-wintoolchain bucket."""
|
| + temp_dir = tempfile.mkdtemp()
|
| + assert os.path.basename(filename) == filename
|
| + target_path = os.path.join(temp_dir, filename)
|
| + gsutil = download_from_google_storage.Gsutil(
|
| + download_from_google_storage.GSUTIL_DEFAULT_PATH, boto_path=None)
|
| + code = gsutil.call('cp', 'gs://chrome-wintoolchain/' + filename, target_path)
|
| + if code != 0:
|
| + sys.exit('gsutil failed')
|
| + return temp_dir, target_path
|
| +
|
| +
|
| +def DoTreeMirror(target_dir, tree_sha1):
|
| + """In order to save temporary space on bots that do not have enough space to
|
| + download ISOs, unpack them, and copy to the target location, the whole tree
|
| + is uploaded as a zip to internal storage, and then mirrored here."""
|
| + temp_dir, local_zip = DownloadUsingGsutil(tree_sha1 + '.zip')
|
| + sys.stdout.write('Extracting %s...\n' % local_zip)
|
| + sys.stdout.flush()
|
| + with zipfile.ZipFile(local_zip, 'r', zipfile.ZIP_DEFLATED, True) as zf:
|
| + zf.extractall(target_dir)
|
| + if temp_dir:
|
| + subprocess.check_call('rmdir /s/q "%s"' % temp_dir, shell=True)
|
| +
|
| +
|
| def main():
|
| if not sys.platform.startswith(('cygwin', 'win32')):
|
| return 0
|
| @@ -215,7 +248,13 @@ def main():
|
| # the downloader script is.
|
| os.chdir(os.path.normpath(os.path.join(BASEDIR)))
|
| toolchain_dir = '.'
|
| - target_dir = os.path.normpath(os.path.join(toolchain_dir, 'vs2013_files'))
|
| + if os.environ.get('GYP_MSVS_VERSION') == '2015':
|
| + target_dir = os.path.normpath(os.path.join(toolchain_dir, 'vs_files'))
|
| + else:
|
| + target_dir = os.path.normpath(os.path.join(toolchain_dir, 'vs2013_files'))
|
| + abs_target_dir = os.path.abspath(target_dir)
|
| +
|
| + got_new_toolchain = False
|
|
|
| # If the current hash doesn't match what we want in the file, nuke and pave.
|
| # Typically this script is only run when the .sha1 one file is updated, but
|
| @@ -224,8 +263,8 @@ def main():
|
| current_hash = CalculateHash(target_dir)
|
| if current_hash not in desired_hashes:
|
| should_use_gs = False
|
| - if (HaveSrcInternalAccess() or
|
| - LooksLikeGoogler() or
|
| + if (HaveSrcInternalAccess() or
|
| + LooksLikeGoogler() or
|
| CanAccessToolchainBucket()):
|
| should_use_gs = True
|
| if not CanAccessToolchainBucket():
|
| @@ -246,12 +285,35 @@ def main():
|
| stdin=nul, stdout=nul, stderr=nul)
|
| if os.path.isdir(target_dir):
|
| subprocess.check_call('rmdir /s/q "%s"' % target_dir, shell=True)
|
| - args = [sys.executable,
|
| - 'toolchain2013.py',
|
| - '--targetdir', target_dir,
|
| - '--sha1', desired_hashes[0],
|
| - '--use-gs']
|
| - subprocess.check_call(args)
|
| +
|
| + DoTreeMirror(target_dir, desired_hashes[0])
|
| +
|
| + got_new_toolchain = True
|
| +
|
| + win_sdk = os.path.join(abs_target_dir, 'win_sdk')
|
| + try:
|
| + with open(os.path.join(target_dir, 'VS_VERSION'), 'rb') as f:
|
| + vs_version = f.read().strip()
|
| + except IOError:
|
| + # Older toolchains didn't have the VS_VERSION file, and used 'win8sdk'
|
| + # instead of just 'win_sdk'.
|
| + vs_version = '2013'
|
| + win_sdk = os.path.join(abs_target_dir, 'win8sdk')
|
| +
|
| + data = {
|
| + 'path': abs_target_dir,
|
| + 'version': vs_version,
|
| + 'win_sdk': win_sdk,
|
| + 'wdk': os.path.join(abs_target_dir, 'wdk'),
|
| + 'runtime_dirs': [
|
| + os.path.join(abs_target_dir, 'sys64'),
|
| + os.path.join(abs_target_dir, 'sys32'),
|
| + ],
|
| + }
|
| + with open(os.path.join(target_dir, '..', 'data.json'), 'w') as f:
|
| + json.dump(data, f)
|
| +
|
| + if got_new_toolchain:
|
| current_hash = CalculateHash(target_dir)
|
| if current_hash not in desired_hashes:
|
| print >> sys.stderr, (
|
|
|