Index: win_toolchain/toolchain2013.py |
diff --git a/win_toolchain/toolchain2013.py b/win_toolchain/toolchain2013.py |
index be57ce9b821b755dee1f300d808f76c96c604300..f1be737ba37a0ad60c2c8e86e5e0abc47abe93ef 100755 |
--- a/win_toolchain/toolchain2013.py |
+++ b/win_toolchain/toolchain2013.py |
@@ -119,15 +119,59 @@ def DownloadMainIso(url): |
return target_path |
-def GetSourceImage(local_dir, pro): |
+def DownloadSDK8(): |
+ """Download the Win8 SDK. |
M-A Ruel
2014/01/16 20:38:04
Downloads
scottmg
2014/01/16 20:42:42
Done.
|
+ |
+ This one is slightly different than the simpler direct downloads. There is |
+ no .ISO distribution for the Windows 8 SDK. Rather, a tool is provided that |
+ is a download manager. This is used to download the various .msi files to a |
+ target location. Unfortunately, this tool requires elevation for no obvious |
+ reason even when only downloading, so this function will trigger a UAC |
+ elevation if the script is not run from an elevated prompt. This is mostly |
+ grabbed for windbg and cdb (See http://crbug.com/321187) as most of the SDK |
+ is in VS2013, however we need a couple D3D related things from the SDK. |
+ """ |
+ # Use the long path name here because because 8dot3 names don't seem to work. |
+ sdk_temp_dir = GetLongPathName(TempDir()) |
+ target_path = os.path.join(sdk_temp_dir, 'sdksetup.exe') |
+ standalone_path = os.path.join(sdk_temp_dir, 'Standalone') |
+ Download( |
+ ('http://download.microsoft.com/download/' |
+ 'F/1/3/F1300C9C-A120-4341-90DF-8A52509B23AC/standalonesdk/sdksetup.exe'), |
+ target_path) |
+ sys.stdout.write( |
+ 'Running sdksetup.exe to download Win8 SDK (may request elevation)...\n') |
+ count = 0 |
+ while count < 5: |
+ rc = os.system(target_path + ' /quiet ' |
+ '/features OptionId.WindowsDesktopDebuggers ' |
+ '/layout ' + standalone_path) |
+ if rc == 0: |
+ return standalone_path |
+ count += 1 |
+ sys.stdout.write('Windows 8 SDK failed to download, retrying.\n') |
+ raise SystemExit("After multiple retries, couldn't download Win8 SDK") |
+ |
+ |
+class SourceImages(object): |
+ def __init__(self, vs_path, sdk8_path): |
+ self.vs_path = vs_path |
+ self.sdk8_path = sdk8_path |
+ |
+ |
+def GetSourceImages(local_dir, pro): |
url = GetIsoUrl(pro) |
if local_dir: |
- return os.path.join(local_dir, os.path.basename(url)) |
+ return SourceImages(os.path.join(local_dir, os.path.basename(url)), |
+ os.path.join(local_dir, 'Standalone')) |
else: |
- return DownloadMainIso(url) |
+ # 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) |
-def ExtractMsiList(iso_dir, packages): |
+def ExtractMsiList(root_dir, packages): |
"""Extracts the contents of a list of .msi files from an already extracted |
.iso file. |
@@ -136,7 +180,7 @@ def ExtractMsiList(iso_dir, packages): |
""" |
results = [] |
for (package, required) in packages: |
- path_to_package = os.path.join(iso_dir, 'packages', package) |
+ path_to_package = os.path.join(root_dir, package) |
if not os.path.exists(path_to_package) and not required: |
continue |
results.append(ExtractMsi(path_to_package)) |
@@ -144,7 +188,7 @@ def ExtractMsiList(iso_dir, packages): |
def ExtractComponents(image): |
- packages = [ |
+ vs_packages = [ |
(r'vcRuntimeAdditional_amd64\vc_runtimeAdditional_x64.msi', True), |
(r'vcRuntimeAdditional_x86\vc_runtimeAdditional_x86.msi', True), |
(r'vcRuntimeDebug_amd64\vc_runtimeDebug_x64.msi', True), |
@@ -166,8 +210,18 @@ def ExtractComponents(image): |
r'Windows Software Development Kit for Metro style Apps-x86_en-us.msi', |
True), |
] |
- extracted_iso = ExtractIso(image) |
- return ExtractMsiList(extracted_iso, packages) |
+ extracted_iso = ExtractIso(image.vs_path) |
+ result = ExtractMsiList(os.path.join(extracted_iso, 'packages'), vs_packages) |
+ |
+ sdk_packages = [ |
+ (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), |
+ ] |
+ result += ExtractMsiList(os.path.join(image.sdk8_path, 'Installers'), |
M-A Ruel
2014/01/16 20:38:04
use instead:
result.extend()
scottmg
2014/01/16 20:42:42
Done.
|
+ sdk_packages) |
+ |
+ return result |
def CopyToFinalLocation(extracted_dirs, target_dir): |
@@ -275,8 +329,8 @@ 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')) |
- image = GetSourceImage(options.local, not options.express) |
- extracted = ExtractComponents(image) |
+ images = GetSourceImages(options.local, not options.express) |
+ extracted = ExtractComponents(images) |
CopyToFinalLocation(extracted, target_dir) |
GenerateSetEnvCmd(target_dir, not options.express) |