Index: tools/win/toolchain/toolchain.py |
diff --git a/tools/win/toolchain/toolchain.py b/tools/win/toolchain/toolchain.py |
deleted file mode 100644 |
index 3f3179c65fca996db4f3418f188fcfca9e3567ac..0000000000000000000000000000000000000000 |
--- a/tools/win/toolchain/toolchain.py |
+++ /dev/null |
@@ -1,714 +0,0 @@ |
-# Copyright 2012 The Chromium Authors. All rights reserved. |
-# Use of this source code is governed by a BSD-style license that can be |
-# found in the LICENSE file. |
- |
-# Extracts a Windows toolchain suitable for building Chrome from various |
-# downloadable pieces. |
- |
- |
-import ctypes |
-from optparse import OptionParser |
-import os |
-import shutil |
-import subprocess |
-import sys |
-import tempfile |
-import urllib2 |
- |
- |
-g_temp_dirs = [] |
- |
- |
-def GetLongPathName(path): |
- """Converts any 8dot3 names in the path to the full name.""" |
- buf = ctypes.create_unicode_buffer(260) |
- size = ctypes.windll.kernel32.GetLongPathNameW(unicode(path), buf, 260) |
- if (size > 260): |
- raise SystemExit('Long form of path longer than 260 chars: %s' % path) |
- return buf.value |
- |
- |
-def RunOrDie(command): |
- rc = subprocess.call(command, shell=True) |
- if rc != 0: |
- raise SystemExit('%s failed.' % command) |
- |
- |
-def TempDir(): |
- """Generate a temporary directory (for downloading or extracting to) and keep |
- track of the directory that's created for cleaning up later.""" |
- global g_temp_dirs |
- temp = tempfile.mkdtemp() |
- g_temp_dirs.append(temp) |
- return temp |
- |
- |
-def DeleteAllTempDirs(): |
- """Remove all temporary directories created by |TempDir()|.""" |
- global g_temp_dirs |
- if g_temp_dirs: |
- sys.stdout.write('Cleaning up temporaries...\n') |
- for temp in g_temp_dirs: |
- # shutil.rmtree errors out on read only attributes. |
- RunOrDie('rmdir /s/q "%s"' % temp) |
- g_temp_dirs = [] |
- |
- |
-def Download(url, local_path): |
- """Download a large-ish binary file and print some status information while |
- doing so.""" |
- sys.stdout.write('Downloading %s...\n' % url) |
- req = urllib2.urlopen(url) |
- content_length = int(req.headers.get('Content-Length', 0)) |
- bytes_read = 0 |
- terminator = '\r' if sys.stdout.isatty() else '\n' |
- with open(local_path, 'wb') as file: |
- while True: |
- chunk = req.read(1024 * 1024) |
- if not chunk: |
- break |
- bytes_read += len(chunk) |
- file.write(chunk) |
- sys.stdout.write('... %d/%d%s' % (bytes_read, content_length, terminator)) |
- sys.stdout.flush() |
- sys.stdout.write('\n') |
- if content_length and content_length != bytes_read: |
- raise SystemExit('Got incorrect number of bytes downloading %s' % url) |
- |
- |
-def DownloadSDK71Iso(): |
- sdk7_temp_dir = TempDir() |
- target_path = os.path.join(sdk7_temp_dir, 'GRMSDKX_EN_DVD.iso') |
- Download( |
- ('http://download.microsoft.com/download/' |
- 'F/1/0/F10113F5-B750-4969-A255-274341AC6BCE/GRMSDKX_EN_DVD.iso'), |
- target_path) |
- return target_path |
- |
- |
-def DownloadWDKIso(): |
- wdk_temp_dir = TempDir() |
- target_path = os.path.join(wdk_temp_dir, 'GRMWDK_EN_7600_1.ISO') |
- Download( |
- ('http://download.microsoft.com/download/' |
- '4/A/2/4A25C7D5-EFBE-4182-B6A9-AE6850409A78/GRMWDK_EN_7600_1.ISO'), |
- target_path) |
- return target_path |
- |
- |
-def DownloadSDKUpdate(): |
- sdk_update_temp_dir = TempDir() |
- target_path = os.path.join(sdk_update_temp_dir, 'VC-Compiler-KB2519277.exe') |
- Download( |
- ('http://download.microsoft.com/download/' |
- '7/5/0/75040801-126C-4591-BCE4-4CD1FD1499AA/VC-Compiler-KB2519277.exe'), |
- target_path) |
- return target_path |
- |
- |
-def DownloadDirectXSDK(): |
- dxsdk_temp_dir = TempDir() |
- target_path = os.path.join(dxsdk_temp_dir, 'DXSDK_Jun10.exe') |
- Download( |
- ('http://download.microsoft.com/download/' |
- 'A/E/7/AE743F1F-632B-4809-87A9-AA1BB3458E31/DXSDK_Jun10.exe'), |
- target_path) |
- return target_path |
- |
- |
-def DownloadVS2012ExIso(): |
- ex_temp_dir = TempDir() |
- target_path = os.path.join(ex_temp_dir, 'VS2012_WDX_ENU.iso') |
- Download( |
- ('http://download.microsoft.com/download/' |
- '1/F/5/1F519CC5-0B90-4EA3-8159-33BFB97EF4D9/VS2012_WDX_ENU.iso'), |
- target_path) |
- return target_path |
- |
- |
-def DownloadSDK8(): |
- """Download the Win8 SDK. This one is slightly different than the simple |
- ones above. 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.""" |
- # 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 = subprocess.call([target_path, '/quiet', '/features', |
- 'OptionId.WindowsDesktopSoftwareDevelopmentKit', |
- '/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") |
- |
- |
-def DownloadVS2012Update3(): |
- """Download Update3 to VS2012. See notes in DownloadSDK8.""" |
- update3_dir = TempDir() |
- target_path = os.path.join(update3_dir, 'VS2012.3.iso') |
- Download( |
- ('http://download.microsoft.com/download/' |
- 'D/4/8/D48D1AC2-A297-4C9E-A9D0-A218E6609F06/VS2012.3.iso'), |
- target_path) |
- return target_path |
- |
- |
-class SourceImages2010(object): |
- def __init__(self, sdk8_path, wdk_iso, sdk7_update, sdk7_path, dxsdk_path): |
- self.sdk8_path = sdk8_path |
- self.wdk_iso = wdk_iso |
- self.sdk7_update = sdk7_update |
- self.sdk7_path = sdk7_path |
- self.dxsdk_path = dxsdk_path |
- |
- |
-def GetSourceImages2010(local_dir): |
- """Download all distribution archives for the components we need.""" |
- if local_dir: |
- return SourceImages2010( |
- sdk8_path=os.path.join(local_dir, 'Standalone'), |
- wdk_iso=os.path.join(local_dir, 'GRMWDK_EN_7600_1.ISO'), |
- sdk7_update=os.path.join(local_dir, 'VC-Compiler-KB2519277.exe'), |
- sdk7_path=os.path.join(local_dir, 'GRMSDKX_EN_DVD.ISO'), |
- dxsdk_path=os.path.join(local_dir, 'DXSDK_Jun10.exe')) |
- else: |
- # Note that we do the Win8 SDK first so that its silly UAC prompt |
- # happens before the user wanders off to get coffee. |
- sdk8_path = DownloadSDK8() |
- wdk_iso = DownloadWDKIso() |
- sdk7_update = DownloadSDKUpdate() |
- sdk7_path = DownloadSDK71Iso() |
- dxsdk_path = DownloadDirectXSDK() |
- return SourceImages2010( |
- sdk8_path, wdk_iso, sdk7_update, sdk7_path, dxsdk_path) |
- |
- |
-class SourceImages2012(): |
- def __init__(self, ex_path, update_path, wdk_iso): |
- self.ex_path = ex_path |
- self.update_path = update_path |
- self.wdk_iso = wdk_iso |
- |
- |
-def GetSourceImages2012(local_dir): |
- """Download all distribution archives for the components we need.""" |
- if local_dir: |
- return SourceImages2012( |
- ex_path=os.path.join(local_dir, 'VS2012_WDX_ENU.iso'), |
- update_path=os.path.join(local_dir, 'VS2012.3.iso'), |
- wdk_iso=os.path.join(local_dir, 'GRMWDK_EN_7600_1.ISO')) |
- else: |
- ex_path = DownloadVS2012ExIso() |
- wdk_iso = DownloadWDKIso() |
- update_path = DownloadVS2012Update3() |
- return SourceImages2012( |
- ex_path=ex_path, |
- update_path=update_path, |
- wdk_iso=wdk_iso) |
- |
- |
-def ExtractIso(iso_path): |
- """Use 7zip to extract the contents of the given .iso (or self-extracting |
- .exe).""" |
- target_path = TempDir() |
- sys.stdout.write('Extracting %s...\n' % iso_path) |
- sys.stdout.flush() |
- # TODO(scottmg): Do this (and exe) manually with python code. |
- # Note that at the beginning of main() we set the working directory to 7z's |
- # location. |
- RunOrDie('7z x "%s" -y "-o%s" >nul' % (iso_path, target_path)) |
- return target_path |
- |
- |
-ExtractExe = ExtractIso |
- |
- |
-def ExtractMsi(msi_path): |
- """Use msiexec to extract the contents of the given .msi file.""" |
- sys.stdout.write('Extracting %s...\n' % msi_path) |
- target_path = TempDir() |
- RunOrDie('msiexec /a "%s" /qn TARGETDIR="%s"' % (msi_path, target_path)) |
- return target_path |
- |
- |
-class ExtractedComponents2010(object): |
- def __init__(self, |
- vc_x86, vc_x64, |
- buildtools_x86, buildtools_x64, libs_x86, libs_x64, headers, |
- update_x86, update_x64, |
- sdk_path, metro_sdk_path, |
- dxsdk): |
- self.vc_x86 = vc_x86 |
- self.vc_x64 = vc_x64 |
- self.buildtools_x86 = buildtools_x86 |
- self.buildtools_x64 = buildtools_x64 |
- self.libs_x86 = libs_x86 |
- self.libs_x64 = libs_x64 |
- self.headers = headers |
- self.update_x86 = update_x86 |
- self.update_x64 = update_x64 |
- self.sdk_path = sdk_path |
- self.metro_sdk_path = metro_sdk_path |
- self.dxsdk = dxsdk |
- |
- |
-def ExtractComponents2010(images): |
- """Given the paths to the images, extract the required parts, and return |
- an object containing paths to all the pieces.""" |
- extracted_sdk7 = ExtractIso(images.sdk7_path) |
- extracted_vc_x86 = \ |
- ExtractMsi(os.path.join(extracted_sdk7, |
- r'Setup\vc_stdx86\vc_stdx86.msi')) |
- extracted_vc_x64 = \ |
- ExtractMsi(os.path.join(extracted_sdk7, |
- r'Setup\vc_stdamd64\vc_stdamd64.msi')) |
- |
- extracted_wdk = ExtractIso(images.wdk_iso) |
- extracted_buildtools_x86 = \ |
- ExtractMsi(os.path.join(extracted_wdk, r'WDK\buildtools_x86fre.msi')) |
- extracted_buildtools_x64 = \ |
- ExtractMsi(os.path.join(extracted_wdk, r'WDK\buildtools_x64fre.msi')) |
- extracted_libs_x86 = \ |
- ExtractMsi(os.path.join(extracted_wdk, r'WDK\libs_x86fre.msi')) |
- extracted_libs_x64 = \ |
- ExtractMsi(os.path.join(extracted_wdk, r'WDK\libs_x64fre.msi')) |
- extracted_headers = \ |
- ExtractMsi(os.path.join(extracted_wdk, r'WDK\headers.msi')) |
- |
- extracted_update = ExtractExe(images.sdk7_update) |
- extracted_update_x86 = \ |
- ExtractMsi(os.path.join(extracted_update, 'vc_stdx86.msi')) |
- extracted_update_x64 = \ |
- ExtractMsi(os.path.join(extracted_update, 'vc_stdamd64.msi')) |
- |
- sdk_msi_path = os.path.join( |
- images.sdk8_path, |
- r'Installers\Windows Software Development Kit-x86_en-us.msi') |
- extracted_sdk_path = ExtractMsi(sdk_msi_path) |
- |
- sdk_metro_msi_path = os.path.join( |
- images.sdk8_path, |
- 'Installers', |
- 'Windows Software Development Kit for Metro style Apps-x86_en-us.msi') |
- extracted_metro_sdk_path = ExtractMsi(sdk_metro_msi_path) |
- |
- extracted_dxsdk = ExtractExe(images.dxsdk_path) |
- |
- return ExtractedComponents2010( |
- vc_x86=extracted_vc_x86, |
- vc_x64=extracted_vc_x64, |
- buildtools_x86=extracted_buildtools_x86, |
- buildtools_x64=extracted_buildtools_x64, |
- libs_x86=extracted_libs_x86, |
- libs_x64=extracted_libs_x64, |
- headers=extracted_headers, |
- update_x86=extracted_update_x86, |
- update_x64=extracted_update_x64, |
- sdk_path=extracted_sdk_path, |
- metro_sdk_path=extracted_metro_sdk_path, |
- dxsdk=extracted_dxsdk) |
- |
- |
-class ExtractedComponents2012(object): |
- def __init__(self, |
- vc_x86, vc_x86_res, librarycore, |
- vc_x86_update, vc_x86_res_update, librarycore_update, |
- sdk_path, metro_sdk_path, |
- buildtools_x86, buildtools_x64, libs_x86, libs_x64, headers): |
- self.vc_x86 = vc_x86 |
- self.vc_x86_res = vc_x86_res |
- self.librarycore = librarycore |
- self.vc_x86_update = vc_x86_update |
- self.vc_x86_res_update = vc_x86_res_update |
- self.librarycore_update = librarycore_update |
- self.buildtools_x86 = buildtools_x86 |
- self.buildtools_x64 = buildtools_x64 |
- self.libs_x86 = libs_x86 |
- self.libs_x64 = libs_x64 |
- self.headers = headers |
- self.sdk_path = sdk_path |
- self.metro_sdk_path = metro_sdk_path |
- |
- |
-def ExtractComponents2012(images): |
- """Given the paths to the images, extract the required parts and return an |
- object containing paths to all the pieces.""" |
- extracted_ex = ExtractIso(images.ex_path) |
- |
- extracted_compilercore = ExtractMsi(os.path.join( |
- extracted_ex, |
- r'packages\vc_compilerCore86\vc_compilerCore86.msi')) |
- |
- extracted_compilercore_res = ExtractMsi(os.path.join( |
- extracted_ex, |
- r'packages\vc_compilerCore86res\vc_compilerCore86res.msi')) |
- |
- extracted_librarycore = ExtractMsi(os.path.join( |
- extracted_ex, |
- r'packages\vc_librarycore86\vc_librarycore86.msi')) |
- |
- extracted_wdk = ExtractIso(images.wdk_iso) |
- extracted_buildtools_x86 = \ |
- ExtractMsi(os.path.join(extracted_wdk, r'WDK\buildtools_x86fre.msi')) |
- extracted_buildtools_x64 = \ |
- ExtractMsi(os.path.join(extracted_wdk, r'WDK\buildtools_x64fre.msi')) |
- extracted_libs_x86 = \ |
- ExtractMsi(os.path.join(extracted_wdk, r'WDK\libs_x86fre.msi')) |
- extracted_libs_x64 = \ |
- ExtractMsi(os.path.join(extracted_wdk, r'WDK\libs_x64fre.msi')) |
- extracted_headers = \ |
- ExtractMsi(os.path.join(extracted_wdk, r'WDK\headers.msi')) |
- |
- sdk_msi_path = os.path.join( |
- extracted_ex, 'packages', 'Windows_SDK', |
- r'Windows Software Development Kit-x86_en-us.msi') |
- extracted_sdk_path = ExtractMsi(sdk_msi_path) |
- |
- sdk_metro_msi_path = os.path.join( |
- extracted_ex, 'packages', 'Windows_SDK', |
- 'Windows Software Development Kit for Metro style Apps-x86_en-us.msi') |
- extracted_metro_sdk_path = ExtractMsi(sdk_metro_msi_path) |
- |
- extracted_update = ExtractIso(images.update_path) |
- |
- extracted_compilercore_update = ExtractMsi(os.path.join( |
- extracted_update, r'packages\vc_compilercore86\vc_compilercore86.msi')) |
- |
- extracted_compilercore_res_update = ExtractMsi(os.path.join( |
- extracted_update, |
- r'packages\vc_compilercore86res\enu\vc_compilercore86res.msi')) |
- |
- extracted_librarycore_update = ExtractMsi(os.path.join( |
- extracted_update, r'packages\vc_librarycore86\vc_librarycore86.msi')) |
- |
- return ExtractedComponents2012( |
- vc_x86=extracted_compilercore, |
- vc_x86_res=extracted_compilercore_res, |
- librarycore=extracted_librarycore, |
- vc_x86_update=extracted_compilercore_update, |
- vc_x86_res_update=extracted_compilercore_res_update, |
- librarycore_update=extracted_compilercore_update, |
- sdk_path=extracted_sdk_path, |
- metro_sdk_path=extracted_metro_sdk_path, |
- buildtools_x86=extracted_buildtools_x86, |
- buildtools_x64=extracted_buildtools_x64, |
- libs_x86=extracted_libs_x86, |
- libs_x64=extracted_libs_x64, |
- headers=extracted_headers) |
- |
- |
-def PullFrom(list_of_path_pairs, source_root, target_dir): |
- """Each pair in |list_of_path_pairs| is (from, to). Join the 'from' with |
- |source_root| and the 'to' with |target_dir| and perform a recursive copy.""" |
- for source, destination in list_of_path_pairs: |
- full_source = os.path.join(source_root, source) |
- full_target = os.path.join(target_dir, destination) |
- rc = os.system('robocopy /s "%s" "%s" >nul' % (full_source, full_target)) |
- if (rc & 8) != 0 or (rc & 16) != 0: |
- # ref: http://ss64.com/nt/robocopy-exit.html |
- raise SystemExit("Couldn't copy %s to %s" % (full_source, full_target)) |
- |
- |
-def CopyToFinalLocation2010(extracted, target_dir): |
- """Copy all the directories we need to the target location.""" |
- sys.stdout.write('Pulling together required pieces...\n') |
- |
- # Note that order is important because some of the older ones are |
- # overwritten by updates. |
- from_sdk = [(r'Windows Kits\8.0', r'win8sdk')] |
- PullFrom(from_sdk, extracted.sdk_path, target_dir) |
- |
- from_metro_sdk = [(r'Windows Kits\8.0', r'win8sdk')] |
- PullFrom(from_sdk, extracted.metro_sdk_path, target_dir) |
- |
- from_buildtools_x86 = [ |
- (r'WinDDK\7600.16385.win7_wdk.100208-1538\bin\x86', r'WDK\bin'), |
- ] |
- PullFrom(from_buildtools_x86, extracted.buildtools_x86, target_dir) |
- |
- from_buildtools_x64 = [ |
- (r'WinDDK\7600.16385.win7_wdk.100208-1538\bin\amd64', r'WDK\bin'), |
- ] |
- PullFrom(from_buildtools_x64, extracted.buildtools_x64, target_dir) |
- |
- from_libs_x86 = [ |
- (r'WinDDK\7600.16385.win7_wdk.100208-1538\lib', r'WDK\lib'), |
- ] |
- PullFrom(from_libs_x86, extracted.libs_x86, target_dir) |
- |
- from_libs_x64 = [ |
- (r'WinDDK\7600.16385.win7_wdk.100208-1538\lib', r'WDK\lib'), |
- ] |
- PullFrom(from_libs_x64, extracted.libs_x64, target_dir) |
- |
- from_headers = [ |
- (r'WinDDK\7600.16385.win7_wdk.100208-1538\inc', r'WDK\inc'), |
- ] |
- PullFrom(from_headers, extracted.headers, target_dir) |
- |
- # The compiler update to get the SP1 compiler is a bit of a mess. See |
- # http://goo.gl/n1DeO. The summary is that update for the standalone compiler |
- # binary installs a broken set of headers. So, add an empty ammintrin.h since |
- # we don't actually need the contents of it (for Chromium). |
- |
- from_sdk7_x86 = [ |
- (r'Program Files\Microsoft Visual Studio 10.0', '.'), |
- (r'Win\System', r'VC\bin'), |
- ] |
- PullFrom(from_sdk7_x86, extracted.vc_x86, target_dir) |
- |
- from_sdk7_x64 =[ |
- (r'Program Files(64)\Microsoft Visual Studio 10.0', '.'), |
- (r'Win\System64', r'VC\bin\amd64'), |
- ] |
- PullFrom(from_sdk7_x64, extracted.vc_x64, target_dir) |
- |
- from_vcupdate_x86 = [ |
- (r'Program Files\Microsoft Visual Studio 10.0', '.'), |
- (r'Win\System', r'VC\bin'), |
- ] |
- PullFrom(from_vcupdate_x86, extracted.update_x86, target_dir) |
- |
- from_vcupdate_x64 = [ |
- (r'Program Files(64)\Microsoft Visual Studio 10.0', '.'), |
- (r'Win\System64', r'VC\bin\amd64'), |
- ] |
- PullFrom(from_vcupdate_x64, extracted.update_x64, target_dir) |
- |
- sys.stdout.write('Stubbing ammintrin.h...\n') |
- open(os.path.join(target_dir, r'VC\include\ammintrin.h'), 'w').close() |
- |
- from_dxsdk = [ |
- (r'DXSDK\Include', r'DXSDK\Include'), |
- (r'DXSDK\Lib', r'DXSDK\Lib'), |
- (r'DXSDK\Redist', r'DXSDK\Redist'), |
- ] |
- PullFrom(from_dxsdk, extracted.dxsdk, target_dir) |
- |
- |
-def CopyToFinalLocation2012(extracted, target_dir): |
- """Copy all directories we need to the target location.""" |
- sys.stdout.write('Pulling together required pieces...\n') |
- |
- # Note that order is important because some of the older ones are |
- # overwritten by updates. |
- from_sdk = [(r'Windows Kits\8.0', r'win8sdk')] |
- PullFrom(from_sdk, extracted.sdk_path, target_dir) |
- |
- from_metro_sdk = [(r'Windows Kits\8.0', r'win8sdk')] |
- PullFrom(from_sdk, extracted.metro_sdk_path, target_dir) |
- |
- # Stock compiler. |
- from_compiler = [(r'Program Files\Microsoft Visual Studio 11.0', '.')] |
- PullFrom(from_compiler, extracted.vc_x86, target_dir) |
- |
- from_compiler_res = [(r'Program Files\Microsoft Visual Studio 11.0', '.')] |
- PullFrom(from_compiler_res, extracted.vc_x86_res, target_dir) |
- |
- from_library = [(r'Program Files\Microsoft Visual Studio 11.0', '.')] |
- PullFrom(from_library, extracted.librarycore, target_dir) |
- |
- # WDK. |
- from_buildtools_x86 = [ |
- (r'WinDDK\7600.16385.win7_wdk.100208-1538\bin\x86', r'WDK\bin'), |
- ] |
- PullFrom(from_buildtools_x86, extracted.buildtools_x86, target_dir) |
- |
- from_buildtools_x64 = [ |
- (r'WinDDK\7600.16385.win7_wdk.100208-1538\bin\amd64', r'WDK\bin'), |
- ] |
- PullFrom(from_buildtools_x64, extracted.buildtools_x64, target_dir) |
- |
- from_libs_x86 = [(r'WinDDK\7600.16385.win7_wdk.100208-1538\lib', r'WDK\lib')] |
- PullFrom(from_libs_x86, extracted.libs_x86, target_dir) |
- |
- from_libs_x64 = [(r'WinDDK\7600.16385.win7_wdk.100208-1538\lib', r'WDK\lib')] |
- PullFrom(from_libs_x64, extracted.libs_x64, target_dir) |
- |
- from_headers = [(r'WinDDK\7600.16385.win7_wdk.100208-1538\inc', r'WDK\inc')] |
- PullFrom(from_headers, extracted.headers, target_dir) |
- |
- # Update bits. |
- from_compiler = [(r'Program Files\Microsoft Visual Studio 11.0', '.')] |
- PullFrom(from_compiler, extracted.vc_x86_update, target_dir) |
- |
- from_compiler_res = [(r'Program Files\Microsoft Visual Studio 11.0', '.')] |
- PullFrom(from_compiler_res, extracted.vc_x86_res_update, target_dir) |
- |
- from_library = [(r'Program Files\Microsoft Visual Studio 11.0', '.')] |
- PullFrom(from_library, extracted.librarycore_update, target_dir) |
- |
- |
-def PatchAsyncInfo(target_dir): |
- """Apply patch from |
- http://www.chromium.org/developers/how-tos/build-instructions-windows for |
- asyncinfo.h.""" |
- # This is only required for the 2010 compiler. |
- sys.stdout.write('Patching asyncinfo.h...\n') |
- asyncinfo_h_path = os.path.join( |
- target_dir, r'win8sdk\Include\winrt\asyncinfo.h') |
- with open(asyncinfo_h_path, 'rb') as f: |
- asyncinfo_h = f.read() |
- patched = asyncinfo_h.replace( |
- 'enum class AsyncStatus {', 'enum AsyncStatus {') |
- with open(asyncinfo_h_path, 'wb') as f: |
- f.write(patched) |
- |
- |
-def GenerateSetEnvCmd(target_dir, vsversion): |
- """Generate a batch file that gyp expects to exist to set up the compiler |
- environment. This is normally generated by a full install of the SDK, but we |
- do it here manually since we do not do a full install.""" |
- with open(os.path.join( |
- target_dir, r'win8sdk\bin\SetEnv.cmd'), 'w') as file: |
- file.write('@echo off\n') |
- file.write(':: Generated by tools\\win\\toolchain\\toolchain.py.\n') |
- file.write(':: Targeting VS%s.\n' % vsversion) |
- # Common to x86 and x64 |
- file.write('set PATH=%s;%%PATH%%\n' % ( |
- os.path.join(target_dir, r'Common7\IDE'))) |
- file.write('set INCLUDE=%s;%s;%s\n' % ( |
- os.path.join(target_dir, r'win8sdk\Include\um'), |
- os.path.join(target_dir, r'win8sdk\Include\shared'), |
- os.path.join(target_dir, r'VC\include'))) |
- file.write('if "%1"=="/x64" goto x64\n') |
- |
- # x86 only. |
- file.write('set PATH=%s;%s;%s;%%PATH%%\n' % ( |
- os.path.join(target_dir, r'win8sdk\bin\x86'), |
- os.path.join(target_dir, r'VC\bin'), |
- os.path.join(target_dir, r'WDK\bin'))) |
- file.write('set LIB=%s;%s\n' % ( |
- os.path.join(target_dir, r'VC\lib'), |
- os.path.join(target_dir, r'win8sdk\Lib\win8\um\x86'))) |
- file.write('goto done\n') |
- |
- # Unfortunately, 2012 Express does not include a native 64 bit compiler, |
- # so we have to use the x86->x64 cross. |
- if vsversion == '2012': |
- # x64 only. |
- file.write(':x64\n') |
- file.write('set PATH=%s;%s;%s;%%PATH%%\n' % ( |
- os.path.join(target_dir, r'win8sdk\bin\x64'), |
- os.path.join(target_dir, r'VC\bin\x86_amd64'), |
- os.path.join(target_dir, r'WDK\bin\amd64'))) |
- file.write('set LIB=%s;%s\n' % ( |
- os.path.join(target_dir, r'VC\lib\amd64'), |
- os.path.join(target_dir, r'win8sdk\Lib\win8\um\x64'))) |
- else: |
- # x64 only. |
- file.write(':x64\n') |
- file.write('set PATH=%s;%s;%s;%%PATH%%\n' % ( |
- os.path.join(target_dir, r'win8sdk\bin\x64'), |
- os.path.join(target_dir, r'VC\bin\amd64'), |
- os.path.join(target_dir, r'WDK\bin\amd64'))) |
- file.write('set LIB=%s;%s\n' % ( |
- os.path.join(target_dir, r'VC\lib\amd64'), |
- os.path.join(target_dir, r'win8sdk\Lib\win8\um\x64'))) |
- |
- file.write(':done\n') |
- |
- |
-def GenerateTopLevelEnv(target_dir, vsversion): |
- """Generate a batch file that sets up various environment variables that let |
- the Chromium build files and gyp find SDKs and tools.""" |
- with open(os.path.join(target_dir, r'env.bat'), 'w') as file: |
- file.write('@echo off\n') |
- file.write(':: Generated by tools\\win\\toolchain\\toolchain.py.\n') |
- file.write(':: Targeting VS%s.\n' % vsversion) |
- file.write('set GYP_DEFINES=windows_sdk_path="%s" ' |
- 'component=shared_library\n' % ( |
- os.path.join(target_dir, 'win8sdk'))) |
- file.write('set GYP_MSVS_VERSION=%se\n' % vsversion) |
- file.write('set GYP_MSVS_OVERRIDE_PATH=%s\n' % target_dir) |
- file.write('set GYP_GENERATORS=ninja\n') |
- file.write('set GYP_PARALLEL=1\n') |
- file.write('set WDK_DIR=%s\n' % os.path.join(target_dir, r'WDK')) |
- if vsversion == '2010': |
- file.write('set DXSDK_DIR=%s\n' % os.path.join(target_dir, r'DXSDK')) |
- file.write('set WindowsSDKDir=%s\n' % |
- os.path.join(target_dir, r'win8sdk')) |
- if vsversion == '2012': |
- # TODO: For 2010 too. |
- base = os.path.join(target_dir, r'VC\redist') |
- paths = [ |
- r'Debug_NonRedist\x64\Microsoft.VC110.DebugCRT', |
- r'Debug_NonRedist\x86\Microsoft.VC110.DebugCRT', |
- r'x64\Microsoft.VC110.CRT', |
- r'x86\Microsoft.VC110.CRT', |
- ] |
- additions = ';'.join(os.path.join(base, x) for x in paths) |
- file.write('set PATH=%s;%%PATH%%\n' % additions) |
- file.write('echo Environment set for toolchain in %s.\n' % target_dir) |
- file.write('cd /d %s\\..\n' % target_dir) |
- |
- |
-def main(): |
- parser = OptionParser() |
- parser.add_option('--targetdir', metavar='DIR', |
- help='put toolchain into DIR', |
- default=os.path.abspath('win_toolchain')) |
- parser.add_option('--vsversion', metavar='VSVERSION', |
- help='select VS version: 2010 or 2012', default='2010') |
- parser.add_option('--noclean', action='store_false', dest='clean', |
- help='do not remove temp files', |
- default=True) |
- parser.add_option('--local', metavar='DIR', |
- help='use downloaded files from DIR') |
- options, args = parser.parse_args() |
- try: |
- target_dir = os.path.abspath(options.targetdir) |
- if os.path.exists(target_dir): |
- sys.stderr.write('%s already exists. Please [re]move it or use ' |
- '--targetdir to select a different target.\n' % |
- target_dir) |
- return 1 |
- # Set the working directory to 7z subdirectory. 7-zip doesn't find its |
- # 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(os.path.dirname(os.path.abspath(__file__)), '7z')) |
- assert options.vsversion in ('2010', '2012') |
- if options.vsversion == '2012': |
- images = GetSourceImages2012(options.local) |
- extracted = ExtractComponents2012(images) |
- CopyToFinalLocation2012(extracted, target_dir) |
- else: |
- images = GetSourceImages2010(options.local) |
- extracted = ExtractComponents2010(images) |
- CopyToFinalLocation2010(extracted, target_dir) |
- PatchAsyncInfo(target_dir) |
- |
- GenerateSetEnvCmd(target_dir, options.vsversion) |
- GenerateTopLevelEnv(target_dir, options.vsversion) |
- finally: |
- if options.clean: |
- DeleteAllTempDirs() |
- |
- sys.stdout.write( |
- '\nIn a (clean) cmd shell, you can now run\n\n' |
- ' %s\\env.bat\n\n' |
- 'then\n\n' |
- " gclient runhooks (or gclient sync if you haven't pulled deps yet)\n" |
- ' ninja -C out\Debug chrome\n\n' |
- 'Note that this script intentionally does not modify any global\n' |
- 'settings like the registry, or system environment variables, so you\n' |
- 'will need to run the above env.bat whenever you start a new\n' |
- 'shell.\n\n' % target_dir) |
- |
- |
-if __name__ == '__main__': |
- main() |