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 shutil | 10 import shutil |
11 import stat | |
11 import subprocess | 12 import subprocess |
12 import sys | 13 import sys |
13 | 14 |
14 | 15 |
15 script_dir = os.path.dirname(os.path.realpath(__file__)) | 16 script_dir = os.path.dirname(os.path.realpath(__file__)) |
16 chrome_src = os.path.abspath(os.path.join(script_dir, os.pardir)) | 17 chrome_src = os.path.abspath(os.path.join(script_dir, os.pardir)) |
17 SRC_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) | 18 SRC_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) |
18 sys.path.insert(0, os.path.join(chrome_src, 'tools', 'gyp', 'pylib')) | 19 sys.path.insert(0, os.path.join(chrome_src, 'tools', 'gyp', 'pylib')) |
19 json_data_file = os.path.join(script_dir, 'win_toolchain.json') | 20 json_data_file = os.path.join(script_dir, 'win_toolchain.json') |
20 | 21 |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
67 os.environ['WINDOWSSDKDIR'] = win_sdk | 68 os.environ['WINDOWSSDKDIR'] = win_sdk |
68 os.environ['WDK_DIR'] = wdk | 69 os.environ['WDK_DIR'] = wdk |
69 # Include the VS runtime in the PATH in case it's not machine-installed. | 70 # Include the VS runtime in the PATH in case it's not machine-installed. |
70 runtime_path = os.path.pathsep.join(vs_runtime_dll_dirs) | 71 runtime_path = os.path.pathsep.join(vs_runtime_dll_dirs) |
71 os.environ['PATH'] = runtime_path + os.path.pathsep + os.environ['PATH'] | 72 os.environ['PATH'] = runtime_path + os.path.pathsep + os.environ['PATH'] |
72 elif sys.platform == 'win32' and not depot_tools_win_toolchain: | 73 elif sys.platform == 'win32' and not depot_tools_win_toolchain: |
73 if not 'GYP_MSVS_OVERRIDE_PATH' in os.environ: | 74 if not 'GYP_MSVS_OVERRIDE_PATH' in os.environ: |
74 os.environ['GYP_MSVS_OVERRIDE_PATH'] = DetectVisualStudioPath() | 75 os.environ['GYP_MSVS_OVERRIDE_PATH'] = DetectVisualStudioPath() |
75 if not 'GYP_MSVS_VERSION' in os.environ: | 76 if not 'GYP_MSVS_VERSION' in os.environ: |
76 os.environ['GYP_MSVS_VERSION'] = GetVisualStudioVersion() | 77 os.environ['GYP_MSVS_VERSION'] = GetVisualStudioVersion() |
78 # When using an installed toolchain these files aren't needed in the output | |
79 # directory in order to run binaries locally, but they are needed in order | |
80 # to create isolates or the mini_installer. Copying them to the output | |
81 # directory ensures that they are available when needed. | |
82 if os.access('C:/Windows/SysWOW64', os.F_OK): | |
83 # Default 64-bit and 32-bit system directories on 64-bit Windows. | |
84 vs_runtime_dll_dirs = [ 'C:/Windows/System32', 'C:/Windows/SysWOW64' ] | |
scottmg
2016/05/31 21:57:44
Hmm, I'm confused. I would have thought it was x86
brucedawson
2016/05/31 23:32:18
I'm not sure. That's worrisome that gyp and gn beh
| |
85 else: | |
86 # Default 32-bit system directories on 32-bit Windows. | |
87 vs_runtime_dll_dirs = [ None, 'C:/Windows/System32' ] | |
77 | 88 |
78 return vs_runtime_dll_dirs | 89 return vs_runtime_dll_dirs |
79 | 90 |
80 | 91 |
81 def _RegistryGetValueUsingWinReg(key, value): | 92 def _RegistryGetValueUsingWinReg(key, value): |
82 """Use the _winreg module to obtain the value of a registry key. | 93 """Use the _winreg module to obtain the value of a registry key. |
83 | 94 |
84 Args: | 95 Args: |
85 key: The registry key. | 96 key: The registry key. |
86 value: The particular registry value to read. | 97 value: The particular registry value to read. |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
157 updated (comparing last modified time as an approximate float match as for | 168 updated (comparing last modified time as an approximate float match as for |
158 some reason the values tend to differ by ~1e-07 despite being copies of the | 169 some reason the values tend to differ by ~1e-07 despite being copies of the |
159 same file... https://crbug.com/603603). | 170 same file... https://crbug.com/603603). |
160 """ | 171 """ |
161 if (os.path.isdir(os.path.dirname(target)) and | 172 if (os.path.isdir(os.path.dirname(target)) and |
162 (not os.path.isfile(target) or | 173 (not os.path.isfile(target) or |
163 abs(os.stat(target).st_mtime - os.stat(source).st_mtime) >= 0.01)): | 174 abs(os.stat(target).st_mtime - os.stat(source).st_mtime) >= 0.01)): |
164 if verbose: | 175 if verbose: |
165 print 'Copying %s to %s...' % (source, target) | 176 print 'Copying %s to %s...' % (source, target) |
166 if os.path.exists(target): | 177 if os.path.exists(target): |
178 # Make the file writable so that we can delete it now. | |
179 os.chmod(target, stat.S_IWRITE) | |
167 os.unlink(target) | 180 os.unlink(target) |
168 shutil.copy2(source, target) | 181 shutil.copy2(source, target) |
182 # Make the file writable so that we can overwrite or delete it later. | |
183 os.chmod(target, stat.S_IWRITE) | |
169 | 184 |
170 | 185 |
171 def _CopyRuntime2013(target_dir, source_dir, dll_pattern): | 186 def _CopyRuntime2013(target_dir, source_dir, dll_pattern): |
172 """Copy both the msvcr and msvcp runtime DLLs, only if the target doesn't | 187 """Copy both the msvcr and msvcp runtime DLLs, only if the target doesn't |
173 exist, but the target directory does exist.""" | 188 exist, but the target directory does exist.""" |
174 for file_part in ('p', 'r'): | 189 for file_part in ('p', 'r'): |
175 dll = dll_pattern % file_part | 190 dll = dll_pattern % file_part |
176 target = os.path.join(target_dir, dll) | 191 target = os.path.join(target_dir, dll) |
177 source = os.path.join(source_dir, dll) | 192 source = os.path.join(source_dir, dll) |
178 _CopyRuntimeImpl(target, source) | 193 _CopyRuntimeImpl(target, source) |
179 | 194 |
180 | 195 |
181 def _CopyRuntime2015(target_dir, source_dir, dll_pattern, suffix): | 196 def _CopyRuntime2015(target_dir, source_dir, dll_pattern, suffix): |
182 """Copy both the msvcp and vccorlib runtime DLLs, only if the target doesn't | 197 """Copy both the msvcp and vccorlib runtime DLLs, only if the target doesn't |
183 exist, but the target directory does exist.""" | 198 exist, but the target directory does exist.""" |
184 for file_part in ('msvcp', 'vccorlib', 'vcruntime'): | 199 for file_part in ('msvcp', 'vccorlib', 'vcruntime'): |
185 dll = dll_pattern % file_part | 200 dll = dll_pattern % file_part |
186 target = os.path.join(target_dir, dll) | 201 target = os.path.join(target_dir, dll) |
187 source = os.path.join(source_dir, dll) | 202 source = os.path.join(source_dir, dll) |
188 _CopyRuntimeImpl(target, source) | 203 _CopyRuntimeImpl(target, source) |
189 ucrt_src_dir = os.path.join(source_dir, 'api-ms-win-*.dll') | 204 # OS installs of Visual Studio (and all installs of Windows 10) put the |
190 for ucrt_src_file in glob.glob(ucrt_src_dir): | 205 # universal CRT files in c:\Windows\System32\downlevel - look for them there |
206 # to support DEPOT_TOOLS_WIN_TOOLCHAIN=0. | |
207 if os.path.exists(os.path.join(source_dir, 'downlevel')): | |
208 ucrt_src_dir = os.path.join(source_dir, 'downlevel', 'api-ms-win-*.dll') | |
scottmg
2016/05/31 21:57:44
Maybe ucrt_src_pattern or _glob instead.
brucedawson
2016/05/31 23:32:18
Done.
| |
209 else: | |
210 ucrt_src_dir = os.path.join(source_dir, 'api-ms-win-*.dll') | |
211 ucrt_files = glob.glob(ucrt_src_dir) | |
212 assert len(ucrt_files) > 0 | |
213 for ucrt_src_file in ucrt_files: | |
191 file_part = os.path.basename(ucrt_src_file) | 214 file_part = os.path.basename(ucrt_src_file) |
192 ucrt_dst_file = os.path.join(target_dir, file_part) | 215 ucrt_dst_file = os.path.join(target_dir, file_part) |
193 _CopyRuntimeImpl(ucrt_dst_file, ucrt_src_file, False) | 216 _CopyRuntimeImpl(ucrt_dst_file, ucrt_src_file, False) |
194 _CopyRuntimeImpl(os.path.join(target_dir, 'ucrtbase' + suffix), | 217 _CopyRuntimeImpl(os.path.join(target_dir, 'ucrtbase' + suffix), |
195 os.path.join(source_dir, 'ucrtbase' + suffix)) | 218 os.path.join(source_dir, 'ucrtbase' + suffix)) |
196 | 219 |
197 | 220 |
198 def _CopyRuntime(target_dir, source_dir, target_cpu, debug): | 221 def _CopyRuntime(target_dir, source_dir, target_cpu, debug): |
199 """Copy the VS runtime DLLs, only if the target doesn't exist, but the target | 222 """Copy the VS runtime DLLs, only if the target doesn't exist, but the target |
200 directory does exist. Handles VS 2013 and VS 2015.""" | 223 directory does exist. Handles VS 2013 and VS 2015.""" |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
373 'copy_dlls': CopyDlls, | 396 'copy_dlls': CopyDlls, |
374 } | 397 } |
375 if len(sys.argv) < 2 or sys.argv[1] not in commands: | 398 if len(sys.argv) < 2 or sys.argv[1] not in commands: |
376 print >>sys.stderr, 'Expected one of: %s' % ', '.join(commands) | 399 print >>sys.stderr, 'Expected one of: %s' % ', '.join(commands) |
377 return 1 | 400 return 1 |
378 return commands[sys.argv[1]](*sys.argv[2:]) | 401 return commands[sys.argv[1]](*sys.argv[2:]) |
379 | 402 |
380 | 403 |
381 if __name__ == '__main__': | 404 if __name__ == '__main__': |
382 sys.exit(main()) | 405 sys.exit(main()) |
OLD | NEW |