diff options
author | dcheng <dcheng@chromium.org> | 2015-04-07 18:09:49 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-04-08 01:10:23 +0000 |
commit | 8caa594c291b6dd3e35d60a886ef33b36ae78e97 (patch) | |
tree | 76d37b62d0e969ca55526f2c5f8fcec92c7913fd /tools/clang | |
parent | c3a23f04cab52b8e5ba02a724237fcb65bb0e354 (diff) | |
download | chromium_src-8caa594c291b6dd3e35d60a886ef33b36ae78e97.zip chromium_src-8caa594c291b6dd3e35d60a886ef33b36ae78e97.tar.gz chromium_src-8caa594c291b6dd3e35d60a886ef33b36ae78e97.tar.bz2 |
Add the ability to build Chrome tools to the Win Clang build script.
BUG=424436,467287
Committed: https://crrev.com/475949d9430b6a759ce759f2133dd3a1577d0d0b
Cr-Commit-Position: refs/heads/master@{#324089}
Review URL: https://codereview.chromium.org/1068603002
Cr-Commit-Position: refs/heads/master@{#324164}
Diffstat (limited to 'tools/clang')
-rwxr-xr-x | tools/clang/scripts/update.py | 56 |
1 files changed, 49 insertions, 7 deletions
diff --git a/tools/clang/scripts/update.py b/tools/clang/scripts/update.py index c77a4fb..b3067e0 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,32 @@ 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 + tool detection logic munges them in a weird way.""" + assert not any(i in os.path.basename(CHROME_TOOLS_SHIM_DIR) for i in '-_') + os.mkdir(CHROME_TOOLS_SHIM_DIR) + with file(os.path.join(CHROME_TOOLS_SHIM_DIR, 'CMakeLists.txt'), 'w') as f: + f.write('# Automatically generated by tools/clang/scripts/update.py. ' + + 'Do not edit.\n') + f.write('# Since tools/clang is located in another directory, use the \n') + f.write('# two arg 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} ' + + '${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 +209,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 +250,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 +312,13 @@ 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') + parser.add_argument('--tools', nargs='*') + # For now, this flag is only used for the non-Windows flow, but argparser gets + # mad if it sees a flag it doesn't recognize. + parser.add_argument('--if-needed', action='store_true') + return UpdateClang(parser.parse_args()) if __name__ == '__main__': |