Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 """This script is used to download prebuilt clang binaries. | 6 """This script is used to download prebuilt clang binaries. |
| 7 | 7 |
| 8 It is also used by package.py to build the prebuilt clang binaries.""" | 8 It is also used by package.py to build the prebuilt clang binaries.""" |
| 9 | 9 |
| 10 import argparse | 10 import argparse |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 27 # Do NOT CHANGE this if you don't know what you're doing -- see | 27 # Do NOT CHANGE this if you don't know what you're doing -- see |
| 28 # https://chromium.googlesource.com/chromium/src/+/master/docs/updating_clang.md | 28 # https://chromium.googlesource.com/chromium/src/+/master/docs/updating_clang.md |
| 29 # Reverting problematic clang rolls is safe, though. | 29 # Reverting problematic clang rolls is safe, though. |
| 30 CLANG_REVISION = '300839' | 30 CLANG_REVISION = '300839' |
| 31 | 31 |
| 32 use_head_revision = 'LLVM_FORCE_HEAD_REVISION' in os.environ | 32 use_head_revision = 'LLVM_FORCE_HEAD_REVISION' in os.environ |
| 33 if use_head_revision: | 33 if use_head_revision: |
| 34 CLANG_REVISION = 'HEAD' | 34 CLANG_REVISION = 'HEAD' |
| 35 | 35 |
| 36 # This is incremented when pushing a new build of Clang at the same revision. | 36 # This is incremented when pushing a new build of Clang at the same revision. |
| 37 CLANG_SUB_REVISION=1 | 37 CLANG_SUB_REVISION=2 |
| 38 | 38 |
| 39 PACKAGE_VERSION = "%s-%s" % (CLANG_REVISION, CLANG_SUB_REVISION) | 39 PACKAGE_VERSION = "%s-%s" % (CLANG_REVISION, CLANG_SUB_REVISION) |
| 40 | 40 |
| 41 # Path constants. (All of these should be absolute paths.) | 41 # Path constants. (All of these should be absolute paths.) |
| 42 THIS_DIR = os.path.abspath(os.path.dirname(__file__)) | 42 THIS_DIR = os.path.abspath(os.path.dirname(__file__)) |
| 43 CHROMIUM_DIR = os.path.abspath(os.path.join(THIS_DIR, '..', '..', '..')) | 43 CHROMIUM_DIR = os.path.abspath(os.path.join(THIS_DIR, '..', '..', '..')) |
| 44 THIRD_PARTY_DIR = os.path.join(CHROMIUM_DIR, 'third_party') | 44 THIRD_PARTY_DIR = os.path.join(CHROMIUM_DIR, 'third_party') |
| 45 LLVM_DIR = os.path.join(THIRD_PARTY_DIR, 'llvm') | 45 LLVM_DIR = os.path.join(THIRD_PARTY_DIR, 'llvm') |
| 46 LLVM_BOOTSTRAP_DIR = os.path.join(THIRD_PARTY_DIR, 'llvm-bootstrap') | 46 LLVM_BOOTSTRAP_DIR = os.path.join(THIRD_PARTY_DIR, 'llvm-bootstrap') |
| 47 LLVM_BOOTSTRAP_INSTALL_DIR = os.path.join(THIRD_PARTY_DIR, | 47 LLVM_BOOTSTRAP_INSTALL_DIR = os.path.join(THIRD_PARTY_DIR, |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 59 if sys.platform == 'win32': | 59 if sys.platform == 'win32': |
| 60 COMPILER_RT_DIR = os.path.join(LLVM_DIR, 'projects', 'compiler-rt') | 60 COMPILER_RT_DIR = os.path.join(LLVM_DIR, 'projects', 'compiler-rt') |
| 61 else: | 61 else: |
| 62 COMPILER_RT_DIR = os.path.join(LLVM_DIR, 'compiler-rt') | 62 COMPILER_RT_DIR = os.path.join(LLVM_DIR, 'compiler-rt') |
| 63 LIBCXX_DIR = os.path.join(LLVM_DIR, 'projects', 'libcxx') | 63 LIBCXX_DIR = os.path.join(LLVM_DIR, 'projects', 'libcxx') |
| 64 LIBCXXABI_DIR = os.path.join(LLVM_DIR, 'projects', 'libcxxabi') | 64 LIBCXXABI_DIR = os.path.join(LLVM_DIR, 'projects', 'libcxxabi') |
| 65 LLVM_BUILD_TOOLS_DIR = os.path.abspath( | 65 LLVM_BUILD_TOOLS_DIR = os.path.abspath( |
| 66 os.path.join(LLVM_DIR, '..', 'llvm-build-tools')) | 66 os.path.join(LLVM_DIR, '..', 'llvm-build-tools')) |
| 67 STAMP_FILE = os.path.normpath( | 67 STAMP_FILE = os.path.normpath( |
| 68 os.path.join(LLVM_DIR, '..', 'llvm-build', 'cr_build_revision')) | 68 os.path.join(LLVM_DIR, '..', 'llvm-build', 'cr_build_revision')) |
| 69 BINUTILS_DIR = os.path.join(THIRD_PARTY_DIR, 'binutils') | 69 BINUTILS_DIR = os.path.join(THIRD_PARTY_DIR, 'binutils', 'Linux_x64', 'Release') |
| 70 BINUTILS_BIN_DIR = os.path.join(BINUTILS_DIR, BINUTILS_DIR, | 70 BINUTILS_BIN_DIR = os.path.join(BINUTILS_DIR, 'bin') |
| 71 'Linux_x64', 'Release', 'bin') | 71 BINUTILS_LIB_DIR = os.path.join(BINUTILS_DIR, 'lib') |
| 72 BFD_PLUGINS_DIR = os.path.join(BINUTILS_DIR, 'Linux_x64', 'Release', | 72 BFD_PLUGINS_DIR = os.path.join(BINUTILS_LIB_DIR, 'bfd-plugins') |
| 73 'lib', 'bfd-plugins') | |
| 74 VERSION = '5.0.0' | 73 VERSION = '5.0.0' |
| 75 ANDROID_NDK_DIR = os.path.join( | 74 ANDROID_NDK_DIR = os.path.join( |
| 76 CHROMIUM_DIR, 'third_party', 'android_tools', 'ndk') | 75 CHROMIUM_DIR, 'third_party', 'android_tools', 'ndk') |
| 77 | 76 |
| 78 # URL for pre-built binaries. | 77 # URL for pre-built binaries. |
| 79 CDS_URL = os.environ.get('CDS_CLANG_BUCKET_OVERRIDE', | 78 CDS_URL = os.environ.get('CDS_CLANG_BUCKET_OVERRIDE', |
| 80 'https://commondatastorage.googleapis.com/chromium-browser-clang') | 79 'https://commondatastorage.googleapis.com/chromium-browser-clang') |
| 81 | 80 |
| 82 LLVM_REPO_URL='https://llvm.org/svn/llvm-project' | 81 LLVM_REPO_URL='https://llvm.org/svn/llvm-project' |
| 83 if 'LLVM_REPO_URL' in os.environ: | 82 if 'LLVM_REPO_URL' in os.environ: |
| (...skipping 412 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 496 | 495 |
| 497 base_cmake_args = ['-GNinja', | 496 base_cmake_args = ['-GNinja', |
| 498 '-DCMAKE_BUILD_TYPE=Release', | 497 '-DCMAKE_BUILD_TYPE=Release', |
| 499 '-DLLVM_ENABLE_ASSERTIONS=ON', | 498 '-DLLVM_ENABLE_ASSERTIONS=ON', |
| 500 # Statically link MSVCRT to avoid DLL dependencies. | 499 # Statically link MSVCRT to avoid DLL dependencies. |
| 501 '-DLLVM_USE_CRT_RELEASE=MT', | 500 '-DLLVM_USE_CRT_RELEASE=MT', |
| 502 ] | 501 ] |
| 503 | 502 |
| 504 binutils_incdir = '' | 503 binutils_incdir = '' |
| 505 if sys.platform.startswith('linux'): | 504 if sys.platform.startswith('linux'): |
| 506 binutils_incdir = os.path.join(BINUTILS_DIR, 'Linux_x64/Release/include') | 505 binutils_incdir = os.path.join(BINUTILS_DIR, 'include') |
| 507 | 506 |
| 508 if args.bootstrap: | 507 if args.bootstrap: |
| 509 print 'Building bootstrap compiler' | 508 print 'Building bootstrap compiler' |
| 510 EnsureDirExists(LLVM_BOOTSTRAP_DIR) | 509 EnsureDirExists(LLVM_BOOTSTRAP_DIR) |
| 511 os.chdir(LLVM_BOOTSTRAP_DIR) | 510 os.chdir(LLVM_BOOTSTRAP_DIR) |
| 512 bootstrap_args = base_cmake_args + [ | 511 bootstrap_args = base_cmake_args + [ |
| 513 '-DLLVM_BINUTILS_INCDIR=' + binutils_incdir, | 512 '-DLLVM_BINUTILS_INCDIR=' + binutils_incdir, |
| 514 '-DLLVM_TARGETS_TO_BUILD=host', | 513 '-DLLVM_TARGETS_TO_BUILD=host', |
| 515 '-DCMAKE_INSTALL_PREFIX=' + LLVM_BOOTSTRAP_INSTALL_DIR, | 514 '-DCMAKE_INSTALL_PREFIX=' + LLVM_BOOTSTRAP_INSTALL_DIR, |
| 516 '-DCMAKE_C_FLAGS=' + ' '.join(cflags), | 515 '-DCMAKE_C_FLAGS=' + ' '.join(cflags), |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 558 EnsureDirExists(LLVM_LTO_GOLD_PLUGIN_DIR) | 557 EnsureDirExists(LLVM_LTO_GOLD_PLUGIN_DIR) |
| 559 os.chdir(LLVM_LTO_GOLD_PLUGIN_DIR) | 558 os.chdir(LLVM_LTO_GOLD_PLUGIN_DIR) |
| 560 | 559 |
| 561 # Create a symlink to LLVMgold.so build in the previous step so that ar | 560 # Create a symlink to LLVMgold.so build in the previous step so that ar |
| 562 # and ranlib could find it while linking LLVMgold.so with LTO. | 561 # and ranlib could find it while linking LLVMgold.so with LTO. |
| 563 EnsureDirExists(BFD_PLUGINS_DIR) | 562 EnsureDirExists(BFD_PLUGINS_DIR) |
| 564 RunCommand(['ln', '-sf', | 563 RunCommand(['ln', '-sf', |
| 565 os.path.join(LLVM_BOOTSTRAP_INSTALL_DIR, 'lib', 'LLVMgold.so'), | 564 os.path.join(LLVM_BOOTSTRAP_INSTALL_DIR, 'lib', 'LLVMgold.so'), |
| 566 os.path.join(BFD_PLUGINS_DIR, 'LLVMgold.so')]) | 565 os.path.join(BFD_PLUGINS_DIR, 'LLVMgold.so')]) |
| 567 | 566 |
| 567 # Link against binutils's copy of tcmalloc to speed up the linker by ~10%. | |
| 568 tcmalloc_ldflags = [ | |
| 569 '-L' + BINUTILS_LIB_DIR, '-ltcmalloc_minimal', | |
| 570 '-Wl,-rpath,\\$ORIGIN/../../../binutils/Linux_x64/Release/lib'] | |
|
hans
2017/04/28 23:23:26
Does package.py need an update to include the .so?
pcc1
2017/04/28 23:27:16
The .so is part of binutils, so wouldn't it come w
| |
| 571 | |
| 568 lto_cflags = ['-flto=thin'] | 572 lto_cflags = ['-flto=thin'] |
| 569 lto_ldflags = ['-fuse-ld=lld'] | 573 lto_ldflags = ['-fuse-ld=lld'] |
| 570 if args.gcc_toolchain: | 574 if args.gcc_toolchain: |
| 571 # Tell the bootstrap compiler to use a specific gcc prefix to search | 575 # Tell the bootstrap compiler to use a specific gcc prefix to search |
| 572 # for standard library headers and shared object files. | 576 # for standard library headers and shared object files. |
| 573 lto_cflags += ['--gcc-toolchain=' + args.gcc_toolchain] | 577 lto_cflags += ['--gcc-toolchain=' + args.gcc_toolchain] |
| 574 lto_cmake_args = base_cmake_args + [ | 578 lto_cmake_args = base_cmake_args + [ |
| 575 '-DLLVM_BINUTILS_INCDIR=' + binutils_incdir, | 579 '-DLLVM_BINUTILS_INCDIR=' + binutils_incdir, |
| 576 '-DCMAKE_C_COMPILER=' + cc, | 580 '-DCMAKE_C_COMPILER=' + cc, |
| 577 '-DCMAKE_CXX_COMPILER=' + cxx, | 581 '-DCMAKE_CXX_COMPILER=' + cxx, |
| 578 '-DCMAKE_C_FLAGS=' + ' '.join(lto_cflags), | 582 '-DCMAKE_C_FLAGS=' + ' '.join(lto_cflags), |
| 579 '-DCMAKE_CXX_FLAGS=' + ' '.join(lto_cflags), | 583 '-DCMAKE_CXX_FLAGS=' + ' '.join(lto_cflags), |
| 580 '-DCMAKE_EXE_LINKER_FLAGS=' + ' '.join(lto_ldflags), | 584 '-DCMAKE_EXE_LINKER_FLAGS=' + ' '.join(lto_ldflags + tcmalloc_ldflags), |
| 581 '-DCMAKE_SHARED_LINKER_FLAGS=' + ' '.join(lto_ldflags), | 585 '-DCMAKE_SHARED_LINKER_FLAGS=' + ' '.join(lto_ldflags), |
| 582 '-DCMAKE_MODULE_LINKER_FLAGS=' + ' '.join(lto_ldflags)] | 586 '-DCMAKE_MODULE_LINKER_FLAGS=' + ' '.join(lto_ldflags)] |
| 583 | 587 |
| 584 # We need to use the proper binutils which support LLVM Gold plugin. | 588 # We need to use the proper binutils which support LLVM Gold plugin. |
| 585 lto_env = os.environ.copy() | 589 lto_env = os.environ.copy() |
| 586 lto_env['PATH'] = BINUTILS_BIN_DIR + os.pathsep + lto_env.get('PATH', '') | 590 lto_env['PATH'] = BINUTILS_BIN_DIR + os.pathsep + lto_env.get('PATH', '') |
| 587 | 591 |
| 592 # Also need to make sure that tblgen can find the tcmalloc DSO. | |
| 593 lto_env['LD_LIBRARY_PATH'] = \ | |
| 594 BINUTILS_LIB_DIR + os.pathsep + lto_env.get('LD_LIBRARY_PATH', '') | |
| 595 | |
| 588 RmCmakeCache('.') | 596 RmCmakeCache('.') |
| 589 RunCommand(['cmake'] + lto_cmake_args + [LLVM_DIR], env=lto_env) | 597 RunCommand(['cmake'] + lto_cmake_args + [LLVM_DIR], env=lto_env) |
| 590 RunCommand(['ninja', 'LLVMgold', 'lld'], env=lto_env) | 598 RunCommand(['ninja', 'LLVMgold', 'lld'], env=lto_env) |
| 591 | 599 |
| 592 | 600 |
| 593 # LLVM uses C++11 starting in llvm 3.5. On Linux, this means libstdc++4.7+ is | 601 # LLVM uses C++11 starting in llvm 3.5. On Linux, this means libstdc++4.7+ is |
| 594 # needed, on OS X it requires libc++. clang only automatically links to libc++ | 602 # needed, on OS X it requires libc++. clang only automatically links to libc++ |
| 595 # when targeting OS X 10.9+, so add stdlib=libc++ explicitly so clang can run | 603 # when targeting OS X 10.9+, so add stdlib=libc++ explicitly so clang can run |
| 596 # on OS X versions as old as 10.7. | 604 # on OS X versions as old as 10.7. |
| 597 deployment_target = '' | 605 deployment_target = '' |
| (...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 908 args.force_local_build = True | 916 args.force_local_build = True |
| 909 if 'OS=android' not in os.environ.get('GYP_DEFINES', ''): | 917 if 'OS=android' not in os.environ.get('GYP_DEFINES', ''): |
| 910 # Only build the Android ASan rt on ToT bots when targetting Android. | 918 # Only build the Android ASan rt on ToT bots when targetting Android. |
| 911 args.with_android = False | 919 args.with_android = False |
| 912 | 920 |
| 913 return UpdateClang(args) | 921 return UpdateClang(args) |
| 914 | 922 |
| 915 | 923 |
| 916 if __name__ == '__main__': | 924 if __name__ == '__main__': |
| 917 sys.exit(main()) | 925 sys.exit(main()) |
| OLD | NEW |