1*6777b538SAndroid Build Coastguard Worker# Copyright 2013 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker# found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker# 5*6777b538SAndroid Build Coastguard Worker# Copies the given "win tool" (which the toolchain uses to wrap compiler 6*6777b538SAndroid Build Coastguard Worker# invocations) and the environment blocks for the 32-bit and 64-bit builds on 7*6777b538SAndroid Build Coastguard Worker# Windows to the build directory. 8*6777b538SAndroid Build Coastguard Worker# 9*6777b538SAndroid Build Coastguard Worker# The arguments are the visual studio install location and the location of the 10*6777b538SAndroid Build Coastguard Worker# win tool. The script assumes that the root build directory is the current dir 11*6777b538SAndroid Build Coastguard Worker# and the files will be written to the current directory. 12*6777b538SAndroid Build Coastguard Worker 13*6777b538SAndroid Build Coastguard Worker 14*6777b538SAndroid Build Coastguard Workerimport errno 15*6777b538SAndroid Build Coastguard Workerimport json 16*6777b538SAndroid Build Coastguard Workerimport os 17*6777b538SAndroid Build Coastguard Workerimport re 18*6777b538SAndroid Build Coastguard Workerimport subprocess 19*6777b538SAndroid Build Coastguard Workerimport sys 20*6777b538SAndroid Build Coastguard Worker 21*6777b538SAndroid Build Coastguard Workersys.path.append(os.path.join(os.path.dirname(__file__), os.pardir, os.pardir)) 22*6777b538SAndroid Build Coastguard Workerimport gn_helpers 23*6777b538SAndroid Build Coastguard Worker 24*6777b538SAndroid Build Coastguard WorkerSCRIPT_DIR = os.path.dirname(__file__) 25*6777b538SAndroid Build Coastguard WorkerSDK_VERSION = '10.0.22621.0' 26*6777b538SAndroid Build Coastguard Worker 27*6777b538SAndroid Build Coastguard Worker 28*6777b538SAndroid Build Coastguard Workerdef _ExtractImportantEnvironment(output_of_set): 29*6777b538SAndroid Build Coastguard Worker """Extracts environment variables required for the toolchain to run from 30*6777b538SAndroid Build Coastguard Worker a textual dump output by the cmd.exe 'set' command.""" 31*6777b538SAndroid Build Coastguard Worker envvars_to_save = ( 32*6777b538SAndroid Build Coastguard Worker 'cipd_cache_dir', # needed by vpython 33*6777b538SAndroid Build Coastguard Worker 'homedrive', # needed by vpython 34*6777b538SAndroid Build Coastguard Worker 'homepath', # needed by vpython 35*6777b538SAndroid Build Coastguard Worker 'goma_.*', # TODO(scottmg): This is ugly, but needed for goma. 36*6777b538SAndroid Build Coastguard Worker 'include', 37*6777b538SAndroid Build Coastguard Worker 'lib', 38*6777b538SAndroid Build Coastguard Worker 'libpath', 39*6777b538SAndroid Build Coastguard Worker 'luci_context', # needed by vpython 40*6777b538SAndroid Build Coastguard Worker 'path', 41*6777b538SAndroid Build Coastguard Worker 'pathext', 42*6777b538SAndroid Build Coastguard Worker 'systemroot', 43*6777b538SAndroid Build Coastguard Worker 'temp', 44*6777b538SAndroid Build Coastguard Worker 'tmp', 45*6777b538SAndroid Build Coastguard Worker 'userprofile', # needed by vpython 46*6777b538SAndroid Build Coastguard Worker 'vpython_virtualenv_root' # needed by vpython 47*6777b538SAndroid Build Coastguard Worker ) 48*6777b538SAndroid Build Coastguard Worker env = {} 49*6777b538SAndroid Build Coastguard Worker # This occasionally happens and leads to misleading SYSTEMROOT error messages 50*6777b538SAndroid Build Coastguard Worker # if not caught here. 51*6777b538SAndroid Build Coastguard Worker if output_of_set.count('=') == 0: 52*6777b538SAndroid Build Coastguard Worker raise Exception('Invalid output_of_set. Value is:\n%s' % output_of_set) 53*6777b538SAndroid Build Coastguard Worker for line in output_of_set.splitlines(): 54*6777b538SAndroid Build Coastguard Worker for envvar in envvars_to_save: 55*6777b538SAndroid Build Coastguard Worker if re.match(envvar + '=', line.lower()): 56*6777b538SAndroid Build Coastguard Worker var, setting = line.split('=', 1) 57*6777b538SAndroid Build Coastguard Worker if envvar == 'path': 58*6777b538SAndroid Build Coastguard Worker # Our own rules and actions in Chromium rely on python being in the 59*6777b538SAndroid Build Coastguard Worker # path. Add the path to this python here so that if it's not in the 60*6777b538SAndroid Build Coastguard Worker # path when ninja is run later, python will still be found. 61*6777b538SAndroid Build Coastguard Worker setting = os.path.dirname(sys.executable) + os.pathsep + setting 62*6777b538SAndroid Build Coastguard Worker if envvar in ['include', 'lib']: 63*6777b538SAndroid Build Coastguard Worker # Make sure that the include and lib paths point to directories that 64*6777b538SAndroid Build Coastguard Worker # exist. This ensures a (relatively) clear error message if the 65*6777b538SAndroid Build Coastguard Worker # required SDK is not installed. 66*6777b538SAndroid Build Coastguard Worker for part in setting.split(';'): 67*6777b538SAndroid Build Coastguard Worker if not os.path.exists(part) and len(part) != 0: 68*6777b538SAndroid Build Coastguard Worker raise Exception( 69*6777b538SAndroid Build Coastguard Worker 'Path "%s" from environment variable "%s" does not exist. ' 70*6777b538SAndroid Build Coastguard Worker 'Make sure the necessary SDK is installed.' % (part, envvar)) 71*6777b538SAndroid Build Coastguard Worker env[var.upper()] = setting 72*6777b538SAndroid Build Coastguard Worker break 73*6777b538SAndroid Build Coastguard Worker if sys.platform in ('win32', 'cygwin'): 74*6777b538SAndroid Build Coastguard Worker for required in ('SYSTEMROOT', 'TEMP', 'TMP'): 75*6777b538SAndroid Build Coastguard Worker if required not in env: 76*6777b538SAndroid Build Coastguard Worker raise Exception('Environment variable "%s" ' 77*6777b538SAndroid Build Coastguard Worker 'required to be set to valid path' % required) 78*6777b538SAndroid Build Coastguard Worker return env 79*6777b538SAndroid Build Coastguard Worker 80*6777b538SAndroid Build Coastguard Worker 81*6777b538SAndroid Build Coastguard Workerdef _DetectVisualStudioPath(): 82*6777b538SAndroid Build Coastguard Worker """Return path to the installed Visual Studio. 83*6777b538SAndroid Build Coastguard Worker """ 84*6777b538SAndroid Build Coastguard Worker 85*6777b538SAndroid Build Coastguard Worker # Use the code in build/vs_toolchain.py to avoid duplicating code. 86*6777b538SAndroid Build Coastguard Worker chromium_dir = os.path.abspath(os.path.join(SCRIPT_DIR, '..', '..', '..')) 87*6777b538SAndroid Build Coastguard Worker sys.path.append(os.path.join(chromium_dir, 'build')) 88*6777b538SAndroid Build Coastguard Worker import vs_toolchain 89*6777b538SAndroid Build Coastguard Worker return vs_toolchain.DetectVisualStudioPath() 90*6777b538SAndroid Build Coastguard Worker 91*6777b538SAndroid Build Coastguard Worker 92*6777b538SAndroid Build Coastguard Workerdef _LoadEnvFromBat(args): 93*6777b538SAndroid Build Coastguard Worker """Given a bat command, runs it and returns env vars set by it.""" 94*6777b538SAndroid Build Coastguard Worker args = args[:] 95*6777b538SAndroid Build Coastguard Worker args.extend(('&&', 'set')) 96*6777b538SAndroid Build Coastguard Worker popen = subprocess.Popen( 97*6777b538SAndroid Build Coastguard Worker args, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 98*6777b538SAndroid Build Coastguard Worker variables, _ = popen.communicate() 99*6777b538SAndroid Build Coastguard Worker if popen.returncode != 0: 100*6777b538SAndroid Build Coastguard Worker raise Exception('"%s" failed with error %d' % (args, popen.returncode)) 101*6777b538SAndroid Build Coastguard Worker return variables.decode(errors='ignore') 102*6777b538SAndroid Build Coastguard Worker 103*6777b538SAndroid Build Coastguard Worker 104*6777b538SAndroid Build Coastguard Workerdef _LoadToolchainEnv(cpu, toolchain_root, sdk_dir, target_store): 105*6777b538SAndroid Build Coastguard Worker """Returns a dictionary with environment variables that must be set while 106*6777b538SAndroid Build Coastguard Worker running binaries from the toolchain (e.g. INCLUDE and PATH for cl.exe).""" 107*6777b538SAndroid Build Coastguard Worker # Check if we are running in the SDK command line environment and use 108*6777b538SAndroid Build Coastguard Worker # the setup script from the SDK if so. |cpu| should be either 109*6777b538SAndroid Build Coastguard Worker # 'x86' or 'x64' or 'arm' or 'arm64'. 110*6777b538SAndroid Build Coastguard Worker assert cpu in ('x86', 'x64', 'arm', 'arm64') 111*6777b538SAndroid Build Coastguard Worker if bool(int(os.environ.get('DEPOT_TOOLS_WIN_TOOLCHAIN', 1))) and sdk_dir: 112*6777b538SAndroid Build Coastguard Worker # Load environment from json file. 113*6777b538SAndroid Build Coastguard Worker env = os.path.normpath(os.path.join(sdk_dir, 'bin/SetEnv.%s.json' % cpu)) 114*6777b538SAndroid Build Coastguard Worker env = json.load(open(env))['env'] 115*6777b538SAndroid Build Coastguard Worker if env['VSINSTALLDIR'] == [["..", "..\\"]]: 116*6777b538SAndroid Build Coastguard Worker # Old-style paths were relative to the win_sdk\bin directory. 117*6777b538SAndroid Build Coastguard Worker json_relative_dir = os.path.join(sdk_dir, 'bin') 118*6777b538SAndroid Build Coastguard Worker else: 119*6777b538SAndroid Build Coastguard Worker # New-style paths are relative to the toolchain directory. 120*6777b538SAndroid Build Coastguard Worker json_relative_dir = toolchain_root 121*6777b538SAndroid Build Coastguard Worker for k in env: 122*6777b538SAndroid Build Coastguard Worker entries = [os.path.join(*([json_relative_dir] + e)) for e in env[k]] 123*6777b538SAndroid Build Coastguard Worker # clang-cl wants INCLUDE to be ;-separated even on non-Windows, 124*6777b538SAndroid Build Coastguard Worker # lld-link wants LIB to be ;-separated even on non-Windows. Path gets :. 125*6777b538SAndroid Build Coastguard Worker # The separator for INCLUDE here must match the one used in main() below. 126*6777b538SAndroid Build Coastguard Worker sep = os.pathsep if k == 'PATH' else ';' 127*6777b538SAndroid Build Coastguard Worker env[k] = sep.join(entries) 128*6777b538SAndroid Build Coastguard Worker # PATH is a bit of a special case, it's in addition to the current PATH. 129*6777b538SAndroid Build Coastguard Worker env['PATH'] = env['PATH'] + os.pathsep + os.environ['PATH'] 130*6777b538SAndroid Build Coastguard Worker # Augment with the current env to pick up TEMP and friends. 131*6777b538SAndroid Build Coastguard Worker for k in os.environ: 132*6777b538SAndroid Build Coastguard Worker if k not in env: 133*6777b538SAndroid Build Coastguard Worker env[k] = os.environ[k] 134*6777b538SAndroid Build Coastguard Worker 135*6777b538SAndroid Build Coastguard Worker varlines = [] 136*6777b538SAndroid Build Coastguard Worker for k in sorted(env.keys()): 137*6777b538SAndroid Build Coastguard Worker varlines.append('%s=%s' % (str(k), str(env[k]))) 138*6777b538SAndroid Build Coastguard Worker variables = '\n'.join(varlines) 139*6777b538SAndroid Build Coastguard Worker 140*6777b538SAndroid Build Coastguard Worker # Check that the json file contained the same environment as the .cmd file. 141*6777b538SAndroid Build Coastguard Worker if sys.platform in ('win32', 'cygwin'): 142*6777b538SAndroid Build Coastguard Worker script = os.path.normpath(os.path.join(sdk_dir, 'Bin/SetEnv.cmd')) 143*6777b538SAndroid Build Coastguard Worker arg = '/' + cpu 144*6777b538SAndroid Build Coastguard Worker json_env = _ExtractImportantEnvironment(variables) 145*6777b538SAndroid Build Coastguard Worker cmd_env = _ExtractImportantEnvironment(_LoadEnvFromBat([script, arg])) 146*6777b538SAndroid Build Coastguard Worker assert _LowercaseDict(json_env) == _LowercaseDict(cmd_env) 147*6777b538SAndroid Build Coastguard Worker else: 148*6777b538SAndroid Build Coastguard Worker if 'GYP_MSVS_OVERRIDE_PATH' not in os.environ: 149*6777b538SAndroid Build Coastguard Worker os.environ['GYP_MSVS_OVERRIDE_PATH'] = _DetectVisualStudioPath() 150*6777b538SAndroid Build Coastguard Worker # We only support x64-hosted tools. 151*6777b538SAndroid Build Coastguard Worker script_path = os.path.normpath(os.path.join( 152*6777b538SAndroid Build Coastguard Worker os.environ['GYP_MSVS_OVERRIDE_PATH'], 153*6777b538SAndroid Build Coastguard Worker 'VC/vcvarsall.bat')) 154*6777b538SAndroid Build Coastguard Worker if not os.path.exists(script_path): 155*6777b538SAndroid Build Coastguard Worker # vcvarsall.bat for VS 2017 fails if run after running vcvarsall.bat from 156*6777b538SAndroid Build Coastguard Worker # VS 2013 or VS 2015. Fix this by clearing the vsinstalldir environment 157*6777b538SAndroid Build Coastguard Worker # variable. Since vcvarsall.bat appends to the INCLUDE, LIB, and LIBPATH 158*6777b538SAndroid Build Coastguard Worker # environment variables we need to clear those to avoid getting double 159*6777b538SAndroid Build Coastguard Worker # entries when vcvarsall.bat has been run before gn gen. vcvarsall.bat 160*6777b538SAndroid Build Coastguard Worker # also adds to PATH, but there is no clean way of clearing that and it 161*6777b538SAndroid Build Coastguard Worker # doesn't seem to cause problems. 162*6777b538SAndroid Build Coastguard Worker if 'VSINSTALLDIR' in os.environ: 163*6777b538SAndroid Build Coastguard Worker del os.environ['VSINSTALLDIR'] 164*6777b538SAndroid Build Coastguard Worker if 'INCLUDE' in os.environ: 165*6777b538SAndroid Build Coastguard Worker del os.environ['INCLUDE'] 166*6777b538SAndroid Build Coastguard Worker if 'LIB' in os.environ: 167*6777b538SAndroid Build Coastguard Worker del os.environ['LIB'] 168*6777b538SAndroid Build Coastguard Worker if 'LIBPATH' in os.environ: 169*6777b538SAndroid Build Coastguard Worker del os.environ['LIBPATH'] 170*6777b538SAndroid Build Coastguard Worker other_path = os.path.normpath(os.path.join( 171*6777b538SAndroid Build Coastguard Worker os.environ['GYP_MSVS_OVERRIDE_PATH'], 172*6777b538SAndroid Build Coastguard Worker 'VC/Auxiliary/Build/vcvarsall.bat')) 173*6777b538SAndroid Build Coastguard Worker if not os.path.exists(other_path): 174*6777b538SAndroid Build Coastguard Worker raise Exception('%s is missing - make sure VC++ tools are installed.' % 175*6777b538SAndroid Build Coastguard Worker script_path) 176*6777b538SAndroid Build Coastguard Worker script_path = other_path 177*6777b538SAndroid Build Coastguard Worker cpu_arg = "amd64" 178*6777b538SAndroid Build Coastguard Worker if (cpu != 'x64'): 179*6777b538SAndroid Build Coastguard Worker # x64 is default target CPU thus any other CPU requires a target set 180*6777b538SAndroid Build Coastguard Worker cpu_arg += '_' + cpu 181*6777b538SAndroid Build Coastguard Worker args = [script_path, cpu_arg, ] 182*6777b538SAndroid Build Coastguard Worker # Store target must come before any SDK version declaration 183*6777b538SAndroid Build Coastguard Worker if (target_store): 184*6777b538SAndroid Build Coastguard Worker args.append('store') 185*6777b538SAndroid Build Coastguard Worker # Explicitly specifying the SDK version to build with to avoid accidentally 186*6777b538SAndroid Build Coastguard Worker # building with a new and untested SDK. This should stay in sync with the 187*6777b538SAndroid Build Coastguard Worker # packaged toolchain in build/vs_toolchain.py. 188*6777b538SAndroid Build Coastguard Worker args.append(SDK_VERSION) 189*6777b538SAndroid Build Coastguard Worker variables = _LoadEnvFromBat(args) 190*6777b538SAndroid Build Coastguard Worker return _ExtractImportantEnvironment(variables) 191*6777b538SAndroid Build Coastguard Worker 192*6777b538SAndroid Build Coastguard Worker 193*6777b538SAndroid Build Coastguard Workerdef _FormatAsEnvironmentBlock(envvar_dict): 194*6777b538SAndroid Build Coastguard Worker """Format as an 'environment block' directly suitable for CreateProcess. 195*6777b538SAndroid Build Coastguard Worker Briefly this is a list of key=value\0, terminated by an additional \0. See 196*6777b538SAndroid Build Coastguard Worker CreateProcess documentation for more details.""" 197*6777b538SAndroid Build Coastguard Worker block = '' 198*6777b538SAndroid Build Coastguard Worker nul = '\0' 199*6777b538SAndroid Build Coastguard Worker for key, value in envvar_dict.items(): 200*6777b538SAndroid Build Coastguard Worker block += key + '=' + value + nul 201*6777b538SAndroid Build Coastguard Worker block += nul 202*6777b538SAndroid Build Coastguard Worker return block 203*6777b538SAndroid Build Coastguard Worker 204*6777b538SAndroid Build Coastguard Worker 205*6777b538SAndroid Build Coastguard Workerdef _LowercaseDict(d): 206*6777b538SAndroid Build Coastguard Worker """Returns a copy of `d` with both key and values lowercased. 207*6777b538SAndroid Build Coastguard Worker 208*6777b538SAndroid Build Coastguard Worker Args: 209*6777b538SAndroid Build Coastguard Worker d: dict to lowercase (e.g. {'A': 'BcD'}). 210*6777b538SAndroid Build Coastguard Worker 211*6777b538SAndroid Build Coastguard Worker Returns: 212*6777b538SAndroid Build Coastguard Worker A dict with both keys and values lowercased (e.g.: {'a': 'bcd'}). 213*6777b538SAndroid Build Coastguard Worker """ 214*6777b538SAndroid Build Coastguard Worker return {k.lower(): d[k].lower() for k in d} 215*6777b538SAndroid Build Coastguard Worker 216*6777b538SAndroid Build Coastguard Worker 217*6777b538SAndroid Build Coastguard Workerdef FindFileInEnvList(env, env_name, separator, file_name, optional=False): 218*6777b538SAndroid Build Coastguard Worker parts = env[env_name].split(separator) 219*6777b538SAndroid Build Coastguard Worker for path in parts: 220*6777b538SAndroid Build Coastguard Worker if os.path.exists(os.path.join(path, file_name)): 221*6777b538SAndroid Build Coastguard Worker return os.path.realpath(path) 222*6777b538SAndroid Build Coastguard Worker assert optional, "%s is not found in %s:\n%s\nCheck if it is installed." % ( 223*6777b538SAndroid Build Coastguard Worker file_name, env_name, '\n'.join(parts)) 224*6777b538SAndroid Build Coastguard Worker return '' 225*6777b538SAndroid Build Coastguard Worker 226*6777b538SAndroid Build Coastguard Worker 227*6777b538SAndroid Build Coastguard Workerdef main(): 228*6777b538SAndroid Build Coastguard Worker if len(sys.argv) != 7: 229*6777b538SAndroid Build Coastguard Worker print('Usage setup_toolchain.py ' 230*6777b538SAndroid Build Coastguard Worker '<visual studio path> <win sdk path> ' 231*6777b538SAndroid Build Coastguard Worker '<runtime dirs> <target_os> <target_cpu> ' 232*6777b538SAndroid Build Coastguard Worker '<environment block name|none>') 233*6777b538SAndroid Build Coastguard Worker sys.exit(2) 234*6777b538SAndroid Build Coastguard Worker # toolchain_root and win_sdk_path are only read if the hermetic Windows 235*6777b538SAndroid Build Coastguard Worker # toolchain is set, that is if DEPOT_TOOLS_WIN_TOOLCHAIN is not set to 0. 236*6777b538SAndroid Build Coastguard Worker # With the hermetic Windows toolchain, the visual studio path in argv[1] 237*6777b538SAndroid Build Coastguard Worker # is the root of the Windows toolchain directory. 238*6777b538SAndroid Build Coastguard Worker toolchain_root = sys.argv[1] 239*6777b538SAndroid Build Coastguard Worker win_sdk_path = sys.argv[2] 240*6777b538SAndroid Build Coastguard Worker 241*6777b538SAndroid Build Coastguard Worker runtime_dirs = sys.argv[3] 242*6777b538SAndroid Build Coastguard Worker target_os = sys.argv[4] 243*6777b538SAndroid Build Coastguard Worker target_cpu = sys.argv[5] 244*6777b538SAndroid Build Coastguard Worker environment_block_name = sys.argv[6] 245*6777b538SAndroid Build Coastguard Worker if (environment_block_name == 'none'): 246*6777b538SAndroid Build Coastguard Worker environment_block_name = '' 247*6777b538SAndroid Build Coastguard Worker 248*6777b538SAndroid Build Coastguard Worker if (target_os == 'winuwp'): 249*6777b538SAndroid Build Coastguard Worker target_store = True 250*6777b538SAndroid Build Coastguard Worker else: 251*6777b538SAndroid Build Coastguard Worker target_store = False 252*6777b538SAndroid Build Coastguard Worker 253*6777b538SAndroid Build Coastguard Worker cpus = ('x86', 'x64', 'arm', 'arm64') 254*6777b538SAndroid Build Coastguard Worker assert target_cpu in cpus 255*6777b538SAndroid Build Coastguard Worker vc_bin_dir = '' 256*6777b538SAndroid Build Coastguard Worker include = '' 257*6777b538SAndroid Build Coastguard Worker lib = '' 258*6777b538SAndroid Build Coastguard Worker 259*6777b538SAndroid Build Coastguard Worker # TODO(scottmg|goma): Do we need an equivalent of 260*6777b538SAndroid Build Coastguard Worker # ninja_use_custom_environment_files? 261*6777b538SAndroid Build Coastguard Worker 262*6777b538SAndroid Build Coastguard Worker def relflag(s): # Make s relative to builddir when cwd and sdk on same drive. 263*6777b538SAndroid Build Coastguard Worker try: 264*6777b538SAndroid Build Coastguard Worker return os.path.relpath(s).replace('\\', '/') 265*6777b538SAndroid Build Coastguard Worker except ValueError: 266*6777b538SAndroid Build Coastguard Worker return s 267*6777b538SAndroid Build Coastguard Worker 268*6777b538SAndroid Build Coastguard Worker def q(s): # Quote s if it contains spaces or other weird characters. 269*6777b538SAndroid Build Coastguard Worker return s if re.match(r'^[a-zA-Z0-9._/\\:-]*$', s) else '"' + s + '"' 270*6777b538SAndroid Build Coastguard Worker 271*6777b538SAndroid Build Coastguard Worker for cpu in cpus: 272*6777b538SAndroid Build Coastguard Worker if cpu == target_cpu: 273*6777b538SAndroid Build Coastguard Worker # Extract environment variables for subprocesses. 274*6777b538SAndroid Build Coastguard Worker env = _LoadToolchainEnv(cpu, toolchain_root, win_sdk_path, target_store) 275*6777b538SAndroid Build Coastguard Worker env['PATH'] = runtime_dirs + os.pathsep + env['PATH'] 276*6777b538SAndroid Build Coastguard Worker 277*6777b538SAndroid Build Coastguard Worker vc_bin_dir = FindFileInEnvList(env, 'PATH', os.pathsep, 'cl.exe') 278*6777b538SAndroid Build Coastguard Worker 279*6777b538SAndroid Build Coastguard Worker # The separator for INCLUDE here must match the one used in 280*6777b538SAndroid Build Coastguard Worker # _LoadToolchainEnv() above. 281*6777b538SAndroid Build Coastguard Worker include = [p.replace('"', r'\"') for p in env['INCLUDE'].split(';') if p] 282*6777b538SAndroid Build Coastguard Worker include = list(map(relflag, include)) 283*6777b538SAndroid Build Coastguard Worker 284*6777b538SAndroid Build Coastguard Worker lib = [p.replace('"', r'\"') for p in env['LIB'].split(';') if p] 285*6777b538SAndroid Build Coastguard Worker lib = list(map(relflag, lib)) 286*6777b538SAndroid Build Coastguard Worker 287*6777b538SAndroid Build Coastguard Worker include_I = ['/I' + i for i in include] 288*6777b538SAndroid Build Coastguard Worker include_imsvc = ['-imsvc' + i for i in include] 289*6777b538SAndroid Build Coastguard Worker libpath_flags = ['-libpath:' + i for i in lib] 290*6777b538SAndroid Build Coastguard Worker 291*6777b538SAndroid Build Coastguard Worker if (environment_block_name != ''): 292*6777b538SAndroid Build Coastguard Worker env_block = _FormatAsEnvironmentBlock(env) 293*6777b538SAndroid Build Coastguard Worker with open(environment_block_name, 'w', encoding='utf8') as f: 294*6777b538SAndroid Build Coastguard Worker f.write(env_block) 295*6777b538SAndroid Build Coastguard Worker 296*6777b538SAndroid Build Coastguard Worker def ListToArgString(x): 297*6777b538SAndroid Build Coastguard Worker return gn_helpers.ToGNString(' '.join(q(i) for i in x)) 298*6777b538SAndroid Build Coastguard Worker 299*6777b538SAndroid Build Coastguard Worker def ListToArgList(x): 300*6777b538SAndroid Build Coastguard Worker return f'[{", ".join(gn_helpers.ToGNString(i) for i in x)}]' 301*6777b538SAndroid Build Coastguard Worker 302*6777b538SAndroid Build Coastguard Worker print('vc_bin_dir = ' + gn_helpers.ToGNString(vc_bin_dir)) 303*6777b538SAndroid Build Coastguard Worker assert include_I 304*6777b538SAndroid Build Coastguard Worker print(f'include_flags_I = {ListToArgString(include_I)}') 305*6777b538SAndroid Build Coastguard Worker print(f'include_flags_I_list = {ListToArgList(include_I)}') 306*6777b538SAndroid Build Coastguard Worker assert include_imsvc 307*6777b538SAndroid Build Coastguard Worker if bool(int(os.environ.get('DEPOT_TOOLS_WIN_TOOLCHAIN', 1))) and win_sdk_path: 308*6777b538SAndroid Build Coastguard Worker flags = ['/winsysroot' + relflag(toolchain_root)] 309*6777b538SAndroid Build Coastguard Worker print(f'include_flags_imsvc = {ListToArgString(flags)}') 310*6777b538SAndroid Build Coastguard Worker print(f'include_flags_imsvc_list = {ListToArgList(flags)}') 311*6777b538SAndroid Build Coastguard Worker else: 312*6777b538SAndroid Build Coastguard Worker print(f'include_flags_imsvc = {ListToArgString(include_imsvc)}') 313*6777b538SAndroid Build Coastguard Worker print(f'include_flags_imsvc_list = {ListToArgList(include_imsvc)}') 314*6777b538SAndroid Build Coastguard Worker print('paths = ' + gn_helpers.ToGNString(env['PATH'])) 315*6777b538SAndroid Build Coastguard Worker assert libpath_flags 316*6777b538SAndroid Build Coastguard Worker print(f'libpath_flags = {ListToArgString(libpath_flags)}') 317*6777b538SAndroid Build Coastguard Worker print(f'libpath_flags_list = {ListToArgList(libpath_flags)}') 318*6777b538SAndroid Build Coastguard Worker if bool(int(os.environ.get('DEPOT_TOOLS_WIN_TOOLCHAIN', 1))) and win_sdk_path: 319*6777b538SAndroid Build Coastguard Worker flags = ['/winsysroot:' + relflag(toolchain_root)] 320*6777b538SAndroid Build Coastguard Worker print(f'libpath_lldlink_flags = {ListToArgString(flags)}') 321*6777b538SAndroid Build Coastguard Worker print(f'libpath_lldlink_flags_list = {ListToArgList(flags)}') 322*6777b538SAndroid Build Coastguard Worker else: 323*6777b538SAndroid Build Coastguard Worker print(f'libpath_lldlink_flags = {ListToArgString(libpath_flags)}') 324*6777b538SAndroid Build Coastguard Worker print(f'libpath_lldlink_flags_list = {ListToArgList(libpath_flags)}') 325*6777b538SAndroid Build Coastguard Worker 326*6777b538SAndroid Build Coastguard Worker 327*6777b538SAndroid Build Coastguard Workerif __name__ == '__main__': 328*6777b538SAndroid Build Coastguard Worker main() 329