@ -28,15 +28,16 @@ import tempfile
import zipfile
import get_toolchain_if_necessary
import toolchain2013 # pylint: disable=F0401
VS_VERSION = None
def BuildFileList ( ) :
result = [ ]
# Subset of VS corresponding roughly to VC.
vs_path = r ' C: \ Program Files (x86) \ Microsoft Visual Studio 12.0 '
for path in [
paths = [
' DIA SDK/bin ' ,
' DIA SDK/idl ' ,
' DIA SDK/include ' ,
@ -47,15 +48,39 @@ def BuildFileList():
' VC/include ' ,
' VC/lib ' ,
' VC/redist ' ,
( ' VC/redist/x86/Microsoft.VC120.CRT ' , ' sys32 ' ) ,
( ' VC/redist/x86/Microsoft.VC120.MFC ' , ' sys32 ' ) ,
( ' VC/redist/Debug_NonRedist/x86/Microsoft.VC120.DebugCRT ' , ' sys32 ' ) ,
( ' VC/redist/Debug_NonRedist/x86/Microsoft.VC120.DebugMFC ' , ' sys32 ' ) ,
( ' VC/redist/x64/Microsoft.VC120.CRT ' , ' sys64 ' ) ,
( ' VC/redist/x64/Microsoft.VC120.MFC ' , ' sys64 ' ) ,
( ' VC/redist/Debug_NonRedist/x64/Microsoft.VC120.DebugCRT ' , ' sys64 ' ) ,
( ' VC/redist/Debug_NonRedist/x64/Microsoft.VC120.DebugMFC ' , ' sys64 ' ) ,
] :
]
if VS_VERSION == ' 2013 ' :
paths + = [
( ' VC/redist/x86/Microsoft.VC120.CRT ' , ' sys32 ' ) ,
( ' VC/redist/x86/Microsoft.VC120.MFC ' , ' sys32 ' ) ,
( ' VC/redist/Debug_NonRedist/x86/Microsoft.VC120.DebugCRT ' , ' sys32 ' ) ,
( ' VC/redist/Debug_NonRedist/x86/Microsoft.VC120.DebugMFC ' , ' sys32 ' ) ,
( ' VC/redist/x64/Microsoft.VC120.CRT ' , ' sys64 ' ) ,
( ' VC/redist/x64/Microsoft.VC120.MFC ' , ' sys64 ' ) ,
( ' VC/redist/Debug_NonRedist/x64/Microsoft.VC120.DebugCRT ' , ' sys64 ' ) ,
( ' VC/redist/Debug_NonRedist/x64/Microsoft.VC120.DebugMFC ' , ' sys64 ' ) ,
]
elif VS_VERSION == ' 2015 ' :
paths + = [
( ' VC/redist/x86/Microsoft.VC140.CRT ' , ' sys32 ' ) ,
( ' VC/redist/x86/Microsoft.VC140.MFC ' , ' sys32 ' ) ,
( ' VC/redist/debug_nonredist/x86/Microsoft.VC140.DebugCRT ' , ' sys32 ' ) ,
( ' VC/redist/debug_nonredist/x86/Microsoft.VC140.DebugMFC ' , ' sys32 ' ) ,
( ' VC/redist/x64/Microsoft.VC140.CRT ' , ' sys64 ' ) ,
( ' VC/redist/x64/Microsoft.VC140.MFC ' , ' sys64 ' ) ,
( ' VC/redist/debug_nonredist/x64/Microsoft.VC140.DebugCRT ' , ' sys64 ' ) ,
( ' VC/redist/debug_nonredist/x64/Microsoft.VC140.DebugMFC ' , ' sys64 ' ) ,
]
else :
raise ValueError ( ' VS_VERSION %s ' % VS_VERSION )
if VS_VERSION == ' 2013 ' :
vs_path = r ' C: \ Program Files (x86) \ Microsoft Visual Studio 12.0 '
else :
vs_path = r ' C: \ Program Files (x86) \ Microsoft Visual Studio 14.0 '
for path in paths :
src = path [ 0 ] if isinstance ( path , tuple ) else path
combined = os . path . join ( vs_path , src )
assert os . path . exists ( combined ) and os . path . isdir ( combined )
@ -68,8 +93,8 @@ def BuildFileList():
else :
assert final_from . startswith ( vs_path )
dest = final_from [ len ( vs_path ) + 1 : ]
if dest. lower ( ) . endswith ( ' \\ xtree ' ) :
# Patch for C4702 in xtree . http://crbug.com/346399.
if VS_VERSION == ' 2013 ' and dest. lower ( ) . endswith ( ' \\ xtree ' ) :
# Patch for C4702 in xtree on VS2013 . http://crbug.com/346399.
( handle , patched ) = tempfile . mkstemp ( )
with open ( final_from , ' rb ' ) as unpatched_f :
unpatched_contents = unpatched_f . read ( )
@ -85,21 +110,80 @@ def BuildFileList():
for root , _ , files in os . walk ( sdk_path ) :
for f in files :
combined = os . path . normpath ( os . path . join ( root , f ) )
to = os . path . join ( ' win 8 sdk' , combined [ len ( sdk_path ) + 1 : ] )
to = os . path . join ( ' win _ sdk' , combined [ len ( sdk_path ) + 1 : ] )
result . append ( ( combined , to ) )
if VS_VERSION == ' 2015 ' :
for ucrt_path in (
( r ' C: \ Program Files (x86) \ Windows Kits \ 10 \ Include ' , ' Include ' ) ,
( r ' C: \ Program Files (x86) \ Windows Kits \ 10 \ Lib ' , ' Lib ' ) ,
( r ' C: \ Program Files (x86) \ Windows Kits \ 10 \ Source ' , ' Source ' ) ) :
src , target = ucrt_path
for root , _ , files in os . walk ( src ) :
for f in files :
combined = os . path . normpath ( os . path . join ( root , f ) )
to = os . path . join ( ' ucrt ' , target , combined [ len ( src ) + 1 : ] )
result . append ( ( combined , to ) )
# Generically drop all arm stuff that we don't need.
return [ ( f , t ) for f , t in result if ' arm \\ ' not in f . lower ( ) ]
return [ ( f , t ) for f , t in result if ' arm \\ ' not in f . lower ( ) and
' arm64 \\ ' not in f . lower ( ) ]
def GenerateSetEnvCmd ( target_dir ) :
""" 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 ' win_sdk \ bin \ SetEnv.cmd ' ) , ' w ' ) as f :
f . write ( ' @echo off \n '
' :: Generated by win_toolchain \\ package_from_installed.py. \n '
# Common to x86 and x64
' set PATH= % ~dp0.. \\ .. \\ Common7 \\ IDE; % PATH % \n '
' set INCLUDE= % ~dp0.. \\ .. \\ win_sdk \\ Include \\ um; '
' % ~dp0.. \\ .. \\ win_sdk \\ Include \\ shared; '
' % ~dp0.. \\ .. \\ win_sdk \\ Include \\ winrt; '
' % ~dp0.. \\ .. \\ ucrt \\ Include \\ 10.0.10056.0 \\ ucrt; '
' % ~dp0.. \\ .. \\ VC \\ include; '
' % ~dp0.. \\ .. \\ VC \\ atlmfc \\ include \n '
' if " % 1 " == " /x64 " goto x64 \n ' )
# x86. Always use amd64_x86 cross, not x86 on x86.
f . write ( ' set PATH= % ~dp0.. \\ .. \\ win_sdk \\ bin \\ x86; '
' % ~dp0.. \\ .. \\ VC \\ bin \\ amd64_x86; '
' % ~dp0.. \\ .. \\ VC \\ bin \\ amd64; ' # Needed for mspdb1x0.dll.
' % PATH % \n ' )
f . write ( ' set LIB= % ~dp0.. \\ .. \\ VC \\ lib; '
' % ~dp0.. \\ .. \\ win_sdk \\ Lib \\ winv6.3 \\ um \\ x86; '
' % ~dp0.. \\ .. \\ ucrt \\ Lib \\ 10.0.10056.0 \\ ucrt \\ x86; '
' % ~dp0.. \\ .. \\ VC \\ atlmfc \\ lib \n '
' goto :EOF \n ' )
# x64.
f . write ( ' :x64 \n '
' set PATH= % ~dp0.. \\ .. \\ win_sdk \\ bin \\ x64; '
' % ~dp0.. \\ .. \\ VC \\ bin \\ amd64; '
' % PATH % \n ' )
f . write ( ' set LIB= % ~dp0.. \\ .. \\ VC \\ lib \\ amd64; '
' % ~dp0.. \\ .. \\ win_sdk \\ Lib \\ winv6.3 \\ um \\ x64; '
' % ~dp0.. \\ .. \\ ucrt \\ Lib \\ 10.0.10056.0 \\ ucrt \\ x64; '
' % ~dp0.. \\ .. \\ VC \\ atlmfc \\ lib \\ amd64 \n ' )
def AddEnvSetup ( files ) :
""" We need to generate this file in the same way that the " from pieces "
script does , so pull that in here . """
tempdir = tempfile . mkdtemp ( )
os . makedirs ( os . path . join ( tempdir , ' win8sdk ' , ' bin ' ) )
toolchain2013 . GenerateSetEnvCmd ( tempdir , True )
files . append ( ( os . path . join ( tempdir , ' win8sdk ' , ' bin ' , ' SetEnv.cmd ' ) ,
' win8sdk \\ bin \\ SetEnv.cmd ' ) )
os . makedirs ( os . path . join ( tempdir , ' win_sdk ' , ' bin ' ) )
GenerateSetEnvCmd ( tempdir )
files . append ( ( os . path . join ( tempdir , ' win_sdk ' , ' bin ' , ' SetEnv.cmd ' ) ,
' win_sdk \\ bin \\ SetEnv.cmd ' ) )
vs_version_file = os . path . join ( tempdir , ' VS_VERSION ' )
with open ( vs_version_file , ' wb ' ) as version :
print >> version , VS_VERSION
files . append ( ( vs_version_file , ' VS_VERSION ' ) )
def RenameToSha1 ( output ) :
@ -109,7 +193,7 @@ def RenameToSha1(output):
tempdir = tempfile . mkdtemp ( )
old_dir = os . getcwd ( )
os . chdir ( tempdir )
rel_dir = ' vs 2013 _files'
rel_dir = ' vs _files'
with zipfile . ZipFile (
os . path . join ( old_dir , output ) , ' r ' , zipfile . ZIP_DEFLATED , True ) as zf :
zf . extractall ( rel_dir )
@ -123,6 +207,13 @@ def RenameToSha1(output):
def main ( ) :
if len ( sys . argv ) != 2 or sys . argv [ 1 ] not in ( ' 2013 ' , ' 2015 ' ) :
print ' Usage: package_from_installed.py 2013|2015 '
return 1
global VS_VERSION
VS_VERSION = sys . argv [ 1 ]
print ' Building file list... '
files = BuildFileList ( )