Index: win_toolchain/toolchain2013.py |
diff --git a/win_toolchain/toolchain2013.py b/win_toolchain/toolchain2013.py |
index 47963f094a052ec51a7ad0f6abc3f12b4a488671..cd91175086e81d54a9de4edad8c069432dc59fb1 100755 |
--- a/win_toolchain/toolchain2013.py |
+++ b/win_toolchain/toolchain2013.py |
@@ -17,6 +17,9 @@ import urllib2 |
BASEDIR = os.path.dirname(os.path.abspath(__file__)) |
+WDK_ISO_URL = ( |
+ 'http://download.microsoft.com/download/' |
+ '4/A/2/4A25C7D5-EFBE-4182-B6A9-AE6850409A78/GRMWDK_EN_7600_1.ISO') |
g_temp_dirs = [] |
@@ -57,8 +60,8 @@ def DeleteAllTempDirs(): |
g_temp_dirs = [] |
-def GetIsoUrl(pro): |
- """Gets the .iso URL. |
+def GetMainIsoUrl(pro): |
+ """Gets the main .iso URL. |
If |pro| is False, downloads the Express edition. If |CHROME_HEADLESS| is |
set in the environment, then we assume we're on an internal bot, and download |
@@ -151,6 +154,7 @@ def DownloadSDK8(): |
while count < 5: |
rc = os.system(target_path + ' /quiet ' |
'/features OptionId.WindowsDesktopDebuggers ' |
+ 'OptionId.WindowsDesktopSoftwareDevelopmentKit ' |
'/layout ' + standalone_path) |
if rc == 0: |
return standalone_path |
@@ -159,6 +163,13 @@ def DownloadSDK8(): |
sys.exit('After multiple retries, couldn\'t download Win8 SDK') |
+def DownloadWDKIso(): |
+ wdk_temp_dir = TempDir() |
+ target_path = os.path.join(wdk_temp_dir, 'GRMWDK_EN_7600_1.ISO') |
+ Download(WDK_ISO_URL, target_path) |
+ return target_path |
+ |
+ |
def DownloadUsingGsutil(filename): |
"""Downloads the given file from Google Storage chrome-wintoolchain bucket.""" |
temp_dir = TempDir() |
@@ -185,23 +196,36 @@ def GetSDKInternal(): |
class SourceImages(object): |
- def __init__(self, vs_path, sdk8_path): |
+ """Local paths for components. |wdk_path| may be None if it's unnecessary for |
+ the given configuration.""" |
+ def __init__(self, vs_path, sdk8_path, wdk_path): |
self.vs_path = vs_path |
self.sdk8_path = sdk8_path |
+ self.wdk_path = wdk_path |
-def GetSourceImages(local_dir, pro): |
- url = GetIsoUrl(pro) |
- if os.environ.get('CHROME_HEADLESS'): |
- return SourceImages(GetVSInternal(), GetSDKInternal()) |
+def GetSourceImages(local_dir, pro, bot_mode): |
+ """Downloads the various sources that we need. |
+ |
+ Of note: Because Express does not include ATL, there's an additional download |
+ of the 7.1 WDK which is the latest publically accessible source for ATL. When |
+ |pro| this is not necessary (and CHROME_HEADLESS always implies Pro). |
+ """ |
+ url = GetMainIsoUrl(pro) |
+ if bot_mode: |
+ return SourceImages(GetVSInternal(), GetSDKInternal(), wdk_path=None) |
elif local_dir: |
+ wdk_path = (os.path.join(local_dir, os.path.basename(WDK_ISO_URL)) |
+ if not pro else None) |
return SourceImages(os.path.join(local_dir, os.path.basename(url)), |
- os.path.join(local_dir, 'Standalone')) |
+ os.path.join(local_dir, 'Standalone'), |
+ wdk_path=wdk_path) |
else: |
# Note that we do the SDK first, as it might cause an elevation prompt. |
sdk8_path = DownloadSDK8() |
vs_path = DownloadMainIso(url) |
- return SourceImages(vs_path, sdk8_path) |
+ wdk_path = DownloadWDKIso() if not pro else None |
+ return SourceImages(vs_path, sdk8_path, wdk_path=wdk_path) |
def ExtractMsiList(root_dir, packages): |
@@ -238,10 +262,6 @@ def ExtractComponents(image): |
(r'vc_libraryDesktop\x64\vc_LibraryDesktopX64.msi', True), |
(r'vc_libraryDesktop\x86\vc_LibraryDesktopX86.msi', True), |
(r'vc_libraryextended\vc_libraryextended.msi', False), |
- (r'Windows_SDK\Windows Software Development Kit-x86_en-us.msi', True), |
- ('Windows_SDK\\' |
- r'Windows Software Development Kit for Metro style Apps-x86_en-us.msi', |
- True), |
] |
extracted_iso = ExtractIso(image.vs_path) |
result = ExtractMsiList(os.path.join(extracted_iso, 'packages'), vs_packages) |
@@ -250,10 +270,25 @@ def ExtractComponents(image): |
(r'X86 Debuggers And Tools-x86_en-us.msi', True), |
(r'X64 Debuggers And Tools-x64_en-us.msi', True), |
(r'SDK Debuggers-x86_en-us.msi', True), |
+ (r'Windows Software Development Kit-x86_en-us.msi', True), |
+ (r'Windows Software Development Kit for Metro style Apps-x86_en-us.msi', |
+ True), |
] |
result.extend(ExtractMsiList(os.path.join(image.sdk8_path, 'Installers'), |
sdk_packages)) |
+ if image.wdk_path: |
+ # This image will only be set when using Express, when we need the WDK |
+ # headers and libs to supplement Express with ATL. |
+ wdk_packages = [ |
+ (r'headers.msi', True), |
+ (r'libs_x86fre.msi', True), |
+ (r'libs_x64fre.msi', True), |
+ ] |
+ extracted_iso = ExtractIso(image.wdk_path) |
+ result.extend(ExtractMsiList(os.path.join(extracted_iso, 'WDK'), |
+ wdk_packages)) |
+ |
return result |
@@ -264,6 +299,7 @@ def CopyToFinalLocation(extracted_dirs, target_dir): |
'System64\\': 'sys64\\', |
'System\\': 'sys32\\', |
'Windows Kits\\8.0\\': 'win8sdk\\', |
+ 'WinDDK\\7600.16385.win7_wdk.100208-1538\\': 'wdk\\', |
} |
matches = [] |
for extracted_dir in extracted_dirs: |
@@ -327,6 +363,9 @@ def GenerateSetEnvCmd(target_dir, pro): |
f.write(':x64\n' |
'set PATH=%~dp0..\\..\\win8sdk\\bin\\x64;' |
'%~dp0..\\..\\VC\\bin\\x86_amd64;' |
+ # Needed for mspdb120.dll. Must be after above though, so |
+ # that cl.exe is the x86_amd64 one. |
+ '%~dp0..\\..\\VC\\bin;' |
'%PATH%\n') |
else: |
# x64 native. |
@@ -351,6 +390,10 @@ def main(): |
help='use downloaded files from DIR') |
parser.add_option('--express', |
help='use VS Express instead of Pro', action='store_true') |
+ parser.add_option('--bot-mode', |
+ help='Use internal servers to pull isos', |
+ default=bool(int(os.environ.get('CHROME_HEADLESS', 0))), |
+ action='store_true') |
options, _ = parser.parse_args() |
try: |
target_dir = os.path.abspath(options.targetdir) |
@@ -362,11 +405,14 @@ def main(): |
# codec dll very well, so this is the simplest way to make sure it runs |
# correctly, as we don't otherwise care about working directory. |
os.chdir(os.path.join(BASEDIR, '7z')) |
- images = GetSourceImages(options.local, not options.express) |
+ images = GetSourceImages( |
+ options.local, not options.express, options.bot_mode) |
extracted = ExtractComponents(images) |
CopyToFinalLocation(extracted, target_dir) |
GenerateSetEnvCmd(target_dir, not options.express) |
+ with open(os.path.join(target_dir, '.version'), 'w') as f: |
+ f.write('express' if options.express else 'pro') |
finally: |
if options.clean: |
DeleteAllTempDirs() |