Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright 2014 The Chromium Authors. All rights reserved. | 2 # Copyright 2014 The Chromium Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 | 5 |
| 6 import glob | 6 import glob |
| 7 import json | 7 import json |
| 8 import os | 8 import os |
| 9 import pipes | 9 import pipes |
| 10 import platform | 10 import platform |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 128 def DetectVisualStudioPath(): | 128 def DetectVisualStudioPath(): |
| 129 """Return path to the GYP_MSVS_VERSION of Visual Studio. | 129 """Return path to the GYP_MSVS_VERSION of Visual Studio. |
| 130 """ | 130 """ |
| 131 | 131 |
| 132 # Note that this code is used from | 132 # Note that this code is used from |
| 133 # build/toolchain/win/setup_toolchain.py as well. | 133 # build/toolchain/win/setup_toolchain.py as well. |
| 134 version_as_year = GetVisualStudioVersion() | 134 version_as_year = GetVisualStudioVersion() |
| 135 year_to_version = { | 135 year_to_version = { |
| 136 '2013': '12.0', | 136 '2013': '12.0', |
| 137 '2015': '14.0', | 137 '2015': '14.0', |
| 138 '2017': '15.0', | |
| 138 } | 139 } |
| 139 if version_as_year not in year_to_version: | 140 if version_as_year not in year_to_version: |
| 140 raise Exception(('Visual Studio version %s (from GYP_MSVS_VERSION)' | 141 raise Exception(('Visual Studio version %s (from GYP_MSVS_VERSION)' |
| 141 ' not supported. Supported versions are: %s') % ( | 142 ' not supported. Supported versions are: %s') % ( |
| 142 version_as_year, ', '.join(year_to_version.keys()))) | 143 version_as_year, ', '.join(year_to_version.keys()))) |
| 143 version = year_to_version[version_as_year] | 144 version = year_to_version[version_as_year] |
| 144 keys = [r'HKLM\Software\Microsoft\VisualStudio\%s' % version, | 145 if version_as_year == '2017': |
| 145 r'HKLM\Software\Wow6432Node\Microsoft\VisualStudio\%s' % version] | 146 # The VC++ 2017 install location needs to be located using COM instead of |
| 146 for key in keys: | 147 # the registry. For details see: |
| 147 path = _RegistryGetValue(key, 'InstallDir') | 148 # https://blogs.msdn.microsoft.com/heaths/2016/09/15/changes-to-visual-studi o-15-setup/ |
| 148 if not path: | 149 # For now we use a hardcoded default with an environment variable override. |
| 149 continue | 150 path = r'C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional' |
| 150 path = os.path.normpath(os.path.join(path, '..', '..')) | 151 path = os.environ.get('vs2017_install', path) |
| 151 return path | 152 if os.path.exists(path): |
| 153 return path | |
| 154 else: | |
| 155 keys = [r'HKLM\Software\Microsoft\VisualStudio\%s' % version, | |
| 156 r'HKLM\Software\Wow6432Node\Microsoft\VisualStudio\%s' % version] | |
| 157 for key in keys: | |
| 158 path = _RegistryGetValue(key, 'InstallDir') | |
| 159 if not path: | |
| 160 continue | |
| 161 path = os.path.normpath(os.path.join(path, '..', '..')) | |
| 162 return path | |
| 152 | 163 |
| 153 raise Exception(('Visual Studio Version %s (from GYP_MSVS_VERSION)' | 164 raise Exception(('Visual Studio Version %s (from GYP_MSVS_VERSION)' |
| 154 ' not found.') % (version_as_year)) | 165 ' not found.') % (version_as_year)) |
| 155 | 166 |
| 156 | 167 |
| 157 def _VersionNumber(): | 168 def _VersionNumber(): |
| 158 """Gets the standard version number ('120', '140', etc.) based on | 169 """Gets the standard version number ('120', '140', etc.) based on |
| 159 GYP_MSVS_VERSION.""" | 170 GYP_MSVS_VERSION.""" |
| 160 vs_version = GetVisualStudioVersion() | 171 vs_version = GetVisualStudioVersion() |
| 161 if vs_version == '2013': | 172 if vs_version == '2013': |
| 162 return '120' | 173 return '120' |
| 163 elif vs_version == '2015': | 174 elif vs_version == '2015': |
| 164 return '140' | 175 return '140' |
| 176 elif vs_version == '2017': | |
| 177 return '150' | |
|
Sébastien Marchand
2017/05/10 21:23:49
Is it true? The files in 4e8a360587a3c8ff3fa46aa92
brucedawson
2017/05/10 21:32:32
I think VS 2017 uses 140, 141, and 150, depending
| |
| 165 else: | 178 else: |
| 166 raise ValueError('Unexpected GYP_MSVS_VERSION') | 179 raise ValueError('Unexpected GYP_MSVS_VERSION') |
| 167 | 180 |
| 168 | 181 |
| 169 def _CopyRuntimeImpl(target, source, verbose=True): | 182 def _CopyRuntimeImpl(target, source, verbose=True): |
| 170 """Copy |source| to |target| if it doesn't already exist or if it needs to be | 183 """Copy |source| to |target| if it doesn't already exist or if it needs to be |
| 171 updated (comparing last modified time as an approximate float match as for | 184 updated (comparing last modified time as an approximate float match as for |
| 172 some reason the values tend to differ by ~1e-07 despite being copies of the | 185 some reason the values tend to differ by ~1e-07 despite being copies of the |
| 173 same file... https://crbug.com/603603). | 186 same file... https://crbug.com/603603). |
| 174 """ | 187 """ |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 189 def _CopyRuntime2013(target_dir, source_dir, dll_pattern): | 202 def _CopyRuntime2013(target_dir, source_dir, dll_pattern): |
| 190 """Copy both the msvcr and msvcp runtime DLLs, only if the target doesn't | 203 """Copy both the msvcr and msvcp runtime DLLs, only if the target doesn't |
| 191 exist, but the target directory does exist.""" | 204 exist, but the target directory does exist.""" |
| 192 for file_part in ('p', 'r'): | 205 for file_part in ('p', 'r'): |
| 193 dll = dll_pattern % file_part | 206 dll = dll_pattern % file_part |
| 194 target = os.path.join(target_dir, dll) | 207 target = os.path.join(target_dir, dll) |
| 195 source = os.path.join(source_dir, dll) | 208 source = os.path.join(source_dir, dll) |
| 196 _CopyRuntimeImpl(target, source) | 209 _CopyRuntimeImpl(target, source) |
| 197 | 210 |
| 198 | 211 |
| 199 def _CopyRuntime2015(target_dir, source_dir, dll_pattern, suffix): | 212 def _CopyUCRTRuntime(target_dir, source_dir, dll_pattern, suffix): |
| 200 """Copy both the msvcp and vccorlib runtime DLLs, only if the target doesn't | 213 """Copy both the msvcp and vccorlib runtime DLLs, only if the target doesn't |
| 201 exist, but the target directory does exist.""" | 214 exist, but the target directory does exist.""" |
| 202 for file_part in ('msvcp', 'vccorlib', 'vcruntime'): | 215 for file_part in ('msvcp', 'vccorlib', 'vcruntime'): |
| 203 dll = dll_pattern % file_part | 216 dll = dll_pattern % file_part |
| 204 target = os.path.join(target_dir, dll) | 217 target = os.path.join(target_dir, dll) |
| 205 source = os.path.join(source_dir, dll) | 218 source = os.path.join(source_dir, dll) |
| 206 _CopyRuntimeImpl(target, source) | 219 _CopyRuntimeImpl(target, source) |
| 207 # OS installs of Visual Studio (and all installs of Windows 10) put the | 220 # OS installs of Visual Studio (and all installs of Windows 10) put the |
| 208 # universal CRT files in c:\Windows\System32\downlevel - look for them there | 221 # universal CRT files in c:\Windows\System32\downlevel - look for them there |
| 209 # to support DEPOT_TOOLS_WIN_TOOLCHAIN=0. | 222 # to support DEPOT_TOOLS_WIN_TOOLCHAIN=0. |
| 210 if os.path.exists(os.path.join(source_dir, 'downlevel')): | 223 if os.path.exists(os.path.join(source_dir, 'downlevel')): |
| 211 ucrt_src_glob = os.path.join(source_dir, 'downlevel', 'api-ms-win-*.dll') | 224 ucrt_src_glob = os.path.join(source_dir, 'downlevel', 'api-ms-win-*.dll') |
| 212 else: | 225 else: |
| 213 ucrt_src_glob = os.path.join(source_dir, 'api-ms-win-*.dll') | 226 ucrt_src_glob = os.path.join(source_dir, 'api-ms-win-*.dll') |
| 214 ucrt_files = glob.glob(ucrt_src_glob) | 227 ucrt_files = glob.glob(ucrt_src_glob) |
| 215 assert len(ucrt_files) > 0 | 228 assert len(ucrt_files) > 0 |
| 216 for ucrt_src_file in ucrt_files: | 229 for ucrt_src_file in ucrt_files: |
| 217 file_part = os.path.basename(ucrt_src_file) | 230 file_part = os.path.basename(ucrt_src_file) |
| 218 ucrt_dst_file = os.path.join(target_dir, file_part) | 231 ucrt_dst_file = os.path.join(target_dir, file_part) |
| 219 _CopyRuntimeImpl(ucrt_dst_file, ucrt_src_file, False) | 232 _CopyRuntimeImpl(ucrt_dst_file, ucrt_src_file, False) |
| 220 _CopyRuntimeImpl(os.path.join(target_dir, 'ucrtbase' + suffix), | 233 _CopyRuntimeImpl(os.path.join(target_dir, 'ucrtbase' + suffix), |
| 221 os.path.join(source_dir, 'ucrtbase' + suffix)) | 234 os.path.join(source_dir, 'ucrtbase' + suffix)) |
| 222 | 235 |
| 223 | 236 |
| 224 def _CopyRuntime(target_dir, source_dir, target_cpu, debug): | 237 def _CopyRuntime(target_dir, source_dir, target_cpu, debug): |
| 225 """Copy the VS runtime DLLs, only if the target doesn't exist, but the target | 238 """Copy the VS runtime DLLs, only if the target doesn't exist, but the target |
| 226 directory does exist. Handles VS 2013 and VS 2015.""" | 239 directory does exist. Handles VS 2013, VS 2015, and VS 2017.""" |
| 227 suffix = "d.dll" if debug else ".dll" | 240 suffix = "d.dll" if debug else ".dll" |
| 228 if GetVisualStudioVersion() == '2015': | 241 if GetVisualStudioVersion() == '2015' or GetVisualStudioVersion() == '2017': |
| 229 _CopyRuntime2015(target_dir, source_dir, '%s140' + suffix, suffix) | 242 # VS 2017 RC uses the same CRT DLLs as VS 2015. |
| 243 _CopyUCRTRuntime(target_dir, source_dir, '%s140' + suffix, suffix) | |
| 230 else: | 244 else: |
| 231 _CopyRuntime2013(target_dir, source_dir, 'msvc%s120' + suffix) | 245 _CopyRuntime2013(target_dir, source_dir, 'msvc%s120' + suffix) |
| 232 | 246 |
| 233 # Copy the PGO runtime library to the release directories. | 247 # Copy the PGO runtime library to the release directories. |
| 234 if not debug and os.environ.get('GYP_MSVS_OVERRIDE_PATH'): | 248 if not debug and os.environ.get('GYP_MSVS_OVERRIDE_PATH'): |
| 235 pgo_x86_runtime_dir = os.path.join(os.environ.get('GYP_MSVS_OVERRIDE_PATH'), | 249 pgo_x86_runtime_dir = os.path.join(os.environ.get('GYP_MSVS_OVERRIDE_PATH'), |
| 236 'VC', 'bin') | 250 'VC', 'bin') |
| 237 pgo_x64_runtime_dir = os.path.join(pgo_x86_runtime_dir, 'amd64') | 251 pgo_x64_runtime_dir = os.path.join(pgo_x86_runtime_dir, 'amd64') |
| 238 pgo_runtime_dll = 'pgort' + _VersionNumber() + '.dll' | 252 pgo_runtime_dll = 'pgort' + _VersionNumber() + '.dll' |
| 239 if target_cpu == "x86": | 253 if target_cpu == "x86": |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 395 'copy_dlls': CopyDlls, | 409 'copy_dlls': CopyDlls, |
| 396 } | 410 } |
| 397 if len(sys.argv) < 2 or sys.argv[1] not in commands: | 411 if len(sys.argv) < 2 or sys.argv[1] not in commands: |
| 398 print >>sys.stderr, 'Expected one of: %s' % ', '.join(commands) | 412 print >>sys.stderr, 'Expected one of: %s' % ', '.join(commands) |
| 399 return 1 | 413 return 1 |
| 400 return commands[sys.argv[1]](*sys.argv[2:]) | 414 return commands[sys.argv[1]](*sys.argv[2:]) |
| 401 | 415 |
| 402 | 416 |
| 403 if __name__ == '__main__': | 417 if __name__ == '__main__': |
| 404 sys.exit(main()) | 418 sys.exit(main()) |
| OLD | NEW |