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 # Copy the x64 ucrt DLLs to all directories with 64-bit binaries that are |
scottmg
2016/02/03 04:12:00
nit; add a blank line before this comment
brucedawson
2016/02/03 06:32:15
Done.
| |
163 result.append((os.path.join(r'C:\Windows\SysWOW64', system_crt_file), | 168 # added to the path by SetEnv.cmd, and to sys64. |
164 os.path.join('sys32', system_crt_file))) | 169 ucrt_paths = glob.glob(os.path.join(sdk_path, r'redist\ucrt\dlls\x64\*')) |
165 result.append((os.path.join(x64_path, system_crt_file), | 170 for ucrt_path in ucrt_paths: |
166 os.path.join('sys64', system_crt_file))) | 171 ucrt_file = os.path.split(ucrt_path)[1] |
172 for dest_dir in [ r'VC\bin\amd64_x86', r'VC\bin\amd64', | |
173 r'win_sdk\bin\x64', 'sys64']: | |
174 result.append((ucrt_path, os.path.join(dest_dir, ucrt_file))) | |
175 | |
176 system_crt_files = [ | |
177 # Needed to let debug binaries run. | |
178 'ucrtbased.dll', | |
179 ] | |
180 bitness = platform.architecture()[0] | |
181 # When running 64-bit python the x64 DLLs will be in System32 | |
182 x64_path = 'System32' if bitness == '64bit' else 'Sysnative' | |
183 x64_path = os.path.join(r'C:\Windows', x64_path) | |
184 for system_crt_file in system_crt_files: | |
185 result.append((os.path.join(r'C:\Windows\SysWOW64', system_crt_file), | |
186 os.path.join('sys32', system_crt_file))) | |
187 result.append((os.path.join(x64_path, system_crt_file), | |
188 os.path.join('sys64', system_crt_file))) | |
167 | 189 |
168 # Generically drop all arm stuff that we don't need, and | 190 # Generically drop all arm stuff that we don't need, and |
169 # drop .msi files because we don't need installers. | 191 # 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 | 192 return [(f, t) for f, t in result if 'arm\\' not in f.lower() and |
171 'arm64\\' not in f.lower() and | 193 'arm64\\' not in f.lower() and |
172 not f.lower().endswith('.msi')] | 194 not f.lower().endswith('.msi')] |
173 | 195 |
174 | 196 |
175 def GenerateSetEnvCmd(target_dir): | 197 def GenerateSetEnvCmd(target_dir): |
176 """Generate a batch file that gyp expects to exist to set up the compiler | 198 """Generate a batch file that gyp expects to exist to set up the compiler |
177 environment. | 199 environment. |
178 | 200 |
179 This is normally generated by a full install of the SDK, but we | 201 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.""" | 202 do it here manually since we do not do a full install.""" |
181 with open(os.path.join( | 203 with open(os.path.join( |
182 target_dir, r'win_sdk\bin\SetEnv.cmd'), 'w') as f: | 204 target_dir, r'win_sdk\bin\SetEnv.cmd'), 'w') as f: |
183 f.write('@echo off\n' | 205 f.write('@echo off\n' |
184 ':: Generated by win_toolchain\\package_from_installed.py.\n' | 206 ':: Generated by win_toolchain\\package_from_installed.py.\n' |
185 # Common to x86 and x64 | 207 # Common to x86 and x64 |
186 'set VSINSTALLDIR=%~dp0..\\..\\\n' | 208 'set VSINSTALLDIR=%~dp0..\\..\\\n' |
187 'set VCINSTALLDIR=%~dp0..\\..\\VC\\\n' | 209 'set VCINSTALLDIR=%~dp0..\\..\\VC\\\n' |
188 'set PATH=%~dp0..\\..\\Common7\\IDE;%PATH%\n' | |
189 'set INCLUDE=%~dp0..\\..\\win_sdk\\Include\\WINVERSION\\um;' | 210 'set INCLUDE=%~dp0..\\..\\win_sdk\\Include\\WINVERSION\\um;' |
190 '%~dp0..\\..\\win_sdk\\Include\\WINVERSION\\shared;' | 211 '%~dp0..\\..\\win_sdk\\Include\\WINVERSION\\shared;' |
191 '%~dp0..\\..\\win_sdk\\Include\\WINVERSION\\winrt;'.replace( | 212 '%~dp0..\\..\\win_sdk\\Include\\WINVERSION\\winrt;'.replace( |
192 'WINVERSION', WIN_VERSION)) | 213 'WINVERSION', WIN_VERSION)) |
193 if VS_VERSION == '2015': | 214 if VS_VERSION == '2015': |
194 f.write('%~dp0..\\..\\win_sdk\\Include\\WINVERSION\\ucrt;'.replace( | 215 f.write('%~dp0..\\..\\win_sdk\\Include\\WINVERSION\\ucrt;'.replace( |
195 'WINVERSION', WIN_VERSION)) | 216 'WINVERSION', WIN_VERSION)) |
196 f.write('%~dp0..\\..\\VC\\include;' | 217 f.write('%~dp0..\\..\\VC\\include;' |
197 '%~dp0..\\..\\VC\\atlmfc\\include\n') | 218 '%~dp0..\\..\\VC\\atlmfc\\include\n') |
198 | 219 |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
321 sys.stdout.write('\rWrote to %s.%s\n' % (output, ' '*50)) | 342 sys.stdout.write('\rWrote to %s.%s\n' % (output, ' '*50)) |
322 sys.stdout.flush() | 343 sys.stdout.flush() |
323 | 344 |
324 RenameToSha1(output) | 345 RenameToSha1(output) |
325 | 346 |
326 return 0 | 347 return 0 |
327 | 348 |
328 | 349 |
329 if __name__ == '__main__': | 350 if __name__ == '__main__': |
330 sys.exit(main()) | 351 sys.exit(main()) |
OLD | NEW |