| Index: build/toolchain/win/setup_toolchain.py
|
| diff --git a/build/toolchain/win/setup_toolchain.py b/build/toolchain/win/setup_toolchain.py
|
| index 7248ed2479a87e950ccd7e93919fbaa704582796..df92f157ca8acbe9dcead4e2b0742f2adab1dad1 100644
|
| --- a/build/toolchain/win/setup_toolchain.py
|
| +++ b/build/toolchain/win/setup_toolchain.py
|
| @@ -11,6 +11,7 @@
|
| # and the files will be written to the current directory.
|
|
|
| import errno
|
| +import json
|
| import os
|
| import re
|
| import subprocess
|
| @@ -67,35 +68,57 @@ def _DetectVisualStudioPath():
|
| return vs_toolchain.DetectVisualStudioPath()
|
|
|
|
|
| -def _SetupScript(target_cpu, sdk_dir):
|
| - """Returns a command (with arguments) to be used to set up the
|
| - environment."""
|
| +def _LoadEnvFromBat(args):
|
| + """Given a bat command, runs it and returns env vars set by it."""
|
| + args = args[:]
|
| + args.extend(('&&', 'set'))
|
| + popen = subprocess.Popen(
|
| + args, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
| + variables, _ = popen.communicate()
|
| + if popen.returncode != 0:
|
| + raise Exception('"%s" failed with error %d' % (args, popen.returncode))
|
| + return variables
|
| +
|
| +
|
| +def _LoadToolchainEnv(cpu, sdk_dir):
|
| + """Returns a dictionary with environment variables that must be set while
|
| + running binaries from the toolchain (e.g. INCLUDE and PATH for cl.exe)."""
|
| # Check if we are running in the SDK command line environment and use
|
| - # the setup script from the SDK if so. |target_cpu| should be either
|
| + # the setup script from the SDK if so. |cpu| should be either
|
| # 'x86' or 'x64'.
|
| - assert target_cpu in ('x86', 'x64')
|
| + assert cpu in ('x86', 'x64')
|
| if bool(int(os.environ.get('DEPOT_TOOLS_WIN_TOOLCHAIN', 1))) and sdk_dir:
|
| - return [os.path.normpath(os.path.join(sdk_dir, 'Bin/SetEnv.Cmd')),
|
| - '/' + target_cpu]
|
| + # Load environment from json file.
|
| + env = os.path.normpath(os.path.join(sdk_dir, 'Bin/SetEnv.%s.json' % cpu))
|
| + env = json.load(open(env))['env']
|
| + for k in env:
|
| + entries = [os.path.join(*([os.path.join(sdk_dir, 'bin')] + e))
|
| + for e in env[k]]
|
| + env[k] = os.pathsep.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']
|
| + # Augment with the current env to pick up TEMP and friends.
|
| + for k in os.environ:
|
| + if k not in env:
|
| + env[k] = os.environ[k]
|
| +
|
| + varlines = []
|
| + for k in sorted(env.keys()):
|
| + varlines.append('%s=%s' % (str(k), str(env[k])))
|
| + variables = '\n'.join(varlines)
|
| +
|
| + # Check that the json file contained the same environment as the .cmd file.
|
| + script = os.path.normpath(os.path.join(sdk_dir, 'Bin/SetEnv.cmd'))
|
| + assert _ExtractImportantEnvironment(variables) == \
|
| + _ExtractImportantEnvironment(_LoadEnvFromBat([script, '/' + cpu]))
|
| else:
|
| if 'GYP_MSVS_OVERRIDE_PATH' not in os.environ:
|
| os.environ['GYP_MSVS_OVERRIDE_PATH'] = _DetectVisualStudioPath()
|
| # We only support x64-hosted tools.
|
| - return [os.path.normpath(os.path.join(os.environ['GYP_MSVS_OVERRIDE_PATH'],
|
| + args = [os.path.normpath(os.path.join(os.environ['GYP_MSVS_OVERRIDE_PATH'],
|
| 'VC/vcvarsall.bat')),
|
| - 'amd64_x86' if target_cpu == 'x86' else 'amd64']
|
| -
|
| -
|
| -def _LoadToolchainEnv(cpu, win_sdk_path):
|
| - """Returns a dictionary with environment variables that must be set while
|
| - running binaries from the toolchain (e.g. INCLUDE and PATH for cl.exe)."""
|
| - args = _SetupScript(cpu, win_sdk_path)
|
| - args.extend(('&&', 'set'))
|
| - popen = subprocess.Popen(
|
| - args, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
| - variables, _ = popen.communicate()
|
| - if popen.returncode != 0:
|
| - raise Exception('"%s" failed with error %d' % (args, popen.returncode))
|
| + 'amd64_x86' if cpu == 'x86' else 'amd64']
|
| + variables = _LoadEnvFromBat(args)
|
| return _ExtractImportantEnvironment(variables)
|
|
|
|
|
|
|