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

Side by Side Diff: tools/clang/scripts/update.py

Issue 137823014: Start landing build support for Clang-style ASan on Windows (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 6 years, 10 months 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
« no previous file with comments | « build/common.gypi ('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 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 """Windows can't run .sh files, so this is a Python implementation of 6 """Windows can't run .sh files, so this is a Python implementation of
7 update.sh. This script should replace update.sh on all platforms eventually.""" 7 update.sh. This script should replace update.sh on all platforms eventually."""
8 8
9 import os 9 import os
10 import re 10 import re
11 import shutil
11 import subprocess 12 import subprocess
12 import sys 13 import sys
13 14
14 # Do NOT CHANGE this if you don't know what you're doing -- see 15 # Do NOT CHANGE this if you don't know what you're doing -- see
15 # https://code.google.com/p/chromium/wiki/UpdatingClang 16 # https://code.google.com/p/chromium/wiki/UpdatingClang
16 # Reverting problematic clang rolls is safe, though. 17 # Reverting problematic clang rolls is safe, though.
17 # Note: this revision is only used for Windows. Other platforms use update.sh. 18 # Note: this revision is only used for Windows. Other platforms use update.sh.
18 LLVM_WINDOWS_REVISION = '201859' 19 LLVM_WINDOWS_REVISION = '201860'
19 20
20 # Path constants. (All of these should be absolute paths.) 21 # Path constants. (All of these should be absolute paths.)
21 THIS_DIR = os.path.abspath(os.path.dirname(__file__)) 22 THIS_DIR = os.path.abspath(os.path.dirname(__file__))
22 CHROMIUM_DIR = os.path.abspath(os.path.join(THIS_DIR, '..', '..', '..')) 23 CHROMIUM_DIR = os.path.abspath(os.path.join(THIS_DIR, '..', '..', '..'))
23 LLVM_DIR = os.path.join(CHROMIUM_DIR, 'third_party', 'llvm') 24 LLVM_DIR = os.path.join(CHROMIUM_DIR, 'third_party', 'llvm')
24 LLVM_BUILD_DIR = os.path.join(CHROMIUM_DIR, 'third_party', 'llvm-build', 25 LLVM_BUILD_DIR = os.path.join(CHROMIUM_DIR, 'third_party', 'llvm-build',
25 'Release+Asserts') 26 'Release+Asserts')
27 COMPILER_RT_BUILD_DIR = os.path.join(LLVM_BUILD_DIR, '32bit-compiler-rt')
26 CLANG_DIR = os.path.join(LLVM_DIR, 'tools', 'clang') 28 CLANG_DIR = os.path.join(LLVM_DIR, 'tools', 'clang')
27 COMPILER_RT_DIR = os.path.join(LLVM_DIR, 'projects', 'compiler-rt') 29 COMPILER_RT_DIR = os.path.join(LLVM_DIR, 'projects', 'compiler-rt')
28 STAMP_FILE = os.path.join(LLVM_BUILD_DIR, 'cr_build_revision') 30 STAMP_FILE = os.path.join(LLVM_BUILD_DIR, 'cr_build_revision')
29 31
30 LLVM_REPO_URL='https://llvm.org/svn/llvm-project' 32 LLVM_REPO_URL='https://llvm.org/svn/llvm-project'
31 if 'LLVM_REPO_URL' in os.environ: 33 if 'LLVM_REPO_URL' in os.environ:
32 LLVM_REPO_URL = os.environ['LLVM_REPO_URL'] 34 LLVM_REPO_URL = os.environ['LLVM_REPO_URL']
33 35
34 36
35 def ReadStampFile(): 37 def ReadStampFile():
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
127 os.makedirs(LLVM_BUILD_DIR) 129 os.makedirs(LLVM_BUILD_DIR)
128 os.chdir(LLVM_BUILD_DIR) 130 os.chdir(LLVM_BUILD_DIR)
129 131
130 if not re.search(r'cmake', os.environ['PATH'], flags=re.IGNORECASE): 132 if not re.search(r'cmake', os.environ['PATH'], flags=re.IGNORECASE):
131 # If CMake is not on the path, try looking in a standard location. 133 # If CMake is not on the path, try looking in a standard location.
132 os.environ['PATH'] += os.pathsep + 'C:\\Program Files (x86)\\CMake 2.8\\bin' 134 os.environ['PATH'] += os.pathsep + 'C:\\Program Files (x86)\\CMake 2.8\\bin'
133 135
134 RunCommand(GetVSVersion().SetupScript('x64') + 136 RunCommand(GetVSVersion().SetupScript('x64') +
135 ['&&', 'cmake', '-GNinja', '-DCMAKE_BUILD_TYPE=Release', 137 ['&&', 'cmake', '-GNinja', '-DCMAKE_BUILD_TYPE=Release',
136 '-DLLVM_ENABLE_ASSERTIONS=ON', LLVM_DIR]) 138 '-DLLVM_ENABLE_ASSERTIONS=ON', LLVM_DIR])
139 RunCommand(GetVSVersion().SetupScript('x64') + ['&&', 'ninja', 'all'])
137 140
138 RunCommand(GetVSVersion().SetupScript('x64') + ['&&', 'ninja', 'all']) 141 # Do an x86 build of compiler-rt to get the 32-bit ASan run-time.
142 # TODO(hans): Remove once the regular build above produces this.
143 if not os.path.exists(COMPILER_RT_BUILD_DIR):
144 os.makedirs(COMPILER_RT_BUILD_DIR)
145 os.chdir(COMPILER_RT_BUILD_DIR)
146 RunCommand(GetVSVersion().SetupScript('x86') +
147 ['&&', 'cmake', '-GNinja', '-DCMAKE_BUILD_TYPE=Release',
148 '-DLLVM_ENABLE_ASSERTIONS=ON', LLVM_DIR])
149 RunCommand(GetVSVersion().SetupScript('x86') + ['&&', 'ninja', 'compiler-rt'])
150 asan_rt_lib_src_dir = os.path.join(COMPILER_RT_BUILD_DIR, 'lib', 'clang',
151 '3.5', 'lib', 'windows')
152 asan_rt_lib_dst_dir = os.path.join(LLVM_BUILD_DIR, 'lib', 'clang',
153 '3.5', 'lib', 'windows')
154 if not os.path.exists(asan_rt_lib_dst_dir):
155 os.makedirs(asan_rt_lib_dst_dir)
156 for root, _, files in os.walk(asan_rt_lib_src_dir):
157 for f in files:
158 if re.match(r'^.*-i386\.lib$', f):
159 shutil.copy(os.path.join(root, f), asan_rt_lib_dst_dir)
160 print "Copying %s to %s" % (f, asan_rt_lib_dst_dir)
139 161
140 WriteStampFile(LLVM_WINDOWS_REVISION) 162 WriteStampFile(LLVM_WINDOWS_REVISION)
141 print 'Clang update was successful.' 163 print 'Clang update was successful.'
142 return 0 164 return 0
143 165
144 166
145 def main(): 167 def main():
146 if not sys.platform in ['win32', 'cygwin']: 168 if not sys.platform in ['win32', 'cygwin']:
147 # For non-Windows, fall back to update.sh. 169 # For non-Windows, fall back to update.sh.
148 # TODO(hans): Make update.py replace update.sh completely. 170 # TODO(hans): Make update.py replace update.sh completely.
149 171
150 # This script is called by gclient. gclient opens its hooks subprocesses 172 # This script is called by gclient. gclient opens its hooks subprocesses
151 # with (stdout=subprocess.PIPE, stderr=subprocess.STDOUT) and then does 173 # with (stdout=subprocess.PIPE, stderr=subprocess.STDOUT) and then does
152 # custom output processing that breaks printing '\r' characters for 174 # custom output processing that breaks printing '\r' characters for
153 # single-line updating status messages as printed by curl and wget. 175 # single-line updating status messages as printed by curl and wget.
154 # Work around this by setting stderr of the update.sh process to stdin (!): 176 # Work around this by setting stderr of the update.sh process to stdin (!):
155 # gclient doesn't redirect stdin, and while stdin itself is read-only, a 177 # gclient doesn't redirect stdin, and while stdin itself is read-only, a
156 # dup()ed sys.stdin is writable, try 178 # dup()ed sys.stdin is writable, try
157 # fd2 = os.dup(sys.stdin.fileno()); os.write(fd2, 'hi') 179 # fd2 = os.dup(sys.stdin.fileno()); os.write(fd2, 'hi')
158 # TODO: Fix gclient instead, http://crbug.com/95350 180 # TODO: Fix gclient instead, http://crbug.com/95350
159 return subprocess.call( 181 return subprocess.call(
160 [os.path.join(os.path.dirname(__file__), 'update.sh')] + sys.argv[1:], 182 [os.path.join(os.path.dirname(__file__), 'update.sh')] + sys.argv[1:],
161 stderr=os.fdopen(os.dup(sys.stdin.fileno()))) 183 stderr=os.fdopen(os.dup(sys.stdin.fileno())))
162 184
163 if not re.search('clang=1', os.environ.get('GYP_DEFINES', '')): 185 if not re.search('(clang|asan)=1', os.environ.get('GYP_DEFINES', '')):
164 print 'Skipping Clang update (clang=1 was not set in GYP_DEFINES).' 186 print 'Skipping Clang update (clang=1 was not set in GYP_DEFINES).'
165 return 0 187 return 0
166 188
167 return UpdateClang() 189 return UpdateClang()
168 190
169 191
170 if __name__ == '__main__': 192 if __name__ == '__main__':
171 sys.exit(main()) 193 sys.exit(main())
OLDNEW
« no previous file with comments | « build/common.gypi ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698