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 = '301384' | 30 CLANG_REVISION = '301384' |
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 # In package.py we copy the .so into our package. |
| 569 tcmalloc_ldflags = ['-L' + BINUTILS_LIB_DIR, '-ltcmalloc_minimal'] |
| 570 # Make sure that tblgen and the test suite can find tcmalloc. |
| 571 os.environ['LD_LIBRARY_PATH'] = \ |
| 572 BINUTILS_LIB_DIR + os.pathsep + os.environ.get('LD_LIBRARY_PATH', '') |
| 573 |
568 lto_cflags = ['-flto=thin'] | 574 lto_cflags = ['-flto=thin'] |
569 lto_ldflags = ['-fuse-ld=lld'] | 575 lto_ldflags = ['-fuse-ld=lld'] |
570 if args.gcc_toolchain: | 576 if args.gcc_toolchain: |
571 # Tell the bootstrap compiler to use a specific gcc prefix to search | 577 # Tell the bootstrap compiler to use a specific gcc prefix to search |
572 # for standard library headers and shared object files. | 578 # for standard library headers and shared object files. |
573 lto_cflags += ['--gcc-toolchain=' + args.gcc_toolchain] | 579 lto_cflags += ['--gcc-toolchain=' + args.gcc_toolchain] |
574 lto_cmake_args = base_cmake_args + [ | 580 lto_cmake_args = base_cmake_args + [ |
575 '-DLLVM_BINUTILS_INCDIR=' + binutils_incdir, | 581 '-DLLVM_BINUTILS_INCDIR=' + binutils_incdir, |
576 '-DCMAKE_C_COMPILER=' + cc, | 582 '-DCMAKE_C_COMPILER=' + cc, |
577 '-DCMAKE_CXX_COMPILER=' + cxx, | 583 '-DCMAKE_CXX_COMPILER=' + cxx, |
578 '-DCMAKE_C_FLAGS=' + ' '.join(lto_cflags), | 584 '-DCMAKE_C_FLAGS=' + ' '.join(lto_cflags), |
579 '-DCMAKE_CXX_FLAGS=' + ' '.join(lto_cflags), | 585 '-DCMAKE_CXX_FLAGS=' + ' '.join(lto_cflags), |
580 '-DCMAKE_EXE_LINKER_FLAGS=' + ' '.join(lto_ldflags), | 586 '-DCMAKE_EXE_LINKER_FLAGS=' + ' '.join(lto_ldflags + tcmalloc_ldflags), |
581 '-DCMAKE_SHARED_LINKER_FLAGS=' + ' '.join(lto_ldflags), | 587 '-DCMAKE_SHARED_LINKER_FLAGS=' + ' '.join(lto_ldflags), |
582 '-DCMAKE_MODULE_LINKER_FLAGS=' + ' '.join(lto_ldflags)] | 588 '-DCMAKE_MODULE_LINKER_FLAGS=' + ' '.join(lto_ldflags)] |
583 | 589 |
584 # We need to use the proper binutils which support LLVM Gold plugin. | 590 # We need to use the proper binutils which support LLVM Gold plugin. |
585 lto_env = os.environ.copy() | 591 lto_env = os.environ.copy() |
586 lto_env['PATH'] = BINUTILS_BIN_DIR + os.pathsep + lto_env.get('PATH', '') | 592 lto_env['PATH'] = BINUTILS_BIN_DIR + os.pathsep + lto_env.get('PATH', '') |
587 | 593 |
588 RmCmakeCache('.') | 594 RmCmakeCache('.') |
589 RunCommand(['cmake'] + lto_cmake_args + [LLVM_DIR], env=lto_env) | 595 RunCommand(['cmake'] + lto_cmake_args + [LLVM_DIR], env=lto_env) |
590 RunCommand(['ninja', 'LLVMgold', 'lld'], env=lto_env) | 596 RunCommand(['ninja', 'LLVMgold', 'lld'], env=lto_env) |
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
908 args.force_local_build = True | 914 args.force_local_build = True |
909 if 'OS=android' not in os.environ.get('GYP_DEFINES', ''): | 915 if 'OS=android' not in os.environ.get('GYP_DEFINES', ''): |
910 # Only build the Android ASan rt on ToT bots when targetting Android. | 916 # Only build the Android ASan rt on ToT bots when targetting Android. |
911 args.with_android = False | 917 args.with_android = False |
912 | 918 |
913 return UpdateClang(args) | 919 return UpdateClang(args) |
914 | 920 |
915 | 921 |
916 if __name__ == '__main__': | 922 if __name__ == '__main__': |
917 sys.exit(main()) | 923 sys.exit(main()) |
OLD | NEW |