| Index: build/vs_toolchain.py
|
| diff --git a/build/vs_toolchain.py b/build/vs_toolchain.py
|
| index bdedd6fa8822f121da2687d338cbdf3f58140575..a490a2c9e728afdf56ddea439c20f9b2f137edc3 100644
|
| --- a/build/vs_toolchain.py
|
| +++ b/build/vs_toolchain.py
|
| @@ -63,6 +63,29 @@ def SetEnvironmentAndGetRuntimeDllDirs():
|
| return vs2013_runtime_dll_dirs
|
|
|
|
|
| +def _CopyRuntimeImpl(target, source):
|
| + """Copy |source| to |target| if it doesn't already exist or if it
|
| + needs to be updated.
|
| + """
|
| + if (os.path.isdir(os.path.dirname(target)) and
|
| + (not os.path.isfile(target) or
|
| + os.stat(target).st_mtime != os.stat(source).st_mtime)):
|
| + print 'Copying %s to %s...' % (source, target)
|
| + if os.path.exists(target):
|
| + os.unlink(target)
|
| + shutil.copy2(source, target)
|
| +
|
| +
|
| +def _CopyRuntime(target_dir, source_dir, dll_pattern):
|
| + """Copy both the msvcr and msvcp runtime DLLs, only if the target doesn't
|
| + exist, but the target directory does exist."""
|
| + for which in ('p', 'r'):
|
| + dll = dll_pattern % which
|
| + target = os.path.join(target_dir, dll)
|
| + source = os.path.join(source_dir, dll)
|
| + _CopyRuntimeImpl(target, source)
|
| +
|
| +
|
| def CopyVsRuntimeDlls(output_dir, runtime_dirs):
|
| """Copies the VS runtime DLLs from the given |runtime_dirs| to the output
|
| directory so that even if not system-installed, built binaries are likely to
|
| @@ -73,27 +96,6 @@ def CopyVsRuntimeDlls(output_dir, runtime_dirs):
|
| """
|
| assert sys.platform.startswith(('win32', 'cygwin'))
|
|
|
| - def copy_runtime_impl(target, source):
|
| - """Copy |source| to |target| if it doesn't already exist or if it need to be
|
| - updated.
|
| - """
|
| - if (os.path.isdir(os.path.dirname(target)) and
|
| - (not os.path.isfile(target) or
|
| - os.stat(target).st_mtime != os.stat(source).st_mtime)):
|
| - print 'Copying %s to %s...' % (source, target)
|
| - if os.path.exists(target):
|
| - os.unlink(target)
|
| - shutil.copy2(source, target)
|
| -
|
| - def copy_runtime(target_dir, source_dir, dll_pattern):
|
| - """Copy both the msvcr and msvcp runtime DLLs, only if the target doesn't
|
| - exist, but the target directory does exist."""
|
| - for which in ('p', 'r'):
|
| - dll = dll_pattern % which
|
| - target = os.path.join(target_dir, dll)
|
| - source = os.path.join(source_dir, dll)
|
| - copy_runtime_impl(target, source)
|
| -
|
| x86, x64 = runtime_dirs
|
| out_debug = os.path.join(output_dir, 'Debug')
|
| out_debug_nacl64 = os.path.join(output_dir, 'Debug', 'x64')
|
| @@ -106,12 +108,12 @@ def CopyVsRuntimeDlls(output_dir, runtime_dirs):
|
| os.makedirs(out_debug_nacl64)
|
| if os.path.exists(out_release) and not os.path.exists(out_release_nacl64):
|
| os.makedirs(out_release_nacl64)
|
| - copy_runtime(out_debug, x86, 'msvc%s120d.dll')
|
| - copy_runtime(out_release, x86, 'msvc%s120.dll')
|
| - copy_runtime(out_debug_x64, x64, 'msvc%s120d.dll')
|
| - copy_runtime(out_release_x64, x64, 'msvc%s120.dll')
|
| - copy_runtime(out_debug_nacl64, x64, 'msvc%s120d.dll')
|
| - copy_runtime(out_release_nacl64, x64, 'msvc%s120.dll')
|
| + _CopyRuntime(out_debug, x86, 'msvc%s120d.dll')
|
| + _CopyRuntime(out_release, x86, 'msvc%s120.dll')
|
| + _CopyRuntime(out_debug_x64, x64, 'msvc%s120d.dll')
|
| + _CopyRuntime(out_release_x64, x64, 'msvc%s120.dll')
|
| + _CopyRuntime(out_debug_nacl64, x64, 'msvc%s120d.dll')
|
| + _CopyRuntime(out_release_nacl64, x64, 'msvc%s120.dll')
|
|
|
| # Copy the PGO runtime library to the release directories.
|
| if os.environ.get('GYP_MSVS_OVERRIDE_PATH'):
|
| @@ -121,18 +123,37 @@ def CopyVsRuntimeDlls(output_dir, runtime_dirs):
|
| pgo_runtime_dll = 'pgort120.dll'
|
| source_x86 = os.path.join(pgo_x86_runtime_dir, pgo_runtime_dll)
|
| if os.path.exists(source_x86):
|
| - copy_runtime_impl(os.path.join(out_release, pgo_runtime_dll), source_x86)
|
| + _CopyRuntimeImpl(os.path.join(out_release, pgo_runtime_dll), source_x86)
|
| source_x64 = os.path.join(pgo_x64_runtime_dir, pgo_runtime_dll)
|
| if os.path.exists(source_x64):
|
| - copy_runtime_impl(os.path.join(out_release_x64, pgo_runtime_dll),
|
| - source_x64)
|
| + _CopyRuntimeImpl(os.path.join(out_release_x64, pgo_runtime_dll),
|
| + source_x64)
|
| +
|
| +
|
| +def CopyDlls(target_dir, configuration, cpu_arch):
|
| + """Copy the VS runtime DLLs into the requested directory as needed.
|
| +
|
| + configuration is one of 'Debug' or 'Release'.
|
| + cpu_arch is one of 'x86' or 'x64'.
|
| +
|
| + The debug configuration gets both the debug and release DLLs; the
|
| + release config only the latter.
|
| + """
|
| + vs2013_runtime_dll_dirs = SetEnvironmentAndGetRuntimeDllDirs()
|
| + if not vs2013_runtime_dll_dirs:
|
| + return
|
| +
|
| + x64_runtime, x86_runtime = vs2013_runtime_dll_dirs
|
| + runtime_dir = x64_runtime if cpu_arch == 'x64' else x86_runtime
|
| + _CopyRuntime(target_dir, runtime_dir, 'msvc%s120.dll')
|
| + if configuration == 'Debug':
|
| + _CopyRuntime(target_dir, runtime_dir, 'msvc%s120d.dll')
|
|
|
|
|
| def _GetDesiredVsToolchainHashes():
|
| """Load a list of SHA1s corresponding to the toolchains that we want installed
|
| to build with."""
|
| - sha1path = os.path.join(script_dir,
|
| - '..', 'buildtools', 'toolchain_vs2013.hash')
|
| + sha1path = os.path.join(script_dir, 'toolchain_vs2013.hash')
|
| with open(sha1path, 'rb') as f:
|
| return f.read().strip().splitlines()
|
|
|
| @@ -188,13 +209,12 @@ def main():
|
| commands = {
|
| 'update': Update,
|
| 'get_toolchain_dir': GetToolchainDir,
|
| - # TODO(scottmg): Add copy_dlls for GN builds (gyp_chromium calls
|
| - # CopyVsRuntimeDlls via import, currently).
|
| + 'copy_dlls': CopyDlls,
|
| }
|
| if len(sys.argv) < 2 or sys.argv[1] not in commands:
|
| print >>sys.stderr, 'Expected one of: %s' % ', '.join(commands)
|
| return 1
|
| - return commands[sys.argv[1]]()
|
| + return commands[sys.argv[1]](*sys.argv[2:])
|
|
|
|
|
| if __name__ == '__main__':
|
|
|