OLD | NEW |
1 # Copyright 2014 The Chromium Authors. All rights reserved. | 1 # Copyright 2014 The Chromium Authors. All rights reserved. |
2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 """ | 5 """ |
6 From a system-installed copy of the toolchain, packages all the required bits | 6 From a system-installed copy of the toolchain, packages all the required bits |
7 into a .zip file. | 7 into a .zip file. |
8 | 8 |
9 It assumes default install locations for tools, in particular: | 9 It assumes default install locations for tools, in particular: |
10 - C:\Program Files (x86)\Microsoft Visual Studio 12.0\... | 10 - C:\Program Files (x86)\Microsoft Visual Studio 12.0\... |
11 - C:\Program Files (x86)\Windows Kits\10\... | 11 - C:\Program Files (x86)\Windows Kits\10\... |
12 | 12 |
13 1. Start from a fresh Win7 VM image. | 13 1. Start from a fresh Win7 VM image. |
14 2. Install VS Pro. Deselect everything except MFC. | 14 2. Install VS Pro. Deselect everything except MFC. |
15 3. Install Windows 10 SDK. Select only the Windows SDK and Debugging Tools for | 15 3. Install Windows 10 SDK. Select only the Windows SDK and Debugging Tools for |
16 Windows. | 16 Windows. |
17 4. Run this script, which will build a <sha1>.zip. | 17 4. Run this script, which will build a <sha1>.zip. |
18 | 18 |
19 Express is not yet supported by this script, but patches welcome (it's not too | 19 Express is not yet supported by this script, but patches welcome (it's not too |
20 useful as the resulting zip can't be redistributed, and most will presumably | 20 useful as the resulting zip can't be redistributed, and most will presumably |
21 have a Pro license anyway). | 21 have a Pro license anyway). |
22 """ | 22 """ |
23 | 23 |
| 24 import glob |
24 import optparse | 25 import optparse |
25 import os | 26 import os |
26 import platform | 27 import platform |
27 import shutil | 28 import shutil |
28 import sys | 29 import sys |
29 import tempfile | 30 import tempfile |
30 import zipfile | 31 import zipfile |
31 | 32 |
32 import get_toolchain_if_necessary | 33 import get_toolchain_if_necessary |
33 | 34 |
(...skipping 26 matching lines...) Expand all Loading... |
60 ('VC/redist/Debug_NonRedist/x86/Microsoft.VC120.DebugCRT', 'sys32'), | 61 ('VC/redist/Debug_NonRedist/x86/Microsoft.VC120.DebugCRT', 'sys32'), |
61 ('VC/redist/Debug_NonRedist/x86/Microsoft.VC120.DebugMFC', 'sys32'), | 62 ('VC/redist/Debug_NonRedist/x86/Microsoft.VC120.DebugMFC', 'sys32'), |
62 ('VC/redist/x64/Microsoft.VC120.CRT', 'sys64'), | 63 ('VC/redist/x64/Microsoft.VC120.CRT', 'sys64'), |
63 ('VC/redist/x64/Microsoft.VC120.MFC', 'sys64'), | 64 ('VC/redist/x64/Microsoft.VC120.MFC', 'sys64'), |
64 ('VC/redist/Debug_NonRedist/x64/Microsoft.VC120.DebugCRT', 'sys64'), | 65 ('VC/redist/Debug_NonRedist/x64/Microsoft.VC120.DebugCRT', 'sys64'), |
65 ('VC/redist/Debug_NonRedist/x64/Microsoft.VC120.DebugMFC', 'sys64'), | 66 ('VC/redist/Debug_NonRedist/x64/Microsoft.VC120.DebugMFC', 'sys64'), |
66 ] | 67 ] |
67 elif VS_VERSION == '2015': | 68 elif VS_VERSION == '2015': |
68 paths += [ | 69 paths += [ |
69 ('VC/redist/x86/Microsoft.VC140.CRT', 'sys32'), | 70 ('VC/redist/x86/Microsoft.VC140.CRT', 'sys32'), |
| 71 ('VC/redist/x86/Microsoft.VC140.CRT', 'win_sdk/bin/x86'), |
70 ('VC/redist/x86/Microsoft.VC140.MFC', 'sys32'), | 72 ('VC/redist/x86/Microsoft.VC140.MFC', 'sys32'), |
71 ('VC/redist/debug_nonredist/x86/Microsoft.VC140.DebugCRT', 'sys32'), | 73 ('VC/redist/debug_nonredist/x86/Microsoft.VC140.DebugCRT', 'sys32'), |
72 ('VC/redist/debug_nonredist/x86/Microsoft.VC140.DebugMFC', 'sys32'), | 74 ('VC/redist/debug_nonredist/x86/Microsoft.VC140.DebugMFC', 'sys32'), |
73 ('VC/redist/x64/Microsoft.VC140.CRT', 'sys64'), | 75 ('VC/redist/x64/Microsoft.VC140.CRT', 'sys64'), |
| 76 ('VC/redist/x64/Microsoft.VC140.CRT', 'VC/bin/amd64_x86'), |
| 77 ('VC/redist/x64/Microsoft.VC140.CRT', 'VC/bin/amd64'), |
| 78 ('VC/redist/x64/Microsoft.VC140.CRT', 'win_sdk/bin/x64'), |
74 ('VC/redist/x64/Microsoft.VC140.MFC', 'sys64'), | 79 ('VC/redist/x64/Microsoft.VC140.MFC', 'sys64'), |
75 ('VC/redist/debug_nonredist/x64/Microsoft.VC140.DebugCRT', 'sys64'), | 80 ('VC/redist/debug_nonredist/x64/Microsoft.VC140.DebugCRT', 'sys64'), |
76 ('VC/redist/debug_nonredist/x64/Microsoft.VC140.DebugMFC', 'sys64'), | 81 ('VC/redist/debug_nonredist/x64/Microsoft.VC140.DebugMFC', 'sys64'), |
77 ] | 82 ] |
78 else: | 83 else: |
79 raise ValueError('VS_VERSION %s' % VS_VERSION) | 84 raise ValueError('VS_VERSION %s' % VS_VERSION) |
80 | 85 |
81 if VS_VERSION == '2013': | 86 if VS_VERSION == '2013': |
82 vs_path = r'C:\Program Files (x86)\Microsoft Visual Studio 12.0' | 87 vs_path = r'C:\Program Files (x86)\Microsoft Visual Studio 12.0' |
83 else: | 88 else: |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
144 'Windows6.1-KB2999226-x64.msu', | 149 'Windows6.1-KB2999226-x64.msu', |
145 'Windows8-RT-KB2999226-x64.msu', | 150 'Windows8-RT-KB2999226-x64.msu', |
146 'Windows8.1-KB2999226-x64.msu', | 151 'Windows8.1-KB2999226-x64.msu', |
147 ] | 152 ] |
148 | 153 |
149 for installer in universal_runtime_installers: | 154 for installer in universal_runtime_installers: |
150 result.append((os.path.join(os.environ['userprofile'], 'downloads', | 155 result.append((os.path.join(os.environ['userprofile'], 'downloads', |
151 installer), | 156 installer), |
152 os.path.join('installers', installer))) | 157 os.path.join('installers', installer))) |
153 | 158 |
154 system_crt_files = [ | 159 if VS_VERSION == '2015': |
155 # Needed to let debug binaries run. | 160 # Copy the x86 ucrt DLLs to all directories with 32-bit binaries that are |
156 'ucrtbased.dll', | 161 # added to the path by SetEnv.cmd, and to sys32. |
157 ] | 162 ucrt_paths = glob.glob(os.path.join(sdk_path, r'redist\ucrt\dlls\x86\*')) |
158 bitness = platform.architecture()[0] | 163 for ucrt_path in ucrt_paths: |
159 # When running 64-bit python the x64 DLLs will be in System32 | 164 ucrt_file = os.path.split(ucrt_path)[1] |
160 x64_path = 'System32' if bitness == '64bit' else 'Sysnative' | 165 for dest_dir in [ r'win_sdk\bin\x86', 'sys32' ]: |
161 x64_path = os.path.join(r'C:\Windows', x64_path) | 166 result.append((ucrt_path, os.path.join(dest_dir, ucrt_file))) |
162 for system_crt_file in system_crt_files: | 167 |
163 result.append((os.path.join(r'C:\Windows\SysWOW64', system_crt_file), | 168 # Copy the x64 ucrt DLLs to all directories with 64-bit binaries that are |
164 os.path.join('sys32', system_crt_file))) | 169 # added to the path by SetEnv.cmd, and to sys64. |
165 result.append((os.path.join(x64_path, system_crt_file), | 170 ucrt_paths = glob.glob(os.path.join(sdk_path, r'redist\ucrt\dlls\x64\*')) |
166 os.path.join('sys64', system_crt_file))) | 171 for ucrt_path in ucrt_paths: |
| 172 ucrt_file = os.path.split(ucrt_path)[1] |
| 173 for dest_dir in [ r'VC\bin\amd64_x86', r'VC\bin\amd64', |
| 174 r'win_sdk\bin\x64', 'sys64']: |
| 175 result.append((ucrt_path, os.path.join(dest_dir, ucrt_file))) |
| 176 |
| 177 system_crt_files = [ |
| 178 # Needed to let debug binaries run. |
| 179 'ucrtbased.dll', |
| 180 ] |
| 181 bitness = platform.architecture()[0] |
| 182 # When running 64-bit python the x64 DLLs will be in System32 |
| 183 x64_path = 'System32' if bitness == '64bit' else 'Sysnative' |
| 184 x64_path = os.path.join(r'C:\Windows', x64_path) |
| 185 for system_crt_file in system_crt_files: |
| 186 result.append((os.path.join(r'C:\Windows\SysWOW64', system_crt_file), |
| 187 os.path.join('sys32', system_crt_file))) |
| 188 result.append((os.path.join(x64_path, system_crt_file), |
| 189 os.path.join('sys64', system_crt_file))) |
167 | 190 |
168 # Generically drop all arm stuff that we don't need, and | 191 # Generically drop all arm stuff that we don't need, and |
169 # drop .msi files because we don't need installers. | 192 # drop .msi files because we don't need installers. |
170 return [(f, t) for f, t in result if 'arm\\' not in f.lower() and | 193 return [(f, t) for f, t in result if 'arm\\' not in f.lower() and |
171 'arm64\\' not in f.lower() and | 194 'arm64\\' not in f.lower() and |
172 not f.lower().endswith('.msi')] | 195 not f.lower().endswith('.msi')] |
173 | 196 |
174 | 197 |
175 def GenerateSetEnvCmd(target_dir): | 198 def GenerateSetEnvCmd(target_dir): |
176 """Generate a batch file that gyp expects to exist to set up the compiler | 199 """Generate a batch file that gyp expects to exist to set up the compiler |
177 environment. | 200 environment. |
178 | 201 |
179 This is normally generated by a full install of the SDK, but we | 202 This is normally generated by a full install of the SDK, but we |
180 do it here manually since we do not do a full install.""" | 203 do it here manually since we do not do a full install.""" |
181 with open(os.path.join( | 204 with open(os.path.join( |
182 target_dir, r'win_sdk\bin\SetEnv.cmd'), 'w') as f: | 205 target_dir, r'win_sdk\bin\SetEnv.cmd'), 'w') as f: |
183 f.write('@echo off\n' | 206 f.write('@echo off\n' |
184 ':: Generated by win_toolchain\\package_from_installed.py.\n' | 207 ':: Generated by win_toolchain\\package_from_installed.py.\n' |
185 # Common to x86 and x64 | 208 # Common to x86 and x64 |
186 'set VSINSTALLDIR=%~dp0..\\..\\\n' | 209 'set VSINSTALLDIR=%~dp0..\\..\\\n' |
187 'set VCINSTALLDIR=%~dp0..\\..\\VC\\\n' | 210 'set VCINSTALLDIR=%~dp0..\\..\\VC\\\n' |
188 'set PATH=%~dp0..\\..\\Common7\\IDE;%PATH%\n' | |
189 'set INCLUDE=%~dp0..\\..\\win_sdk\\Include\\WINVERSION\\um;' | 211 'set INCLUDE=%~dp0..\\..\\win_sdk\\Include\\WINVERSION\\um;' |
190 '%~dp0..\\..\\win_sdk\\Include\\WINVERSION\\shared;' | 212 '%~dp0..\\..\\win_sdk\\Include\\WINVERSION\\shared;' |
191 '%~dp0..\\..\\win_sdk\\Include\\WINVERSION\\winrt;'.replace( | 213 '%~dp0..\\..\\win_sdk\\Include\\WINVERSION\\winrt;'.replace( |
192 'WINVERSION', WIN_VERSION)) | 214 'WINVERSION', WIN_VERSION)) |
193 if VS_VERSION == '2015': | 215 if VS_VERSION == '2015': |
194 f.write('%~dp0..\\..\\win_sdk\\Include\\WINVERSION\\ucrt;'.replace( | 216 f.write('%~dp0..\\..\\win_sdk\\Include\\WINVERSION\\ucrt;'.replace( |
195 'WINVERSION', WIN_VERSION)) | 217 'WINVERSION', WIN_VERSION)) |
196 f.write('%~dp0..\\..\\VC\\include;' | 218 f.write('%~dp0..\\..\\VC\\include;' |
197 '%~dp0..\\..\\VC\\atlmfc\\include\n') | 219 '%~dp0..\\..\\VC\\atlmfc\\include\n') |
198 | 220 |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
321 sys.stdout.write('\rWrote to %s.%s\n' % (output, ' '*50)) | 343 sys.stdout.write('\rWrote to %s.%s\n' % (output, ' '*50)) |
322 sys.stdout.flush() | 344 sys.stdout.flush() |
323 | 345 |
324 RenameToSha1(output) | 346 RenameToSha1(output) |
325 | 347 |
326 return 0 | 348 return 0 |
327 | 349 |
328 | 350 |
329 if __name__ == '__main__': | 351 if __name__ == '__main__': |
330 sys.exit(main()) | 352 sys.exit(main()) |
OLD | NEW |