| # Copyright 2015 The BoringSSL Authors | 
 | # | 
 | # Licensed under the Apache License, Version 2.0 (the "License"); | 
 | # you may not use this file except in compliance with the License. | 
 | # You may obtain a copy of the License at | 
 | # | 
 | #     https://www.apache.org/licenses/LICENSE-2.0 | 
 | # | 
 | # Unless required by applicable law or agreed to in writing, software | 
 | # distributed under the License is distributed on an "AS IS" BASIS, | 
 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 | # See the License for the specific language governing permissions and | 
 | # limitations under the License. | 
 |  | 
 | import json | 
 | import os | 
 | import os.path | 
 | import subprocess | 
 | import sys | 
 |  | 
 | script_dir = os.path.dirname(os.path.realpath(__file__)) | 
 | sdk_root = os.path.join(script_dir, 'windows_sdk') | 
 |  | 
 | def SetEnvironmentForCPU(cpu): | 
 |   """Sets the environment to build with the selected toolchain for |cpu|.""" | 
 |   assert cpu in ('x86', 'x64', 'arm', 'arm64') | 
 |   sdk_dir = os.path.join(sdk_root, 'Windows Kits', '10') | 
 |   os.environ['WINDOWSSDKDIR'] = sdk_dir | 
 |   # Include the VS runtime in the PATH in case it's not machine-installed. | 
 |   runtime_dirs = \ | 
 |       [os.path.join(sdk_root, d) for d in ['sys64', 'sys32', 'sysarm64']] | 
 |   os.environ['PATH'] = \ | 
 |       os.pathsep.join(runtime_dirs) + os.pathsep + os.environ['PATH'] | 
 |  | 
 |   # Set up the architecture-specific environment from the SetEnv files. See | 
 |   # _LoadToolchainEnv() from setup_toolchain.py in Chromium. | 
 |   with open(os.path.join(sdk_dir, 'bin', 'SetEnv.%s.json' % cpu)) as f: | 
 |     env = json.load(f)['env'] | 
 |   if env['VSINSTALLDIR'] == [["..", "..\\"]]: | 
 |     # Old-style paths were relative to the win_sdk\bin directory. | 
 |     json_relative_dir = os.path.join(sdk_dir, 'bin') | 
 |   else: | 
 |     # New-style paths are relative to the toolchain directory. | 
 |     json_relative_dir = sdk_root | 
 |   for k in env: | 
 |     entries = [os.path.join(*([json_relative_dir] + e)) for e in env[k]] | 
 |     # clang-cl wants INCLUDE to be ;-separated even on non-Windows, | 
 |     # lld-link wants LIB to be ;-separated even on non-Windows.  Path gets :. | 
 |     sep = os.pathsep if k == 'PATH' else ';' | 
 |     env[k] = sep.join(entries) | 
 |   # PATH is a bit of a special case, it's in addition to the current PATH. | 
 |   env['PATH'] = env['PATH'] + os.pathsep + os.environ['PATH'] | 
 |  | 
 |   for k, v in env.items(): | 
 |     os.environ[k] = v | 
 |  | 
 | if len(sys.argv) < 2: | 
 |   print("Usage: vs_env.py TARGET_ARCH CMD...", file=sys.stderr) | 
 |   sys.exit(1) | 
 |  | 
 | target_arch = sys.argv[1] | 
 | cmd = sys.argv[2:] | 
 |  | 
 | SetEnvironmentForCPU(target_arch) | 
 | sys.exit(subprocess.call(cmd)) |