Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(371)

Side by Side Diff: build/vs_toolchain.py

Issue 722723004: Rework win_toolchains a bit and copy the vs runtime DLLs as needed. (Closed) Base URL: http://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« build/toolchain/win/BUILD.gn ('K') | « build/toolchain/win/BUILD.gn ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 # Copyright 2014 The Chromium Authors. All rights reserved. 1 # Copyright 2014 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 4
5 import json 5 import json
6 import os 6 import os
7 import pipes 7 import pipes
8 import shutil 8 import shutil
9 import subprocess 9 import subprocess
10 import sys 10 import sys
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
66 def CopyVsRuntimeDlls(output_dir, runtime_dirs): 66 def CopyVsRuntimeDlls(output_dir, runtime_dirs):
67 """Copies the VS runtime DLLs from the given |runtime_dirs| to the output 67 """Copies the VS runtime DLLs from the given |runtime_dirs| to the output
68 directory so that even if not system-installed, built binaries are likely to 68 directory so that even if not system-installed, built binaries are likely to
69 be able to run. 69 be able to run.
70 70
71 This needs to be run after gyp has been run so that the expected target 71 This needs to be run after gyp has been run so that the expected target
72 output directories are already created. 72 output directories are already created.
73 """ 73 """
74 assert sys.platform.startswith(('win32', 'cygwin')) 74 assert sys.platform.startswith(('win32', 'cygwin'))
75 75
76 def copy_runtime_impl(target, source):
77 """Copy |source| to |target| if it doesn't already exist or if it need to be
78 updated.
79 """
80 if (os.path.isdir(os.path.dirname(target)) and
81 (not os.path.isfile(target) or
82 os.stat(target).st_mtime != os.stat(source).st_mtime)):
83 print 'Copying %s to %s...' % (source, target)
84 if os.path.exists(target):
85 os.unlink(target)
86 shutil.copy2(source, target)
87
88 def copy_runtime(target_dir, source_dir, dll_pattern):
89 """Copy both the msvcr and msvcp runtime DLLs, only if the target doesn't
90 exist, but the target directory does exist."""
91 for which in ('p', 'r'):
92 dll = dll_pattern % which
93 target = os.path.join(target_dir, dll)
94 source = os.path.join(source_dir, dll)
95 copy_runtime_impl(target, source)
96
97 x86, x64 = runtime_dirs 76 x86, x64 = runtime_dirs
98 out_debug = os.path.join(output_dir, 'Debug') 77 out_debug = os.path.join(output_dir, 'Debug')
99 out_debug_nacl64 = os.path.join(output_dir, 'Debug', 'x64') 78 out_debug_nacl64 = os.path.join(output_dir, 'Debug', 'x64')
100 out_release = os.path.join(output_dir, 'Release') 79 out_release = os.path.join(output_dir, 'Release')
101 out_release_nacl64 = os.path.join(output_dir, 'Release', 'x64') 80 out_release_nacl64 = os.path.join(output_dir, 'Release', 'x64')
102 out_debug_x64 = os.path.join(output_dir, 'Debug_x64') 81 out_debug_x64 = os.path.join(output_dir, 'Debug_x64')
103 out_release_x64 = os.path.join(output_dir, 'Release_x64') 82 out_release_x64 = os.path.join(output_dir, 'Release_x64')
104 83
105 if os.path.exists(out_debug) and not os.path.exists(out_debug_nacl64): 84 if os.path.exists(out_debug) and not os.path.exists(out_debug_nacl64):
106 os.makedirs(out_debug_nacl64) 85 os.makedirs(out_debug_nacl64)
107 if os.path.exists(out_release) and not os.path.exists(out_release_nacl64): 86 if os.path.exists(out_release) and not os.path.exists(out_release_nacl64):
108 os.makedirs(out_release_nacl64) 87 os.makedirs(out_release_nacl64)
109 copy_runtime(out_debug, x86, 'msvc%s120d.dll') 88 _CopyRuntime(out_debug, x86, 'msvc%s120d.dll')
110 copy_runtime(out_release, x86, 'msvc%s120.dll') 89 _CopyRuntime(out_release, x86, 'msvc%s120.dll')
111 copy_runtime(out_debug_x64, x64, 'msvc%s120d.dll') 90 _CopyRuntime(out_debug_x64, x64, 'msvc%s120d.dll')
112 copy_runtime(out_release_x64, x64, 'msvc%s120.dll') 91 _CopyRuntime(out_release_x64, x64, 'msvc%s120.dll')
113 copy_runtime(out_debug_nacl64, x64, 'msvc%s120d.dll') 92 _CopyRuntime(out_debug_nacl64, x64, 'msvc%s120d.dll')
114 copy_runtime(out_release_nacl64, x64, 'msvc%s120.dll') 93 _CopyRuntime(out_release_nacl64, x64, 'msvc%s120.dll')
115 94
116 # Copy the PGO runtime library to the release directories. 95 # Copy the PGO runtime library to the release directories.
117 if os.environ.get('GYP_MSVS_OVERRIDE_PATH'): 96 if os.environ.get('GYP_MSVS_OVERRIDE_PATH'):
118 pgo_x86_runtime_dir = os.path.join(os.environ.get('GYP_MSVS_OVERRIDE_PATH'), 97 pgo_x86_runtime_dir = os.path.join(os.environ.get('GYP_MSVS_OVERRIDE_PATH'),
119 'VC', 'bin') 98 'VC', 'bin')
120 pgo_x64_runtime_dir = os.path.join(pgo_x86_runtime_dir, 'amd64') 99 pgo_x64_runtime_dir = os.path.join(pgo_x86_runtime_dir, 'amd64')
121 pgo_runtime_dll = 'pgort120.dll' 100 pgo_runtime_dll = 'pgort120.dll'
122 source_x86 = os.path.join(pgo_x86_runtime_dir, pgo_runtime_dll) 101 source_x86 = os.path.join(pgo_x86_runtime_dir, pgo_runtime_dll)
123 if os.path.exists(source_x86): 102 if os.path.exists(source_x86):
124 copy_runtime_impl(os.path.join(out_release, pgo_runtime_dll), source_x86) 103 copy_runtime_impl(os.path.join(out_release, pgo_runtime_dll), source_x86)
scottmg 2014/11/13 03:49:59 this will be broken
Dirk Pranke 2014/11/13 05:49:36 Good catch. Will fix. I thought I searched for oth
125 source_x64 = os.path.join(pgo_x64_runtime_dir, pgo_runtime_dll) 104 source_x64 = os.path.join(pgo_x64_runtime_dir, pgo_runtime_dll)
126 if os.path.exists(source_x64): 105 if os.path.exists(source_x64):
127 copy_runtime_impl(os.path.join(out_release_x64, pgo_runtime_dll), 106 copy_runtime_impl(os.path.join(out_release_x64, pgo_runtime_dll),
128 source_x64) 107 source_x64)
129 108
130 109
110 def CopyDlls(target_dir, configuration, cpu_arch):
111 """Copy the VS runtime DLLs into the requested directory as needed.
112
113 configuration is one of 'Debug' or 'Release'.
114 cpu_arch is one of 'x86' or 'x64'.
115
116 The debug configuration gets both the debug and release DLLs; the
117 release config only the latter.
scottmg 2014/11/13 03:49:59 add a note to see the gyp version above, and note
Dirk Pranke 2014/11/13 05:49:36 Will do.
118 """
scottmg 2014/11/13 03:49:59 add a note that this will mean nacl tests will fai
Dirk Pranke 2014/11/13 05:49:36 I'm not sure what you're referring to here. Which
Nick Bray (chromium) 2014/11/13 20:10:53 Reading between the lines: NaCl will need x64 dlls
119 vs2013_runtime_dll_dirs = SetEnvironmentAndGetRuntimeDllDirs()
120 if not vs2013_runtime_dll_dirs:
121 return
122
123 x64_runtime, x86_runtime = vs2013_runtime_dll_dirs
124 runtime_dir = x64_runtime if cpu_arch == 'x64' else x86_runtime
125 _CopyRuntime(target_dir, runtime_dir, 'msvc%s120.dll')
126 if configuration == 'Debug':
127 _CopyRuntime(target_dir, runtime_dir, 'msvc%s120d.dll')
128
129
131 def _GetDesiredVsToolchainHashes(): 130 def _GetDesiredVsToolchainHashes():
132 """Load a list of SHA1s corresponding to the toolchains that we want installed 131 """Load a list of SHA1s corresponding to the toolchains that we want installed
133 to build with.""" 132 to build with."""
134 sha1path = os.path.join(script_dir, 133 sha1path = os.path.join(script_dir,
135 '..', 'buildtools', 'toolchain_vs2013.hash') 134 '..', 'buildtools', 'toolchain_vs2013.hash')
136 with open(sha1path, 'rb') as f: 135 with open(sha1path, 'rb') as f:
137 return f.read().strip().splitlines() 136 return f.read().strip().splitlines()
138 137
139 138
140 def Update(): 139 def Update():
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
181 os.environ['GYP_MSVS_VERSION'], 180 os.environ['GYP_MSVS_VERSION'],
182 os.environ.get('WDK_DIR', '')) 181 os.environ.get('WDK_DIR', ''))
183 182
184 183
185 def main(): 184 def main():
186 if not sys.platform.startswith(('win32', 'cygwin')): 185 if not sys.platform.startswith(('win32', 'cygwin')):
187 return 0 186 return 0
188 commands = { 187 commands = {
189 'update': Update, 188 'update': Update,
190 'get_toolchain_dir': GetToolchainDir, 189 'get_toolchain_dir': GetToolchainDir,
191 # TODO(scottmg): Add copy_dlls for GN builds (gyp_chromium calls 190 'copy_dlls': CopyDlls,
192 # CopyVsRuntimeDlls via import, currently).
193 } 191 }
194 if len(sys.argv) < 2 or sys.argv[1] not in commands: 192 if len(sys.argv) < 2 or sys.argv[1] not in commands:
195 print >>sys.stderr, 'Expected one of: %s' % ', '.join(commands) 193 print >>sys.stderr, 'Expected one of: %s' % ', '.join(commands)
196 return 1 194 return 1
197 return commands[sys.argv[1]]() 195 return commands[sys.argv[1]](*sys.argv[2:])
196
197
198 def _CopyRuntime(target_dir, source_dir, dll_pattern):
scottmg 2014/11/13 03:49:59 nit; move this up to before where it's used
Dirk Pranke 2014/11/13 05:49:36 Will do.
Dirk Pranke 2014/11/14 23:03:22 Done.
199 """Copy both the msvcr and msvcp runtime DLLs, only if the target doesn't
200 exist, but the target directory does exist."""
201 def copy_runtime_impl(target, source):
202 """Copy |source| to |target| if it doesn't already exist or if it
203 needs to be updated.
204 """
205 if (os.path.isdir(os.path.dirname(target)) and
206 (not os.path.isfile(target) or
207 os.stat(target).st_mtime != os.stat(source).st_mtime)):
208 print 'Copying %s to %s...' % (source, target)
209 if os.path.exists(target):
210 os.unlink(target)
211 shutil.copy2(source, target)
212
213 for which in ('p', 'r'):
214 dll = dll_pattern % which
215 target = os.path.join(target_dir, dll)
216 source = os.path.join(source_dir, dll)
217 copy_runtime_impl(target, source)
198 218
199 219
200 if __name__ == '__main__': 220 if __name__ == '__main__':
201 sys.exit(main()) 221 sys.exit(main())
OLDNEW
« build/toolchain/win/BUILD.gn ('K') | « build/toolchain/win/BUILD.gn ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698