Chromium Code Reviews| 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) |