| Index: win_toolchain/package_from_installed.py
|
| diff --git a/win_toolchain/package_from_installed.py b/win_toolchain/package_from_installed.py
|
| index c1f5e809bdb40af6092247fa7168e0dd023d5292..7c8d7134860affdc296068c924efa283fec45d63 100644
|
| --- a/win_toolchain/package_from_installed.py
|
| +++ b/win_toolchain/package_from_installed.py
|
| @@ -39,7 +39,7 @@ VS_VERSION = None
|
| WIN_VERSION = None
|
|
|
|
|
| -def BuildFileList():
|
| +def BuildFileList(override_dir):
|
| result = []
|
|
|
| # Subset of VS corresponding roughly to VC.
|
| @@ -49,13 +49,23 @@ def BuildFileList():
|
| 'DIA SDK/include',
|
| 'DIA SDK/lib',
|
| 'VC/atlmfc',
|
| - 'VC/bin',
|
| 'VC/crt',
|
| - 'VC/include',
|
| - 'VC/lib',
|
| 'VC/redist',
|
| ]
|
|
|
| + if override_dir:
|
| + paths += [
|
| + (os.path.join(override_dir, 'bin'), 'VC/bin'),
|
| + (os.path.join(override_dir, 'include'), 'VC/include'),
|
| + (os.path.join(override_dir, 'lib'), 'VC/lib'),
|
| + ]
|
| + else:
|
| + paths += [
|
| + 'VC/bin',
|
| + 'VC/include',
|
| + 'VC/lib',
|
| + ]
|
| +
|
| if VS_VERSION == '2013':
|
| paths += [
|
| ('VC/redist/x86/Microsoft.VC120.CRT', 'sys32'),
|
| @@ -92,14 +102,18 @@ def BuildFileList():
|
|
|
| for path in paths:
|
| src = path[0] if isinstance(path, tuple) else path
|
| - combined = os.path.join(vs_path, src)
|
| + # Note that vs_path is ignored if src is an absolute path.
|
| + # normpath is needed to change '/' to '\\' characters.
|
| + combined = os.path.normpath(os.path.join(vs_path, src))
|
| assert os.path.exists(combined) and os.path.isdir(combined)
|
| for root, _, files in os.walk(combined):
|
| for f in files:
|
| final_from = os.path.normpath(os.path.join(root, f))
|
| if isinstance(path, tuple):
|
| + assert final_from.startswith(combined)
|
| + dest = final_from[len(combined) + 1:]
|
| result.append(
|
| - (final_from, os.path.normpath(os.path.join(path[1], f))))
|
| + (final_from, os.path.normpath(os.path.join(path[1], dest))))
|
| else:
|
| assert final_from.startswith(vs_path)
|
| dest = final_from[len(vs_path) + 1:]
|
| @@ -140,61 +154,44 @@ def BuildFileList():
|
| result.append((combined, to))
|
|
|
| if VS_VERSION == '2015':
|
| - # The Windows 10 Universal C Runtime installers are needed when packaging
|
| - # VS 2015. They can be download from here:
|
| - # https://support.microsoft.com/en-us/kb/2999226
|
| - # and they must be downloaded to the current user's downloads directory.
|
| - # The versions needed are those for 64-bit Windows 7, Windows 8, and
|
| - # Windows 8.1. The 64-bit Server 2008 R2, Server 2012, and Server 2012 R2
|
| - # versions are identical (same name and contents).
|
| - universal_runtime_installers = [
|
| - 'Windows6.1-KB2999226-x64.msu',
|
| - 'Windows8-RT-KB2999226-x64.msu',
|
| - 'Windows8.1-KB2999226-x64.msu',
|
| + # Copy the x86 ucrt DLLs to all directories with 32-bit binaries that are
|
| + # added to the path by SetEnv.cmd, and to sys32.
|
| + ucrt_paths = glob.glob(os.path.join(sdk_path, r'redist\ucrt\dlls\x86\*'))
|
| + for ucrt_path in ucrt_paths:
|
| + ucrt_file = os.path.split(ucrt_path)[1]
|
| + for dest_dir in [ r'win_sdk\bin\x86', 'sys32' ]:
|
| + result.append((ucrt_path, os.path.join(dest_dir, ucrt_file)))
|
| +
|
| + # Copy the x64 ucrt DLLs to all directories with 64-bit binaries that are
|
| + # added to the path by SetEnv.cmd, and to sys64.
|
| + ucrt_paths = glob.glob(os.path.join(sdk_path, r'redist\ucrt\dlls\x64\*'))
|
| + for ucrt_path in ucrt_paths:
|
| + ucrt_file = os.path.split(ucrt_path)[1]
|
| + for dest_dir in [ r'VC\bin\amd64_x86', r'VC\bin\amd64',
|
| + r'win_sdk\bin\x64', 'sys64']:
|
| + result.append((ucrt_path, os.path.join(dest_dir, ucrt_file)))
|
| +
|
| + system_crt_files = [
|
| + # Needed to let debug binaries run.
|
| + 'ucrtbased.dll',
|
| ]
|
| -
|
| - for installer in universal_runtime_installers:
|
| - result.append((os.path.join(os.environ['userprofile'], 'downloads',
|
| - installer),
|
| - os.path.join('installers', installer)))
|
| -
|
| - if VS_VERSION == '2015':
|
| - # Copy the x86 ucrt DLLs to all directories with 32-bit binaries that are
|
| - # added to the path by SetEnv.cmd, and to sys32.
|
| - ucrt_paths = glob.glob(os.path.join(sdk_path, r'redist\ucrt\dlls\x86\*'))
|
| - for ucrt_path in ucrt_paths:
|
| - ucrt_file = os.path.split(ucrt_path)[1]
|
| - for dest_dir in [ r'win_sdk\bin\x86', 'sys32' ]:
|
| - result.append((ucrt_path, os.path.join(dest_dir, ucrt_file)))
|
| -
|
| - # Copy the x64 ucrt DLLs to all directories with 64-bit binaries that are
|
| - # added to the path by SetEnv.cmd, and to sys64.
|
| - ucrt_paths = glob.glob(os.path.join(sdk_path, r'redist\ucrt\dlls\x64\*'))
|
| - for ucrt_path in ucrt_paths:
|
| - ucrt_file = os.path.split(ucrt_path)[1]
|
| - for dest_dir in [ r'VC\bin\amd64_x86', r'VC\bin\amd64',
|
| - r'win_sdk\bin\x64', 'sys64']:
|
| - result.append((ucrt_path, os.path.join(dest_dir, ucrt_file)))
|
| -
|
| - system_crt_files = [
|
| - # Needed to let debug binaries run.
|
| - 'ucrtbased.dll',
|
| - ]
|
| - bitness = platform.architecture()[0]
|
| - # When running 64-bit python the x64 DLLs will be in System32
|
| - x64_path = 'System32' if bitness == '64bit' else 'Sysnative'
|
| - x64_path = os.path.join(r'C:\Windows', x64_path)
|
| - for system_crt_file in system_crt_files:
|
| - result.append((os.path.join(r'C:\Windows\SysWOW64', system_crt_file),
|
| - os.path.join('sys32', system_crt_file)))
|
| - result.append((os.path.join(x64_path, system_crt_file),
|
| - os.path.join('sys64', system_crt_file)))
|
| + bitness = platform.architecture()[0]
|
| + # When running 64-bit python the x64 DLLs will be in System32
|
| + x64_path = 'System32' if bitness == '64bit' else 'Sysnative'
|
| + x64_path = os.path.join(r'C:\Windows', x64_path)
|
| + for system_crt_file in system_crt_files:
|
| + result.append((os.path.join(r'C:\Windows\SysWOW64', system_crt_file),
|
| + os.path.join('sys32', system_crt_file)))
|
| + result.append((os.path.join(x64_path, system_crt_file),
|
| + os.path.join('sys64', system_crt_file)))
|
|
|
| # Generically drop all arm stuff that we don't need, and
|
| - # drop .msi files because we don't need installers.
|
| + # drop .msi files because we don't need installers, and drop windows.winmd
|
| + # because it is unneeded and is different on every machine.
|
| return [(f, t) for f, t in result if 'arm\\' not in f.lower() and
|
| 'arm64\\' not in f.lower() and
|
| - not f.lower().endswith('.msi')]
|
| + not f.lower().endswith('.msi') and
|
| + not f.lower().endswith('windows.winmd')]
|
|
|
|
|
| def GenerateSetEnvCmd(target_dir):
|
| @@ -329,6 +326,9 @@ def main():
|
| parser.add_option('-d', '--dryrun', action='store_true', dest='dryrun',
|
| default=False,
|
| help='scan for file existence and prints statistics')
|
| + parser.add_option('--override', action='store', type='string',
|
| + dest='override_dir', default=None,
|
| + help='Specify alternate bin/include/lib directory')
|
| (options, args) = parser.parse_args()
|
|
|
| if len(args) != 1 or args[0] not in ('2013', '2015'):
|
| @@ -336,13 +336,20 @@ def main():
|
| parser.print_help();
|
| return 1
|
|
|
| + if options.override_dir:
|
| + if (not os.path.exists(os.path.join(options.override_dir, 'bin')) or
|
| + not os.path.exists(os.path.join(options.override_dir, 'include')) or
|
| + not os.path.exists(os.path.join(options.override_dir, 'lib'))):
|
| + print 'Invalid override directory - must contain bin/include/lib dirs'
|
| + return 1
|
| +
|
| global VS_VERSION
|
| VS_VERSION = args[0]
|
| global WIN_VERSION
|
| WIN_VERSION = options.winver
|
|
|
| print 'Building file list for VS %s Windows %s...' % (VS_VERSION, WIN_VERSION)
|
| - files = BuildFileList()
|
| + files = BuildFileList(options.override_dir)
|
|
|
| AddEnvSetup(files)
|
|
|
|
|