Chromium Code Reviews| 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..b5461408b0c0da62e955be77df1cff0564dc609b 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,56 @@ 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)) |
|
scottmg
2016/03/15 22:58:54
extra space after 'bin')
Nico
2016/03/16 02:17:03
Done.
|
| + 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] |
|
scottmg
2016/03/15 22:58:54
\n after :
Nico
2016/03/16 02:17:03
Done.
|
| + |
| + 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. |
|
scottmg
2016/03/15 22:58:54
No capital C on .cmd here and next line. Do you wa
Nico
2016/03/16 02:17:03
Done. This doesn't have any sys.platform checks ye
|
| + script = os.path.normpath(os.path.join(sdk_dir, 'Bin/SetEnv.Cmd')) |
| + assert _ExtractImportantEnvironment(variables) == \ |
|
scottmg
2016/03/15 22:58:54
Good idea!
|
| + _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) |