1cb93a386Sopenharmony_ci#!/usr/bin/env python
2cb93a386Sopenharmony_ci#
3cb93a386Sopenharmony_ci# Copyright 2016 Google Inc.
4cb93a386Sopenharmony_ci#
5cb93a386Sopenharmony_ci# Use of this source code is governed by a BSD-style license that can be
6cb93a386Sopenharmony_ci# found in the LICENSE file.
7cb93a386Sopenharmony_ci
8cb93a386Sopenharmony_ci
9cb93a386Sopenharmony_ci"""
10cb93a386Sopenharmony_ciCreate an updated VS toolchain
11cb93a386Sopenharmony_ci
12cb93a386Sopenharmony_ciBefore you can run this script, you need a collated VC toolchain + Windows SDK.
13cb93a386Sopenharmony_ciTo generate that, run depot_tools/win_toolchain/package_from_installed.py
14cb93a386Sopenharmony_ciThat script pulls all of the compiler and SDK bits from your locally installed
15cb93a386Sopenharmony_civersion of Visual Studio. The comments in that script include instructions on
16cb93a386Sopenharmony_ciwhich components need to be installed (C++, ARM64, etc...)
17cb93a386Sopenharmony_ci
18cb93a386Sopenharmony_ciThat script produces a .zip file with a SHA filename. Unzip that file, then
19cb93a386Sopenharmony_cipass the unzipped directory as the src_dir to this script.
20cb93a386Sopenharmony_ci"""
21cb93a386Sopenharmony_ci
22cb93a386Sopenharmony_ci
23cb93a386Sopenharmony_cifrom __future__ import print_function
24cb93a386Sopenharmony_ciimport argparse
25cb93a386Sopenharmony_ciimport os
26cb93a386Sopenharmony_ciimport shlex
27cb93a386Sopenharmony_ciimport shutil
28cb93a386Sopenharmony_ciimport subprocess
29cb93a386Sopenharmony_ciimport sys
30cb93a386Sopenharmony_ci
31cb93a386Sopenharmony_ci
32cb93a386Sopenharmony_ciENV_VAR = 'WIN_TOOLCHAIN_SRC_DIR'
33cb93a386Sopenharmony_ci
34cb93a386Sopenharmony_ci
35cb93a386Sopenharmony_ci# By default the toolchain includes a bunch of unnecessary stuff with long path
36cb93a386Sopenharmony_ci# names. Trim out directories with these names.
37cb93a386Sopenharmony_ciIGNORE_LIST = [
38cb93a386Sopenharmony_ci  'WindowsMobile',
39cb93a386Sopenharmony_ci  'App Certification Kit',
40cb93a386Sopenharmony_ci  'Debuggers',
41cb93a386Sopenharmony_ci  'Extension SDKs',
42cb93a386Sopenharmony_ci  'DesignTime',
43cb93a386Sopenharmony_ci  'AccChecker',
44cb93a386Sopenharmony_ci]
45cb93a386Sopenharmony_ci
46cb93a386Sopenharmony_ci
47cb93a386Sopenharmony_cidef getenv(key):
48cb93a386Sopenharmony_ci  val = os.environ.get(key)
49cb93a386Sopenharmony_ci  if not val:
50cb93a386Sopenharmony_ci    print(('Environment variable %s not set; you should run this via '
51cb93a386Sopenharmony_ci           'create_and_upload.py.' % key), file=sys.stderr)
52cb93a386Sopenharmony_ci    sys.exit(1)
53cb93a386Sopenharmony_ci  return val
54cb93a386Sopenharmony_ci
55cb93a386Sopenharmony_ci
56cb93a386Sopenharmony_cidef filter_toolchain_files(dirname, files):
57cb93a386Sopenharmony_ci  """Callback for shutil.copytree. Return lists of files to skip."""
58cb93a386Sopenharmony_ci  split = dirname.split(os.path.sep)
59cb93a386Sopenharmony_ci  for ign in IGNORE_LIST:
60cb93a386Sopenharmony_ci    if ign in split:
61cb93a386Sopenharmony_ci       print('Ignoring dir %s' % dirname)
62cb93a386Sopenharmony_ci       return files
63cb93a386Sopenharmony_ci  return []
64cb93a386Sopenharmony_ci
65cb93a386Sopenharmony_ci
66cb93a386Sopenharmony_cidef main():
67cb93a386Sopenharmony_ci  if sys.platform != 'win32':
68cb93a386Sopenharmony_ci    print('This script only runs on Windows.', file=sys.stderr)
69cb93a386Sopenharmony_ci    sys.exit(1)
70cb93a386Sopenharmony_ci
71cb93a386Sopenharmony_ci  parser = argparse.ArgumentParser()
72cb93a386Sopenharmony_ci  parser.add_argument('--target_dir', '-t', required=True)
73cb93a386Sopenharmony_ci  args = parser.parse_args()
74cb93a386Sopenharmony_ci
75cb93a386Sopenharmony_ci  # Obtain src_dir from create_and_upload via an environment variable, since
76cb93a386Sopenharmony_ci  # this script is called via `sk` and not directly.
77cb93a386Sopenharmony_ci  src_dir = getenv(ENV_VAR)
78cb93a386Sopenharmony_ci
79cb93a386Sopenharmony_ci  target_dir = os.path.abspath(args.target_dir)
80cb93a386Sopenharmony_ci  shutil.copytree(src_dir, target_dir, ignore=filter_toolchain_files)
81cb93a386Sopenharmony_ci
82cb93a386Sopenharmony_ci
83cb93a386Sopenharmony_ciif __name__ == '__main__':
84cb93a386Sopenharmony_ci  main()
85