Chromium Code Reviews| Index: infra/bots/isolate_win_toolchain.py |
| diff --git a/infra/bots/isolate_win_toolchain.py b/infra/bots/isolate_win_toolchain.py |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..ff01bd60d8e1636aef6c4e9465ca3e05711fc94a |
| --- /dev/null |
| +++ b/infra/bots/isolate_win_toolchain.py |
| @@ -0,0 +1,109 @@ |
| +#!/usr/bin/env python |
|
stephana
2016/03/10 15:03:36
Can you add a short description of what the script
borenet
2016/03/10 21:07:08
Done in https://codereview.chromium.org/1782943002
|
| +# |
| +# Copyright 2016 Google Inc. |
| +# |
| +# Use of this source code is governed by a BSD-style license that can be |
| +# found in the LICENSE file. |
| + |
| + |
| +import argparse |
| +import json |
| +import os |
| +import shlex |
| +import shutil |
| +import subprocess |
| +import sys |
| +import utils |
| + |
| + |
| +REPO_CHROME = 'https://chromium.googlesource.com/chromium/src.git' |
| +REPO_SKIA = 'https://skia.googlesource.com/skia.git' |
| + |
| + |
| +def get_toolchain_dir(toolchain_dir_output): |
| + """Find the toolchain directory.""" |
| + prefix = 'vs_path = ' |
| + for line in toolchain_dir_output.splitlines(): |
| + if line.startswith(prefix): |
| + return line[len(prefix):].strip('"') |
| + raise Exception('Unable to find toolchain dir in output:\n%s' % ( |
| + toolchain_dir_output)) |
| + |
| + |
| +def gen_toolchain(chrome_path, msvs_version, isolate_file): |
| + """Update the VS toolchain, isolate it, and return the isolated hash.""" |
| + with utils.chdir(chrome_path): |
| + subprocess.check_call([utils.GCLIENT, 'sync']) |
| + with utils.git_branch(): |
| + vs_toolchain_py = os.path.join('build', 'vs_toolchain.py') |
| + env = os.environ.copy() |
| + env['GYP_MSVS_VERSION'] = msvs_version |
| + subprocess.check_call(['python', vs_toolchain_py, 'update'], env=env) |
| + output = subprocess.check_output(['python', vs_toolchain_py, |
| + 'get_toolchain_dir'], env=env).rstrip() |
| + src_dir = get_toolchain_dir(output) |
| + |
| + # Isolate the toolchain. Assumes we're running on Windows, since the above |
| + # would fail otherwise. |
| + rel_path = os.path.relpath(src_dir, os.path.dirname(isolate_file)) |
| + isolate = os.path.join( |
| + os.curdir, 'tools', 'luci-go', 'win64', 'isolate.exe') |
| + isolate_cmd = [isolate, 'archive', '--quiet', |
| + '--isolate-server', 'https://isolateserver.appspot.com', |
| + '-i', isolate_file, |
| + '-s', 'win_toolchain_%s.isolated' % msvs_version, |
| + '--extra-variable', 'WIN_TOOLCHAIN_DIR=%s' % rel_path] |
| + isolate_out = subprocess.check_output(isolate_cmd).rstrip() |
| + return shlex.split(isolate_out)[0] |
| + |
| + |
| +def update_toolchain_file(skia_path, msvs_version, isolated_hash): |
| + """Edit the win_toolchain_hash file, upload a CL.""" |
| + with utils.chdir(skia_path): |
| + with utils.git_branch(): |
| + hash_file = os.path.join('infra', 'bots', 'win_toolchain_hash.json') |
| + with open(hash_file) as f: |
| + hashes = json.load(f) |
| + hashes[msvs_version] = isolated_hash |
| + with open(hash_file, 'w') as f: |
| + json.dump(hashes, f, indent=4, sort_keys=True) |
| + subprocess.check_call([utils.GIT, 'add', hash_file]) |
| + subprocess.check_call([utils.GIT, 'commit', '-m', 'Update Win toolchain']) |
| + subprocess.check_call([utils.GIT, 'cl', 'upload', '--bypass-hooks']) |
| + |
| + |
| +def main(): |
| + parser = argparse.ArgumentParser() |
| + parser.add_argument('--msvs_version', required=True) |
| + parser.add_argument('--chrome_path') |
| + parser.add_argument('--skia_path') |
| + args = parser.parse_args() |
| + |
| + isolate_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), |
| + 'win_toolchain.isolate') |
| + |
| + with utils.print_timings(): |
| + with utils.tmp_dir() as tmp_dir: |
| + chrome_path = args.chrome_path |
| + if not chrome_path: |
| + print ('Syncing Chrome from scratch. If you already have a checkout, ' |
| + 'specify --chrome_path to save time.') |
| + chrome_path = os.path.join(tmp_dir.name, 'src') |
| + if not os.path.isdir(chrome_path): |
| + utils.git_clone(REPO_CHROME, chrome_path) |
| + |
| + skia_path = args.skia_path |
| + if not skia_path: |
| + print ('Syncing Skia from scratch. If you already have a checkout, ' |
| + 'specify --chrome_path to save time.') |
| + skia_path = os.path.join(tmp_dir.name, 'skia') |
| + if not os.path.isdir(skia_path): |
| + utils.git_clone(REPO_SKIA, skia_path) |
| + |
| + isolated_hash = gen_toolchain(chrome_path, args.msvs_version, |
| + isolate_file) |
| + update_toolchain_file(skia_path, args.msvs_version, isolated_hash) |
| + |
| + |
| +if __name__ == '__main__': |
| + main() |