Chromium Code Reviews| Index: tools/clang/scripts/update.py |
| diff --git a/tools/clang/scripts/update.py b/tools/clang/scripts/update.py |
| index c77a4fb84c98551e3f1cc80ab7230011507872fc..f673bd489195dbb9129aecf5d00b982c2a368b30 100755 |
| --- a/tools/clang/scripts/update.py |
| +++ b/tools/clang/scripts/update.py |
| @@ -6,6 +6,7 @@ |
| """Windows can't run .sh files, so this is a Python implementation of |
| update.sh. This script should replace update.sh on all platforms eventually.""" |
| +import argparse |
| import os |
| import re |
| import shutil |
| @@ -30,6 +31,7 @@ if (re.search(r'\b(asan)=1', os.environ.get('GYP_DEFINES', '')) and |
| THIS_DIR = os.path.abspath(os.path.dirname(__file__)) |
| CHROMIUM_DIR = os.path.abspath(os.path.join(THIS_DIR, '..', '..', '..')) |
| LLVM_DIR = os.path.join(CHROMIUM_DIR, 'third_party', 'llvm') |
| +CHROME_TOOLS_SHIM_DIR = os.path.join(LLVM_DIR, 'tools', 'chrometools') |
| LLVM_BUILD_DIR = os.path.join(CHROMIUM_DIR, 'third_party', 'llvm-build', |
| 'Release+Asserts') |
| COMPILER_RT_BUILD_DIR = os.path.join(LLVM_BUILD_DIR, '32bit-compiler-rt') |
| @@ -129,6 +131,29 @@ def Checkout(name, url, dir): |
| RunCommand(command) |
| +def DeleteChromeToolsShim(): |
| + shutil.rmtree(CHROME_TOOLS_SHIM_DIR) |
| + |
| + |
| +def CreateChromeToolsShim(): |
| + """Hooks the Chrome tools into the LLVM build. |
| + |
| + Several Chrome tools have dependencies on LLVM/Clang libraries. The LLVM build |
| + detects implicit tools in the tools subdirectory, so this helper install a |
| + shim CMakeLists.txt that forwards to the real directory for the Chrome tools. |
| + |
| + Note that the shim directory name intentionally has no _ or _. The implicit |
|
Nico
2015/04/07 04:18:55
_ or _?
dcheng
2015/04/07 07:22:53
Hmm. I copy pasted this from update.sh... and sure
|
| + tool detection logic munges them in a weird way.""" |
|
Nico
2015/04/07 04:18:55
assert not '_'in CHROME_TOOLS_SHIM_DIR
?
dcheng
2015/04/07 07:22:53
Done.
|
| + os.mkdir(CHROME_TOOLS_SHIM_DIR) |
| + with file(os.path.join(CHROME_TOOLS_SHIM_DIR, 'CMakeLists.txt'), 'w') as f: |
|
Nico
2015/04/07 04:18:55
f.write('# Automatically generated by tools/clang/
dcheng
2015/04/07 07:22:53
Done.
|
| + f.write("# Since tools/clang isn't actually a subdirectory, use the two\n") |
|
Nico
2015/04/07 04:18:55
nit: single quotes
dcheng
2015/04/07 07:22:53
Rephrased the text to avoid single quotes so I swi
|
| + f.write("# argument version to specify where build artifacts go. CMake\n") |
| + f.write("# disallows reuse of the same binary dir for multiple source\n") |
| + f.write("# dirs, so the build artifacts need to go into a subdirectory.\n") |
| + f.write("add_subdirectory(${CHROMIUM_TOOLS_SRC} ") |
| + f.write("${CMAKE_CURRENT_BINARY_DIR}/a)\n") |
| + |
| + |
| def AddCMakeToPath(): |
| """Look for CMake and add it to PATH if it's not there already.""" |
| try: |
| @@ -181,30 +206,39 @@ def SubversionCmakeArg(): |
| return '' |
| -def UpdateClang(): |
| +def UpdateClang(args): |
| print 'Updating Clang to %s...' % (LLVM_WIN_REVISION) |
| if LLVM_WIN_REVISION != 'HEAD' and ReadStampFile() == LLVM_WIN_REVISION: |
| print 'Already up to date.' |
| return 0 |
| AddCMakeToPath() |
| - ClobberChromiumBuildFiles() |
| + if args.clobber: |
| + ClobberChromiumBuildFiles() |
| # Reset the stamp file in case the build is unsuccessful. |
| WriteStampFile('') |
| + DeleteChromeToolsShim(); |
| Checkout('LLVM', LLVM_REPO_URL + '/llvm/trunk', LLVM_DIR) |
| Checkout('Clang', LLVM_REPO_URL + '/cfe/trunk', CLANG_DIR) |
| Checkout('LLD', LLVM_REPO_URL + '/lld/trunk', LLD_DIR) |
| Checkout('compiler-rt', LLVM_REPO_URL + '/compiler-rt/trunk', COMPILER_RT_DIR) |
| + CreateChromeToolsShim(); |
| if not os.path.exists(LLVM_BUILD_DIR): |
| os.makedirs(LLVM_BUILD_DIR) |
| os.chdir(LLVM_BUILD_DIR) |
| + cmake_args = ['-GNinja', '-DCMAKE_BUILD_TYPE=Release', |
| + '-DLLVM_ENABLE_ASSERTIONS=ON', SubversionCmakeArg(), |
| + '-DCHROMIUM_TOOLS_SRC=%s' % os.path.join( |
| + CHROMIUM_DIR, 'tools', 'clang')] |
| + if args.tools: |
| + cmake_args.append('-DCHROMIUM_TOOLS=%s' % ';'.join(args.tools)) |
| + |
| RunCommand(GetVSVersion().SetupScript('x64') + |
| - ['&&', 'cmake', '-GNinja', '-DCMAKE_BUILD_TYPE=Release', |
| - '-DLLVM_ENABLE_ASSERTIONS=ON', SubversionCmakeArg(), LLVM_DIR]) |
| + ['&&', 'cmake'] + cmake_args + [LLVM_DIR]) |
| RunCommand(GetVSVersion().SetupScript('x64') + ['&&', 'ninja', 'all']) |
| # Do an x86 build of compiler-rt to get the 32-bit ASan run-time. |
| @@ -213,8 +247,7 @@ def UpdateClang(): |
| os.makedirs(COMPILER_RT_BUILD_DIR) |
| os.chdir(COMPILER_RT_BUILD_DIR) |
| RunCommand(GetVSVersion().SetupScript('x86') + |
| - ['&&', 'cmake', '-GNinja', '-DCMAKE_BUILD_TYPE=Release', |
| - '-DLLVM_ENABLE_ASSERTIONS=ON', LLVM_DIR]) |
| + ['&&', 'cmake'] + cmake_args + [LLVM_DIR]) |
| RunCommand(GetVSVersion().SetupScript('x86') + ['&&', 'ninja', 'compiler-rt']) |
| # TODO(hans): Make this (and the .gypi and .isolate files) version number |
| @@ -276,7 +309,10 @@ def main(): |
| print 'Skipping Clang update (make_clang_dir= was set in GYP_DEFINES).' |
| return 0 |
| - return UpdateClang() |
| + parser = argparse.ArgumentParser(description='Build Clang.') |
| + parser.add_argument('--no-clobber', dest='clobber', action='store_false') |
|
dcheng
2015/04/06 23:09:10
I added this argument, because it makes tool testi
|
| + parser.add_argument('--tools', nargs='*') |
| + return UpdateClang(parser.parse_args()) |
| if __name__ == '__main__': |