1*6777b538SAndroid Build Coastguard Worker#!/usr/bin/env python3 2*6777b538SAndroid Build Coastguard Worker# Copyright 2014 The Chromium Authors 3*6777b538SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 4*6777b538SAndroid Build Coastguard Worker# found in the LICENSE file. 5*6777b538SAndroid Build Coastguard Worker 6*6777b538SAndroid Build Coastguard Worker 7*6777b538SAndroid Build Coastguard Workerimport collections 8*6777b538SAndroid Build Coastguard Workerimport glob 9*6777b538SAndroid Build Coastguard Workerimport json 10*6777b538SAndroid Build Coastguard Workerimport os 11*6777b538SAndroid Build Coastguard Workerimport platform 12*6777b538SAndroid Build Coastguard Workerimport re 13*6777b538SAndroid Build Coastguard Workerimport shutil 14*6777b538SAndroid Build Coastguard Workerimport stat 15*6777b538SAndroid Build Coastguard Workerimport subprocess 16*6777b538SAndroid Build Coastguard Workerimport sys 17*6777b538SAndroid Build Coastguard Worker 18*6777b538SAndroid Build Coastguard Workerfrom gn_helpers import ToGNString 19*6777b538SAndroid Build Coastguard Worker 20*6777b538SAndroid Build Coastguard Worker# VS 2022 17.9.2 with 10.0.22621.2428 SDK with ARM64 libraries and UWP support. 21*6777b538SAndroid Build Coastguard Worker# See go/chromium-msvc-toolchain for instructions about how to update the 22*6777b538SAndroid Build Coastguard Worker# toolchain. 23*6777b538SAndroid Build Coastguard Worker# 24*6777b538SAndroid Build Coastguard Worker# When updating the toolchain, consider the following areas impacted by the 25*6777b538SAndroid Build Coastguard Worker# toolchain version: 26*6777b538SAndroid Build Coastguard Worker# 27*6777b538SAndroid Build Coastguard Worker# * //base/win/windows_version.cc NTDDI preprocessor check 28*6777b538SAndroid Build Coastguard Worker# Triggers a compiler error if the available SDK is older than the minimum. 29*6777b538SAndroid Build Coastguard Worker# * SDK_VERSION in this file 30*6777b538SAndroid Build Coastguard Worker# Must match the packaged/required SDK version. 31*6777b538SAndroid Build Coastguard Worker# * SDK_VERSION in build/toolchain/win/setup_toolchain.py. 32*6777b538SAndroid Build Coastguard Worker# * //build/config/win/BUILD.gn NTDDI_VERSION value 33*6777b538SAndroid Build Coastguard Worker# Affects the availability of APIs in the toolchain headers. 34*6777b538SAndroid Build Coastguard Worker# * //docs/windows_build_instructions.md mentions of VS or Windows SDK. 35*6777b538SAndroid Build Coastguard Worker# Keeps the document consistent with the toolchain version. 36*6777b538SAndroid Build Coastguard Worker# * //tools/win/setenv.py 37*6777b538SAndroid Build Coastguard Worker# Add/remove VS versions when upgrading to a new VS version. 38*6777b538SAndroid Build Coastguard Worker# * MSVC_TOOLSET_VERSION in this file 39*6777b538SAndroid Build Coastguard Worker# Maps between Visual Studio version and MSVC toolset 40*6777b538SAndroid Build Coastguard Worker# * MSVS_VERSIONS in this file 41*6777b538SAndroid Build Coastguard Worker# Records the packaged and default version of Visual Studio 42*6777b538SAndroid Build Coastguard WorkerTOOLCHAIN_HASH = '7393122652' 43*6777b538SAndroid Build Coastguard WorkerSDK_VERSION = '10.0.22621.0' 44*6777b538SAndroid Build Coastguard Worker 45*6777b538SAndroid Build Coastguard Workerscript_dir = os.path.dirname(os.path.realpath(__file__)) 46*6777b538SAndroid Build Coastguard Workerjson_data_file = os.path.join(script_dir, 'win_toolchain.json') 47*6777b538SAndroid Build Coastguard Worker 48*6777b538SAndroid Build Coastguard Worker# VS versions are listed in descending order of priority (highest first). 49*6777b538SAndroid Build Coastguard Worker# The first version is assumed by this script to be the one that is packaged, 50*6777b538SAndroid Build Coastguard Worker# which makes a difference for the arm64 runtime. 51*6777b538SAndroid Build Coastguard WorkerMSVS_VERSIONS = collections.OrderedDict([ 52*6777b538SAndroid Build Coastguard Worker ('2022', '17.0'), # Default and packaged version of Visual Studio. 53*6777b538SAndroid Build Coastguard Worker ('2019', '16.0'), 54*6777b538SAndroid Build Coastguard Worker ('2017', '15.0'), 55*6777b538SAndroid Build Coastguard Worker]) 56*6777b538SAndroid Build Coastguard Worker 57*6777b538SAndroid Build Coastguard Worker# List of preferred VC toolset version based on MSVS 58*6777b538SAndroid Build Coastguard Worker# Order is not relevant for this dictionary. 59*6777b538SAndroid Build Coastguard WorkerMSVC_TOOLSET_VERSION = { 60*6777b538SAndroid Build Coastguard Worker '2022': 'VC143', 61*6777b538SAndroid Build Coastguard Worker '2019': 'VC142', 62*6777b538SAndroid Build Coastguard Worker '2017': 'VC141', 63*6777b538SAndroid Build Coastguard Worker} 64*6777b538SAndroid Build Coastguard Worker 65*6777b538SAndroid Build Coastguard Workerdef _HostIsWindows(): 66*6777b538SAndroid Build Coastguard Worker """Returns True if running on a Windows host (including under cygwin).""" 67*6777b538SAndroid Build Coastguard Worker return sys.platform in ('win32', 'cygwin') 68*6777b538SAndroid Build Coastguard Worker 69*6777b538SAndroid Build Coastguard Workerdef SetEnvironmentAndGetRuntimeDllDirs(): 70*6777b538SAndroid Build Coastguard Worker """Sets up os.environ to use the depot_tools VS toolchain with gyp, and 71*6777b538SAndroid Build Coastguard Worker returns the location of the VC runtime DLLs so they can be copied into 72*6777b538SAndroid Build Coastguard Worker the output directory after gyp generation. 73*6777b538SAndroid Build Coastguard Worker 74*6777b538SAndroid Build Coastguard Worker Return value is [x64path, x86path, 'Arm64Unused'] or None. arm64path is 75*6777b538SAndroid Build Coastguard Worker generated separately because there are multiple folders for the arm64 VC 76*6777b538SAndroid Build Coastguard Worker runtime. 77*6777b538SAndroid Build Coastguard Worker """ 78*6777b538SAndroid Build Coastguard Worker vs_runtime_dll_dirs = None 79*6777b538SAndroid Build Coastguard Worker depot_tools_win_toolchain = \ 80*6777b538SAndroid Build Coastguard Worker bool(int(os.environ.get('DEPOT_TOOLS_WIN_TOOLCHAIN', '1'))) 81*6777b538SAndroid Build Coastguard Worker # When running on a non-Windows host, only do this if the SDK has explicitly 82*6777b538SAndroid Build Coastguard Worker # been downloaded before (in which case json_data_file will exist). 83*6777b538SAndroid Build Coastguard Worker if ((_HostIsWindows() or os.path.exists(json_data_file)) 84*6777b538SAndroid Build Coastguard Worker and depot_tools_win_toolchain): 85*6777b538SAndroid Build Coastguard Worker if ShouldUpdateToolchain(): 86*6777b538SAndroid Build Coastguard Worker if len(sys.argv) > 1 and sys.argv[1] == 'update': 87*6777b538SAndroid Build Coastguard Worker update_result = Update() 88*6777b538SAndroid Build Coastguard Worker else: 89*6777b538SAndroid Build Coastguard Worker update_result = Update(no_download=True) 90*6777b538SAndroid Build Coastguard Worker if update_result != 0: 91*6777b538SAndroid Build Coastguard Worker raise Exception('Failed to update, error code %d.' % update_result) 92*6777b538SAndroid Build Coastguard Worker with open(json_data_file, 'r') as tempf: 93*6777b538SAndroid Build Coastguard Worker toolchain_data = json.load(tempf) 94*6777b538SAndroid Build Coastguard Worker 95*6777b538SAndroid Build Coastguard Worker toolchain = toolchain_data['path'] 96*6777b538SAndroid Build Coastguard Worker version = toolchain_data['version'] 97*6777b538SAndroid Build Coastguard Worker win_sdk = toolchain_data.get('win_sdk') 98*6777b538SAndroid Build Coastguard Worker wdk = toolchain_data['wdk'] 99*6777b538SAndroid Build Coastguard Worker # TODO(scottmg): The order unfortunately matters in these. They should be 100*6777b538SAndroid Build Coastguard Worker # split into separate keys for x64/x86/arm64. (See CopyDlls call below). 101*6777b538SAndroid Build Coastguard Worker # http://crbug.com/345992 102*6777b538SAndroid Build Coastguard Worker vs_runtime_dll_dirs = toolchain_data['runtime_dirs'] 103*6777b538SAndroid Build Coastguard Worker # The number of runtime_dirs in the toolchain_data was two (x64/x86) but 104*6777b538SAndroid Build Coastguard Worker # changed to three (x64/x86/arm64) and this code needs to handle both 105*6777b538SAndroid Build Coastguard Worker # possibilities, which can change independently from this code. 106*6777b538SAndroid Build Coastguard Worker if len(vs_runtime_dll_dirs) == 2: 107*6777b538SAndroid Build Coastguard Worker vs_runtime_dll_dirs.append('Arm64Unused') 108*6777b538SAndroid Build Coastguard Worker 109*6777b538SAndroid Build Coastguard Worker os.environ['GYP_MSVS_OVERRIDE_PATH'] = toolchain 110*6777b538SAndroid Build Coastguard Worker 111*6777b538SAndroid Build Coastguard Worker os.environ['WINDOWSSDKDIR'] = win_sdk 112*6777b538SAndroid Build Coastguard Worker os.environ['WDK_DIR'] = wdk 113*6777b538SAndroid Build Coastguard Worker # Include the VS runtime in the PATH in case it's not machine-installed. 114*6777b538SAndroid Build Coastguard Worker runtime_path = os.path.pathsep.join(vs_runtime_dll_dirs) 115*6777b538SAndroid Build Coastguard Worker os.environ['PATH'] = runtime_path + os.path.pathsep + os.environ['PATH'] 116*6777b538SAndroid Build Coastguard Worker elif sys.platform == 'win32' and not depot_tools_win_toolchain: 117*6777b538SAndroid Build Coastguard Worker if not 'GYP_MSVS_OVERRIDE_PATH' in os.environ: 118*6777b538SAndroid Build Coastguard Worker os.environ['GYP_MSVS_OVERRIDE_PATH'] = DetectVisualStudioPath() 119*6777b538SAndroid Build Coastguard Worker 120*6777b538SAndroid Build Coastguard Worker # When using an installed toolchain these files aren't needed in the output 121*6777b538SAndroid Build Coastguard Worker # directory in order to run binaries locally, but they are needed in order 122*6777b538SAndroid Build Coastguard Worker # to create isolates or the mini_installer. Copying them to the output 123*6777b538SAndroid Build Coastguard Worker # directory ensures that they are available when needed. 124*6777b538SAndroid Build Coastguard Worker bitness = platform.architecture()[0] 125*6777b538SAndroid Build Coastguard Worker # When running 64-bit python the x64 DLLs will be in System32 126*6777b538SAndroid Build Coastguard Worker # ARM64 binaries will not be available in the system directories because we 127*6777b538SAndroid Build Coastguard Worker # don't build on ARM64 machines. 128*6777b538SAndroid Build Coastguard Worker x64_path = 'System32' if bitness == '64bit' else 'Sysnative' 129*6777b538SAndroid Build Coastguard Worker x64_path = os.path.join(os.path.expandvars('%windir%'), x64_path) 130*6777b538SAndroid Build Coastguard Worker vs_runtime_dll_dirs = [x64_path, 131*6777b538SAndroid Build Coastguard Worker os.path.join(os.path.expandvars('%windir%'), 132*6777b538SAndroid Build Coastguard Worker 'SysWOW64'), 133*6777b538SAndroid Build Coastguard Worker 'Arm64Unused'] 134*6777b538SAndroid Build Coastguard Worker 135*6777b538SAndroid Build Coastguard Worker return vs_runtime_dll_dirs 136*6777b538SAndroid Build Coastguard Worker 137*6777b538SAndroid Build Coastguard Worker 138*6777b538SAndroid Build Coastguard Workerdef _RegistryGetValueUsingWinReg(key, value): 139*6777b538SAndroid Build Coastguard Worker """Use the _winreg module to obtain the value of a registry key. 140*6777b538SAndroid Build Coastguard Worker 141*6777b538SAndroid Build Coastguard Worker Args: 142*6777b538SAndroid Build Coastguard Worker key: The registry key. 143*6777b538SAndroid Build Coastguard Worker value: The particular registry value to read. 144*6777b538SAndroid Build Coastguard Worker Return: 145*6777b538SAndroid Build Coastguard Worker contents of the registry key's value, or None on failure. Throws 146*6777b538SAndroid Build Coastguard Worker ImportError if _winreg is unavailable. 147*6777b538SAndroid Build Coastguard Worker """ 148*6777b538SAndroid Build Coastguard Worker import _winreg 149*6777b538SAndroid Build Coastguard Worker try: 150*6777b538SAndroid Build Coastguard Worker root, subkey = key.split('\\', 1) 151*6777b538SAndroid Build Coastguard Worker assert root == 'HKLM' # Only need HKLM for now. 152*6777b538SAndroid Build Coastguard Worker with _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, subkey) as hkey: 153*6777b538SAndroid Build Coastguard Worker return _winreg.QueryValueEx(hkey, value)[0] 154*6777b538SAndroid Build Coastguard Worker except WindowsError: 155*6777b538SAndroid Build Coastguard Worker return None 156*6777b538SAndroid Build Coastguard Worker 157*6777b538SAndroid Build Coastguard Worker 158*6777b538SAndroid Build Coastguard Workerdef _RegistryGetValue(key, value): 159*6777b538SAndroid Build Coastguard Worker try: 160*6777b538SAndroid Build Coastguard Worker return _RegistryGetValueUsingWinReg(key, value) 161*6777b538SAndroid Build Coastguard Worker except ImportError: 162*6777b538SAndroid Build Coastguard Worker raise Exception('The python library _winreg not found.') 163*6777b538SAndroid Build Coastguard Worker 164*6777b538SAndroid Build Coastguard Worker 165*6777b538SAndroid Build Coastguard Workerdef GetVisualStudioVersion(): 166*6777b538SAndroid Build Coastguard Worker """Return best available version of Visual Studio. 167*6777b538SAndroid Build Coastguard Worker """ 168*6777b538SAndroid Build Coastguard Worker supported_versions = list(MSVS_VERSIONS.keys()) 169*6777b538SAndroid Build Coastguard Worker 170*6777b538SAndroid Build Coastguard Worker # VS installed in depot_tools for Googlers 171*6777b538SAndroid Build Coastguard Worker if bool(int(os.environ.get('DEPOT_TOOLS_WIN_TOOLCHAIN', '1'))): 172*6777b538SAndroid Build Coastguard Worker return supported_versions[0] 173*6777b538SAndroid Build Coastguard Worker 174*6777b538SAndroid Build Coastguard Worker # VS installed in system for external developers 175*6777b538SAndroid Build Coastguard Worker supported_versions_str = ', '.join('{} ({})'.format(v,k) 176*6777b538SAndroid Build Coastguard Worker for k,v in MSVS_VERSIONS.items()) 177*6777b538SAndroid Build Coastguard Worker available_versions = [] 178*6777b538SAndroid Build Coastguard Worker for version in supported_versions: 179*6777b538SAndroid Build Coastguard Worker # Checking vs%s_install environment variables. 180*6777b538SAndroid Build Coastguard Worker # For example, vs2019_install could have the value 181*6777b538SAndroid Build Coastguard Worker # "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community". 182*6777b538SAndroid Build Coastguard Worker # Only vs2017_install, vs2019_install and vs2022_install are supported. 183*6777b538SAndroid Build Coastguard Worker path = os.environ.get('vs%s_install' % version) 184*6777b538SAndroid Build Coastguard Worker if path and os.path.exists(path): 185*6777b538SAndroid Build Coastguard Worker available_versions.append(version) 186*6777b538SAndroid Build Coastguard Worker break 187*6777b538SAndroid Build Coastguard Worker # Detecting VS under possible paths. 188*6777b538SAndroid Build Coastguard Worker if version >= '2022': 189*6777b538SAndroid Build Coastguard Worker program_files_path_variable = '%ProgramFiles%' 190*6777b538SAndroid Build Coastguard Worker else: 191*6777b538SAndroid Build Coastguard Worker program_files_path_variable = '%ProgramFiles(x86)%' 192*6777b538SAndroid Build Coastguard Worker path = os.path.expandvars(program_files_path_variable + 193*6777b538SAndroid Build Coastguard Worker '/Microsoft Visual Studio/%s' % version) 194*6777b538SAndroid Build Coastguard Worker if path and any( 195*6777b538SAndroid Build Coastguard Worker os.path.exists(os.path.join(path, edition)) 196*6777b538SAndroid Build Coastguard Worker for edition in ('Enterprise', 'Professional', 'Community', 'Preview', 197*6777b538SAndroid Build Coastguard Worker 'BuildTools')): 198*6777b538SAndroid Build Coastguard Worker available_versions.append(version) 199*6777b538SAndroid Build Coastguard Worker break 200*6777b538SAndroid Build Coastguard Worker 201*6777b538SAndroid Build Coastguard Worker if not available_versions: 202*6777b538SAndroid Build Coastguard Worker raise Exception('No supported Visual Studio can be found.' 203*6777b538SAndroid Build Coastguard Worker ' Supported versions are: %s.' % supported_versions_str) 204*6777b538SAndroid Build Coastguard Worker return available_versions[0] 205*6777b538SAndroid Build Coastguard Worker 206*6777b538SAndroid Build Coastguard Worker 207*6777b538SAndroid Build Coastguard Workerdef DetectVisualStudioPath(): 208*6777b538SAndroid Build Coastguard Worker """Return path to the installed Visual Studio. 209*6777b538SAndroid Build Coastguard Worker """ 210*6777b538SAndroid Build Coastguard Worker 211*6777b538SAndroid Build Coastguard Worker # Note that this code is used from 212*6777b538SAndroid Build Coastguard Worker # build/toolchain/win/setup_toolchain.py as well. 213*6777b538SAndroid Build Coastguard Worker version_as_year = GetVisualStudioVersion() 214*6777b538SAndroid Build Coastguard Worker 215*6777b538SAndroid Build Coastguard Worker # The VC++ >=2017 install location needs to be located using COM instead of 216*6777b538SAndroid Build Coastguard Worker # the registry. For details see: 217*6777b538SAndroid Build Coastguard Worker # https://blogs.msdn.microsoft.com/heaths/2016/09/15/changes-to-visual-studio-15-setup/ 218*6777b538SAndroid Build Coastguard Worker # For now we use a hardcoded default with an environment variable override. 219*6777b538SAndroid Build Coastguard Worker if version_as_year >= '2022': 220*6777b538SAndroid Build Coastguard Worker program_files_path_variable = '%ProgramFiles%' 221*6777b538SAndroid Build Coastguard Worker else: 222*6777b538SAndroid Build Coastguard Worker program_files_path_variable = '%ProgramFiles(x86)%' 223*6777b538SAndroid Build Coastguard Worker for path in (os.environ.get('vs%s_install' % version_as_year), 224*6777b538SAndroid Build Coastguard Worker os.path.expandvars(program_files_path_variable + 225*6777b538SAndroid Build Coastguard Worker '/Microsoft Visual Studio/%s/Enterprise' % 226*6777b538SAndroid Build Coastguard Worker version_as_year), 227*6777b538SAndroid Build Coastguard Worker os.path.expandvars(program_files_path_variable + 228*6777b538SAndroid Build Coastguard Worker '/Microsoft Visual Studio/%s/Professional' % 229*6777b538SAndroid Build Coastguard Worker version_as_year), 230*6777b538SAndroid Build Coastguard Worker os.path.expandvars(program_files_path_variable + 231*6777b538SAndroid Build Coastguard Worker '/Microsoft Visual Studio/%s/Community' % 232*6777b538SAndroid Build Coastguard Worker version_as_year), 233*6777b538SAndroid Build Coastguard Worker os.path.expandvars(program_files_path_variable + 234*6777b538SAndroid Build Coastguard Worker '/Microsoft Visual Studio/%s/Preview' % 235*6777b538SAndroid Build Coastguard Worker version_as_year), 236*6777b538SAndroid Build Coastguard Worker os.path.expandvars(program_files_path_variable + 237*6777b538SAndroid Build Coastguard Worker '/Microsoft Visual Studio/%s/BuildTools' % 238*6777b538SAndroid Build Coastguard Worker version_as_year)): 239*6777b538SAndroid Build Coastguard Worker if path and os.path.exists(path): 240*6777b538SAndroid Build Coastguard Worker return path 241*6777b538SAndroid Build Coastguard Worker 242*6777b538SAndroid Build Coastguard Worker raise Exception('Visual Studio Version %s not found.' % version_as_year) 243*6777b538SAndroid Build Coastguard Worker 244*6777b538SAndroid Build Coastguard Worker 245*6777b538SAndroid Build Coastguard Workerdef _CopyRuntimeImpl(target, source, verbose=True): 246*6777b538SAndroid Build Coastguard Worker """Copy |source| to |target| if it doesn't already exist or if it needs to be 247*6777b538SAndroid Build Coastguard Worker updated (comparing last modified time as an approximate float match as for 248*6777b538SAndroid Build Coastguard Worker some reason the values tend to differ by ~1e-07 despite being copies of the 249*6777b538SAndroid Build Coastguard Worker same file... https://crbug.com/603603). 250*6777b538SAndroid Build Coastguard Worker """ 251*6777b538SAndroid Build Coastguard Worker if (os.path.isdir(os.path.dirname(target)) and 252*6777b538SAndroid Build Coastguard Worker (not os.path.isfile(target) or 253*6777b538SAndroid Build Coastguard Worker abs(os.stat(target).st_mtime - os.stat(source).st_mtime) >= 0.01)): 254*6777b538SAndroid Build Coastguard Worker if verbose: 255*6777b538SAndroid Build Coastguard Worker print('Copying %s to %s...' % (source, target)) 256*6777b538SAndroid Build Coastguard Worker if os.path.exists(target): 257*6777b538SAndroid Build Coastguard Worker # Make the file writable so that we can delete it now, and keep it 258*6777b538SAndroid Build Coastguard Worker # readable. 259*6777b538SAndroid Build Coastguard Worker os.chmod(target, stat.S_IWRITE | stat.S_IREAD) 260*6777b538SAndroid Build Coastguard Worker os.unlink(target) 261*6777b538SAndroid Build Coastguard Worker shutil.copy2(source, target) 262*6777b538SAndroid Build Coastguard Worker # Make the file writable so that we can overwrite or delete it later, 263*6777b538SAndroid Build Coastguard Worker # keep it readable. 264*6777b538SAndroid Build Coastguard Worker os.chmod(target, stat.S_IWRITE | stat.S_IREAD) 265*6777b538SAndroid Build Coastguard Worker 266*6777b538SAndroid Build Coastguard Workerdef _SortByHighestVersionNumberFirst(list_of_str_versions): 267*6777b538SAndroid Build Coastguard Worker """This sorts |list_of_str_versions| according to version number rules 268*6777b538SAndroid Build Coastguard Worker so that version "1.12" is higher than version "1.9". Does not work 269*6777b538SAndroid Build Coastguard Worker with non-numeric versions like 1.4.a8 which will be higher than 270*6777b538SAndroid Build Coastguard Worker 1.4.a12. It does handle the versions being embedded in file paths. 271*6777b538SAndroid Build Coastguard Worker """ 272*6777b538SAndroid Build Coastguard Worker def to_int_if_int(x): 273*6777b538SAndroid Build Coastguard Worker try: 274*6777b538SAndroid Build Coastguard Worker return int(x) 275*6777b538SAndroid Build Coastguard Worker except ValueError: 276*6777b538SAndroid Build Coastguard Worker return x 277*6777b538SAndroid Build Coastguard Worker 278*6777b538SAndroid Build Coastguard Worker def to_number_sequence(x): 279*6777b538SAndroid Build Coastguard Worker part_sequence = re.split(r'[\\/\.]', x) 280*6777b538SAndroid Build Coastguard Worker return [to_int_if_int(x) for x in part_sequence] 281*6777b538SAndroid Build Coastguard Worker 282*6777b538SAndroid Build Coastguard Worker list_of_str_versions.sort(key=to_number_sequence, reverse=True) 283*6777b538SAndroid Build Coastguard Worker 284*6777b538SAndroid Build Coastguard Worker 285*6777b538SAndroid Build Coastguard Workerdef _CopyUCRTRuntime(target_dir, source_dir, target_cpu, suffix): 286*6777b538SAndroid Build Coastguard Worker """Copy both the msvcp and vccorlib runtime DLLs, only if the target doesn't 287*6777b538SAndroid Build Coastguard Worker exist, but the target directory does exist.""" 288*6777b538SAndroid Build Coastguard Worker if target_cpu == 'arm64': 289*6777b538SAndroid Build Coastguard Worker # Windows ARM64 VCRuntime is located at {toolchain_root}/VC/Redist/MSVC/ 290*6777b538SAndroid Build Coastguard Worker # {x.y.z}/[debug_nonredist/]arm64/Microsoft.VC14x.CRT/. 291*6777b538SAndroid Build Coastguard Worker # Select VC toolset directory based on Visual Studio version 292*6777b538SAndroid Build Coastguard Worker vc_redist_root = FindVCRedistRoot() 293*6777b538SAndroid Build Coastguard Worker if suffix.startswith('.'): 294*6777b538SAndroid Build Coastguard Worker vc_toolset_dir = 'Microsoft.{}.CRT' \ 295*6777b538SAndroid Build Coastguard Worker .format(MSVC_TOOLSET_VERSION[GetVisualStudioVersion()]) 296*6777b538SAndroid Build Coastguard Worker source_dir = os.path.join(vc_redist_root, 297*6777b538SAndroid Build Coastguard Worker 'arm64', vc_toolset_dir) 298*6777b538SAndroid Build Coastguard Worker else: 299*6777b538SAndroid Build Coastguard Worker vc_toolset_dir = 'Microsoft.{}.DebugCRT' \ 300*6777b538SAndroid Build Coastguard Worker .format(MSVC_TOOLSET_VERSION[GetVisualStudioVersion()]) 301*6777b538SAndroid Build Coastguard Worker source_dir = os.path.join(vc_redist_root, 'debug_nonredist', 302*6777b538SAndroid Build Coastguard Worker 'arm64', vc_toolset_dir) 303*6777b538SAndroid Build Coastguard Worker file_parts = ('msvcp140', 'vccorlib140', 'vcruntime140') 304*6777b538SAndroid Build Coastguard Worker if target_cpu == 'x64' and GetVisualStudioVersion() != '2017': 305*6777b538SAndroid Build Coastguard Worker file_parts = file_parts + ('vcruntime140_1', ) 306*6777b538SAndroid Build Coastguard Worker for file_part in file_parts: 307*6777b538SAndroid Build Coastguard Worker dll = file_part + suffix 308*6777b538SAndroid Build Coastguard Worker target = os.path.join(target_dir, dll) 309*6777b538SAndroid Build Coastguard Worker source = os.path.join(source_dir, dll) 310*6777b538SAndroid Build Coastguard Worker _CopyRuntimeImpl(target, source) 311*6777b538SAndroid Build Coastguard Worker # We must copy ucrtbased.dll for all CPU types. The rest of the Universal CRT 312*6777b538SAndroid Build Coastguard Worker # is installed as part of the OS in Windows 10 and beyond. 313*6777b538SAndroid Build Coastguard Worker if not suffix.startswith('.'): 314*6777b538SAndroid Build Coastguard Worker win_sdk_dir = os.path.normpath( 315*6777b538SAndroid Build Coastguard Worker os.environ.get( 316*6777b538SAndroid Build Coastguard Worker 'WINDOWSSDKDIR', 317*6777b538SAndroid Build Coastguard Worker os.path.expandvars('%ProgramFiles(x86)%' 318*6777b538SAndroid Build Coastguard Worker '\\Windows Kits\\10'))) 319*6777b538SAndroid Build Coastguard Worker # ucrtbased.dll is located at {win_sdk_dir}/bin/{a.b.c.d}/{target_cpu}/ 320*6777b538SAndroid Build Coastguard Worker # ucrt/. 321*6777b538SAndroid Build Coastguard Worker sdk_bin_root = os.path.join(win_sdk_dir, 'bin') 322*6777b538SAndroid Build Coastguard Worker sdk_bin_sub_dirs = glob.glob(os.path.join(sdk_bin_root, '10.*')) 323*6777b538SAndroid Build Coastguard Worker # Select the most recent SDK if there are multiple versions installed. 324*6777b538SAndroid Build Coastguard Worker _SortByHighestVersionNumberFirst(sdk_bin_sub_dirs) 325*6777b538SAndroid Build Coastguard Worker for directory in sdk_bin_sub_dirs: 326*6777b538SAndroid Build Coastguard Worker sdk_redist_root_version = os.path.join(sdk_bin_root, directory) 327*6777b538SAndroid Build Coastguard Worker if not os.path.isdir(sdk_redist_root_version): 328*6777b538SAndroid Build Coastguard Worker continue 329*6777b538SAndroid Build Coastguard Worker source_dir = os.path.join(sdk_redist_root_version, target_cpu, 'ucrt') 330*6777b538SAndroid Build Coastguard Worker if not os.path.isdir(source_dir): 331*6777b538SAndroid Build Coastguard Worker continue 332*6777b538SAndroid Build Coastguard Worker break 333*6777b538SAndroid Build Coastguard Worker _CopyRuntimeImpl(os.path.join(target_dir, 'ucrtbase' + suffix), 334*6777b538SAndroid Build Coastguard Worker os.path.join(source_dir, 'ucrtbase' + suffix)) 335*6777b538SAndroid Build Coastguard Worker 336*6777b538SAndroid Build Coastguard Worker 337*6777b538SAndroid Build Coastguard Workerdef FindVCComponentRoot(component): 338*6777b538SAndroid Build Coastguard Worker """Find the most recent Tools or Redist or other directory in an MSVC install. 339*6777b538SAndroid Build Coastguard Worker Typical results are {toolchain_root}/VC/{component}/MSVC/{x.y.z}. The {x.y.z} 340*6777b538SAndroid Build Coastguard Worker version number part changes frequently so the highest version number found is 341*6777b538SAndroid Build Coastguard Worker used. 342*6777b538SAndroid Build Coastguard Worker """ 343*6777b538SAndroid Build Coastguard Worker 344*6777b538SAndroid Build Coastguard Worker SetEnvironmentAndGetRuntimeDllDirs() 345*6777b538SAndroid Build Coastguard Worker assert ('GYP_MSVS_OVERRIDE_PATH' in os.environ) 346*6777b538SAndroid Build Coastguard Worker vc_component_msvc_root = os.path.join(os.environ['GYP_MSVS_OVERRIDE_PATH'], 347*6777b538SAndroid Build Coastguard Worker 'VC', component, 'MSVC') 348*6777b538SAndroid Build Coastguard Worker vc_component_msvc_contents = glob.glob( 349*6777b538SAndroid Build Coastguard Worker os.path.join(vc_component_msvc_root, '14.*')) 350*6777b538SAndroid Build Coastguard Worker # Select the most recent toolchain if there are several. 351*6777b538SAndroid Build Coastguard Worker _SortByHighestVersionNumberFirst(vc_component_msvc_contents) 352*6777b538SAndroid Build Coastguard Worker for directory in vc_component_msvc_contents: 353*6777b538SAndroid Build Coastguard Worker if os.path.isdir(directory): 354*6777b538SAndroid Build Coastguard Worker return directory 355*6777b538SAndroid Build Coastguard Worker raise Exception('Unable to find the VC %s directory.' % component) 356*6777b538SAndroid Build Coastguard Worker 357*6777b538SAndroid Build Coastguard Worker 358*6777b538SAndroid Build Coastguard Workerdef FindVCRedistRoot(): 359*6777b538SAndroid Build Coastguard Worker """In >=VS2017, Redist binaries are located in 360*6777b538SAndroid Build Coastguard Worker {toolchain_root}/VC/Redist/MSVC/{x.y.z}/{target_cpu}/. 361*6777b538SAndroid Build Coastguard Worker 362*6777b538SAndroid Build Coastguard Worker This returns the '{toolchain_root}/VC/Redist/MSVC/{x.y.z}/' path. 363*6777b538SAndroid Build Coastguard Worker """ 364*6777b538SAndroid Build Coastguard Worker return FindVCComponentRoot('Redist') 365*6777b538SAndroid Build Coastguard Worker 366*6777b538SAndroid Build Coastguard Worker 367*6777b538SAndroid Build Coastguard Workerdef _CopyRuntime(target_dir, source_dir, target_cpu, debug): 368*6777b538SAndroid Build Coastguard Worker """Copy the VS runtime DLLs, only if the target doesn't exist, but the target 369*6777b538SAndroid Build Coastguard Worker directory does exist. Handles VS 2015, 2017 and 2019.""" 370*6777b538SAndroid Build Coastguard Worker suffix = 'd.dll' if debug else '.dll' 371*6777b538SAndroid Build Coastguard Worker # VS 2015, 2017 and 2019 use the same CRT DLLs. 372*6777b538SAndroid Build Coastguard Worker _CopyUCRTRuntime(target_dir, source_dir, target_cpu, suffix) 373*6777b538SAndroid Build Coastguard Worker 374*6777b538SAndroid Build Coastguard Worker 375*6777b538SAndroid Build Coastguard Workerdef CopyDlls(target_dir, configuration, target_cpu): 376*6777b538SAndroid Build Coastguard Worker """Copy the VS runtime DLLs into the requested directory as needed. 377*6777b538SAndroid Build Coastguard Worker 378*6777b538SAndroid Build Coastguard Worker configuration is one of 'Debug' or 'Release'. 379*6777b538SAndroid Build Coastguard Worker target_cpu is one of 'x86', 'x64' or 'arm64'. 380*6777b538SAndroid Build Coastguard Worker 381*6777b538SAndroid Build Coastguard Worker The debug configuration gets both the debug and release DLLs; the 382*6777b538SAndroid Build Coastguard Worker release config only the latter. 383*6777b538SAndroid Build Coastguard Worker """ 384*6777b538SAndroid Build Coastguard Worker vs_runtime_dll_dirs = SetEnvironmentAndGetRuntimeDllDirs() 385*6777b538SAndroid Build Coastguard Worker if not vs_runtime_dll_dirs: 386*6777b538SAndroid Build Coastguard Worker return 387*6777b538SAndroid Build Coastguard Worker 388*6777b538SAndroid Build Coastguard Worker x64_runtime, x86_runtime, arm64_runtime = vs_runtime_dll_dirs 389*6777b538SAndroid Build Coastguard Worker if target_cpu == 'x64': 390*6777b538SAndroid Build Coastguard Worker runtime_dir = x64_runtime 391*6777b538SAndroid Build Coastguard Worker elif target_cpu == 'x86': 392*6777b538SAndroid Build Coastguard Worker runtime_dir = x86_runtime 393*6777b538SAndroid Build Coastguard Worker elif target_cpu == 'arm64': 394*6777b538SAndroid Build Coastguard Worker runtime_dir = arm64_runtime 395*6777b538SAndroid Build Coastguard Worker else: 396*6777b538SAndroid Build Coastguard Worker raise Exception('Unknown target_cpu: ' + target_cpu) 397*6777b538SAndroid Build Coastguard Worker _CopyRuntime(target_dir, runtime_dir, target_cpu, debug=False) 398*6777b538SAndroid Build Coastguard Worker if configuration == 'Debug': 399*6777b538SAndroid Build Coastguard Worker _CopyRuntime(target_dir, runtime_dir, target_cpu, debug=True) 400*6777b538SAndroid Build Coastguard Worker _CopyDebugger(target_dir, target_cpu) 401*6777b538SAndroid Build Coastguard Worker if target_cpu == 'arm64': 402*6777b538SAndroid Build Coastguard Worker target_dir = os.path.join(target_dir, 'win_clang_x64') 403*6777b538SAndroid Build Coastguard Worker target_cpu = 'x64' 404*6777b538SAndroid Build Coastguard Worker runtime_dir = x64_runtime 405*6777b538SAndroid Build Coastguard Worker os.makedirs(target_dir, exist_ok=True) 406*6777b538SAndroid Build Coastguard Worker _CopyRuntime(target_dir, runtime_dir, target_cpu, debug=False) 407*6777b538SAndroid Build Coastguard Worker if configuration == 'Debug': 408*6777b538SAndroid Build Coastguard Worker _CopyRuntime(target_dir, runtime_dir, target_cpu, debug=True) 409*6777b538SAndroid Build Coastguard Worker _CopyDebugger(target_dir, target_cpu) 410*6777b538SAndroid Build Coastguard Worker 411*6777b538SAndroid Build Coastguard Worker 412*6777b538SAndroid Build Coastguard Workerdef _CopyDebugger(target_dir, target_cpu): 413*6777b538SAndroid Build Coastguard Worker """Copy dbghelp.dll, dbgcore.dll, and msdia140.dll into the requested 414*6777b538SAndroid Build Coastguard Worker directory. 415*6777b538SAndroid Build Coastguard Worker 416*6777b538SAndroid Build Coastguard Worker target_cpu is one of 'x86', 'x64' or 'arm64'. 417*6777b538SAndroid Build Coastguard Worker 418*6777b538SAndroid Build Coastguard Worker dbghelp.dll is used when Chrome needs to symbolize stacks. Copying this file 419*6777b538SAndroid Build Coastguard Worker from the SDK directory avoids using the system copy of dbghelp.dll which then 420*6777b538SAndroid Build Coastguard Worker ensures compatibility with recent debug information formats, such as 421*6777b538SAndroid Build Coastguard Worker large-page PDBs. Note that for these DLLs to be deployed to swarming bots they 422*6777b538SAndroid Build Coastguard Worker also need to be listed in group("runtime_libs"). 423*6777b538SAndroid Build Coastguard Worker 424*6777b538SAndroid Build Coastguard Worker dbgcore.dll is needed when using some functions from dbghelp.dll (like 425*6777b538SAndroid Build Coastguard Worker MinidumpWriteDump). 426*6777b538SAndroid Build Coastguard Worker 427*6777b538SAndroid Build Coastguard Worker msdia140.dll is needed for tools like symupload.exe and dump_syms.exe. 428*6777b538SAndroid Build Coastguard Worker """ 429*6777b538SAndroid Build Coastguard Worker win_sdk_dir = SetEnvironmentAndGetSDKDir() 430*6777b538SAndroid Build Coastguard Worker if not win_sdk_dir: 431*6777b538SAndroid Build Coastguard Worker return 432*6777b538SAndroid Build Coastguard Worker 433*6777b538SAndroid Build Coastguard Worker # List of debug files that should be copied, the first element of the tuple is 434*6777b538SAndroid Build Coastguard Worker # the name of the file and the second indicates if it's optional. 435*6777b538SAndroid Build Coastguard Worker debug_files = [('dbghelp.dll', False), ('dbgcore.dll', True)] 436*6777b538SAndroid Build Coastguard Worker for debug_file, is_optional in debug_files: 437*6777b538SAndroid Build Coastguard Worker full_path = os.path.join(win_sdk_dir, 'Debuggers', target_cpu, debug_file) 438*6777b538SAndroid Build Coastguard Worker if not os.path.exists(full_path): 439*6777b538SAndroid Build Coastguard Worker if is_optional: 440*6777b538SAndroid Build Coastguard Worker continue 441*6777b538SAndroid Build Coastguard Worker else: 442*6777b538SAndroid Build Coastguard Worker raise Exception('%s not found in "%s"\r\nYou must install ' 443*6777b538SAndroid Build Coastguard Worker 'Windows 10 SDK version %s including the ' 444*6777b538SAndroid Build Coastguard Worker '"Debugging Tools for Windows" feature.' % 445*6777b538SAndroid Build Coastguard Worker (debug_file, full_path, SDK_VERSION)) 446*6777b538SAndroid Build Coastguard Worker target_path = os.path.join(target_dir, debug_file) 447*6777b538SAndroid Build Coastguard Worker _CopyRuntimeImpl(target_path, full_path) 448*6777b538SAndroid Build Coastguard Worker 449*6777b538SAndroid Build Coastguard Worker # The x64 version of msdia140.dll is always used because symupload and 450*6777b538SAndroid Build Coastguard Worker # dump_syms are always built as x64 binaries. 451*6777b538SAndroid Build Coastguard Worker dia_path = os.path.join(NormalizePath(os.environ['GYP_MSVS_OVERRIDE_PATH']), 452*6777b538SAndroid Build Coastguard Worker 'DIA SDK', 'bin', 'amd64', 'msdia140.dll') 453*6777b538SAndroid Build Coastguard Worker _CopyRuntimeImpl(os.path.join(target_dir, 'msdia140.dll'), dia_path) 454*6777b538SAndroid Build Coastguard Worker 455*6777b538SAndroid Build Coastguard Worker 456*6777b538SAndroid Build Coastguard Workerdef _GetDesiredVsToolchainHashes(): 457*6777b538SAndroid Build Coastguard Worker """Load a list of SHA1s corresponding to the toolchains that we want installed 458*6777b538SAndroid Build Coastguard Worker to build with.""" 459*6777b538SAndroid Build Coastguard Worker # Third parties that do not have access to the canonical toolchain can map 460*6777b538SAndroid Build Coastguard Worker # canonical toolchain version to their own toolchain versions. 461*6777b538SAndroid Build Coastguard Worker toolchain_hash_mapping_key = 'GYP_MSVS_HASH_%s' % TOOLCHAIN_HASH 462*6777b538SAndroid Build Coastguard Worker return [os.environ.get(toolchain_hash_mapping_key, TOOLCHAIN_HASH)] 463*6777b538SAndroid Build Coastguard Worker 464*6777b538SAndroid Build Coastguard Worker 465*6777b538SAndroid Build Coastguard Workerdef ShouldUpdateToolchain(): 466*6777b538SAndroid Build Coastguard Worker """Check if the toolchain should be upgraded.""" 467*6777b538SAndroid Build Coastguard Worker if not os.path.exists(json_data_file): 468*6777b538SAndroid Build Coastguard Worker return True 469*6777b538SAndroid Build Coastguard Worker with open(json_data_file, 'r') as tempf: 470*6777b538SAndroid Build Coastguard Worker toolchain_data = json.load(tempf) 471*6777b538SAndroid Build Coastguard Worker version = toolchain_data['version'] 472*6777b538SAndroid Build Coastguard Worker env_version = GetVisualStudioVersion() 473*6777b538SAndroid Build Coastguard Worker # If there's a mismatch between the version set in the environment and the one 474*6777b538SAndroid Build Coastguard Worker # in the json file then the toolchain should be updated. 475*6777b538SAndroid Build Coastguard Worker return version != env_version 476*6777b538SAndroid Build Coastguard Worker 477*6777b538SAndroid Build Coastguard Worker 478*6777b538SAndroid Build Coastguard Workerdef Update(force=False, no_download=False): 479*6777b538SAndroid Build Coastguard Worker """Requests an update of the toolchain to the specific hashes we have at 480*6777b538SAndroid Build Coastguard Worker this revision. The update outputs a .json of the various configuration 481*6777b538SAndroid Build Coastguard Worker information required to pass to gyp which we use in |GetToolchainDir()|. 482*6777b538SAndroid Build Coastguard Worker If no_download is true then the toolchain will be configured if present but 483*6777b538SAndroid Build Coastguard Worker will not be downloaded. 484*6777b538SAndroid Build Coastguard Worker """ 485*6777b538SAndroid Build Coastguard Worker if force != False and force != '--force': 486*6777b538SAndroid Build Coastguard Worker print('Unknown parameter "%s"' % force, file=sys.stderr) 487*6777b538SAndroid Build Coastguard Worker return 1 488*6777b538SAndroid Build Coastguard Worker if force == '--force' or os.path.exists(json_data_file): 489*6777b538SAndroid Build Coastguard Worker force = True 490*6777b538SAndroid Build Coastguard Worker 491*6777b538SAndroid Build Coastguard Worker depot_tools_win_toolchain = \ 492*6777b538SAndroid Build Coastguard Worker bool(int(os.environ.get('DEPOT_TOOLS_WIN_TOOLCHAIN', '1'))) 493*6777b538SAndroid Build Coastguard Worker if (_HostIsWindows() or force) and depot_tools_win_toolchain: 494*6777b538SAndroid Build Coastguard Worker import find_depot_tools 495*6777b538SAndroid Build Coastguard Worker depot_tools_path = find_depot_tools.add_depot_tools_to_path() 496*6777b538SAndroid Build Coastguard Worker 497*6777b538SAndroid Build Coastguard Worker # On Linux, the file system is usually case-sensitive while the Windows 498*6777b538SAndroid Build Coastguard Worker # SDK only works on case-insensitive file systems. If it doesn't already 499*6777b538SAndroid Build Coastguard Worker # exist, set up a ciopfs fuse mount to put the SDK in a case-insensitive 500*6777b538SAndroid Build Coastguard Worker # part of the file system. 501*6777b538SAndroid Build Coastguard Worker toolchain_dir = os.path.join(depot_tools_path, 'win_toolchain', 'vs_files') 502*6777b538SAndroid Build Coastguard Worker # For testing this block, unmount existing mounts with 503*6777b538SAndroid Build Coastguard Worker # fusermount -u third_party/depot_tools/win_toolchain/vs_files 504*6777b538SAndroid Build Coastguard Worker if sys.platform.startswith('linux') and not os.path.ismount(toolchain_dir): 505*6777b538SAndroid Build Coastguard Worker ciopfs = shutil.which('ciopfs') 506*6777b538SAndroid Build Coastguard Worker if not ciopfs: 507*6777b538SAndroid Build Coastguard Worker # ciopfs not found in PATH; try the one downloaded from the DEPS hook. 508*6777b538SAndroid Build Coastguard Worker ciopfs = os.path.join(script_dir, 'ciopfs') 509*6777b538SAndroid Build Coastguard Worker if not os.path.isdir(toolchain_dir): 510*6777b538SAndroid Build Coastguard Worker os.mkdir(toolchain_dir) 511*6777b538SAndroid Build Coastguard Worker if not os.path.isdir(toolchain_dir + '.ciopfs'): 512*6777b538SAndroid Build Coastguard Worker os.mkdir(toolchain_dir + '.ciopfs') 513*6777b538SAndroid Build Coastguard Worker # Without use_ino, clang's #pragma once and Wnonportable-include-path 514*6777b538SAndroid Build Coastguard Worker # both don't work right, see https://llvm.org/PR34931 515*6777b538SAndroid Build Coastguard Worker # use_ino doesn't slow down builds, so it seems there's no drawback to 516*6777b538SAndroid Build Coastguard Worker # just using it always. 517*6777b538SAndroid Build Coastguard Worker subprocess.check_call([ 518*6777b538SAndroid Build Coastguard Worker ciopfs, '-o', 'use_ino', toolchain_dir + '.ciopfs', toolchain_dir]) 519*6777b538SAndroid Build Coastguard Worker 520*6777b538SAndroid Build Coastguard Worker get_toolchain_args = [ 521*6777b538SAndroid Build Coastguard Worker sys.executable, 522*6777b538SAndroid Build Coastguard Worker os.path.join(depot_tools_path, 523*6777b538SAndroid Build Coastguard Worker 'win_toolchain', 524*6777b538SAndroid Build Coastguard Worker 'get_toolchain_if_necessary.py'), 525*6777b538SAndroid Build Coastguard Worker '--output-json', json_data_file, 526*6777b538SAndroid Build Coastguard Worker ] + _GetDesiredVsToolchainHashes() 527*6777b538SAndroid Build Coastguard Worker if force: 528*6777b538SAndroid Build Coastguard Worker get_toolchain_args.append('--force') 529*6777b538SAndroid Build Coastguard Worker if no_download: 530*6777b538SAndroid Build Coastguard Worker get_toolchain_args.append('--no-download') 531*6777b538SAndroid Build Coastguard Worker subprocess.check_call(get_toolchain_args) 532*6777b538SAndroid Build Coastguard Worker 533*6777b538SAndroid Build Coastguard Worker return 0 534*6777b538SAndroid Build Coastguard Worker 535*6777b538SAndroid Build Coastguard Worker 536*6777b538SAndroid Build Coastguard Workerdef NormalizePath(path): 537*6777b538SAndroid Build Coastguard Worker while path.endswith('\\'): 538*6777b538SAndroid Build Coastguard Worker path = path[:-1] 539*6777b538SAndroid Build Coastguard Worker return path 540*6777b538SAndroid Build Coastguard Worker 541*6777b538SAndroid Build Coastguard Worker 542*6777b538SAndroid Build Coastguard Workerdef SetEnvironmentAndGetSDKDir(): 543*6777b538SAndroid Build Coastguard Worker """Gets location information about the current sdk (must have been 544*6777b538SAndroid Build Coastguard Worker previously updated by 'update'). This is used for the GN build.""" 545*6777b538SAndroid Build Coastguard Worker SetEnvironmentAndGetRuntimeDllDirs() 546*6777b538SAndroid Build Coastguard Worker 547*6777b538SAndroid Build Coastguard Worker # If WINDOWSSDKDIR is not set, search the default SDK path and set it. 548*6777b538SAndroid Build Coastguard Worker if not 'WINDOWSSDKDIR' in os.environ: 549*6777b538SAndroid Build Coastguard Worker default_sdk_path = os.path.expandvars('%ProgramFiles(x86)%' 550*6777b538SAndroid Build Coastguard Worker '\\Windows Kits\\10') 551*6777b538SAndroid Build Coastguard Worker if os.path.isdir(default_sdk_path): 552*6777b538SAndroid Build Coastguard Worker os.environ['WINDOWSSDKDIR'] = default_sdk_path 553*6777b538SAndroid Build Coastguard Worker 554*6777b538SAndroid Build Coastguard Worker return NormalizePath(os.environ['WINDOWSSDKDIR']) 555*6777b538SAndroid Build Coastguard Worker 556*6777b538SAndroid Build Coastguard Worker 557*6777b538SAndroid Build Coastguard Workerdef GetToolchainDir(): 558*6777b538SAndroid Build Coastguard Worker """Gets location information about the current toolchain (must have been 559*6777b538SAndroid Build Coastguard Worker previously updated by 'update'). This is used for the GN build.""" 560*6777b538SAndroid Build Coastguard Worker runtime_dll_dirs = SetEnvironmentAndGetRuntimeDllDirs() 561*6777b538SAndroid Build Coastguard Worker win_sdk_dir = SetEnvironmentAndGetSDKDir() 562*6777b538SAndroid Build Coastguard Worker 563*6777b538SAndroid Build Coastguard Worker print('''vs_path = %s 564*6777b538SAndroid Build Coastguard Workersdk_version = %s 565*6777b538SAndroid Build Coastguard Workersdk_path = %s 566*6777b538SAndroid Build Coastguard Workervs_version = %s 567*6777b538SAndroid Build Coastguard Workerwdk_dir = %s 568*6777b538SAndroid Build Coastguard Workerruntime_dirs = %s 569*6777b538SAndroid Build Coastguard Worker''' % (ToGNString(NormalizePath( 570*6777b538SAndroid Build Coastguard Worker os.environ['GYP_MSVS_OVERRIDE_PATH'])), ToGNString(SDK_VERSION), 571*6777b538SAndroid Build Coastguard Worker ToGNString(win_sdk_dir), ToGNString(GetVisualStudioVersion()), 572*6777b538SAndroid Build Coastguard Worker ToGNString(NormalizePath(os.environ.get('WDK_DIR', ''))), 573*6777b538SAndroid Build Coastguard Worker ToGNString(os.path.pathsep.join(runtime_dll_dirs or ['None'])))) 574*6777b538SAndroid Build Coastguard Worker 575*6777b538SAndroid Build Coastguard Worker 576*6777b538SAndroid Build Coastguard Workerdef main(): 577*6777b538SAndroid Build Coastguard Worker commands = { 578*6777b538SAndroid Build Coastguard Worker 'update': Update, 579*6777b538SAndroid Build Coastguard Worker 'get_toolchain_dir': GetToolchainDir, 580*6777b538SAndroid Build Coastguard Worker 'copy_dlls': CopyDlls, 581*6777b538SAndroid Build Coastguard Worker } 582*6777b538SAndroid Build Coastguard Worker if len(sys.argv) < 2 or sys.argv[1] not in commands: 583*6777b538SAndroid Build Coastguard Worker print('Expected one of: %s' % ', '.join(commands), file=sys.stderr) 584*6777b538SAndroid Build Coastguard Worker return 1 585*6777b538SAndroid Build Coastguard Worker return commands[sys.argv[1]](*sys.argv[2:]) 586*6777b538SAndroid Build Coastguard Worker 587*6777b538SAndroid Build Coastguard Worker 588*6777b538SAndroid Build Coastguard Workerif __name__ == '__main__': 589*6777b538SAndroid Build Coastguard Worker sys.exit(main()) 590