def toolchain(self) -> toolchains.Toolchain: return toolchains.get_runtime_toolchain()
def toolchain(self) -> toolchains.Toolchain: """Returns the toolchain used for this target.""" return toolchains.get_runtime_toolchain()
def package_toolchain(build_dir, build_name, host: hosts.Host, dist_dir, strip=True, create_tar=True): package_name = 'clang-' + build_name version = extract_clang_version(build_dir) install_dir = get_package_install_path(host, package_name) install_host_dir = os.path.realpath(os.path.join(install_dir, '../')) # Remove any previously installed toolchain so it doesn't pollute the # build. if os.path.exists(install_host_dir): shutil.rmtree(install_host_dir) # First copy over the entire set of output objects. shutil.copytree(build_dir, install_dir, symlinks=True) ext = '.exe' if host.is_windows else '' shlib_ext = '.dll' if host.is_windows else '.so' if host.is_linux else '.dylib' # Next, we remove unnecessary binaries. necessary_bin_files = { 'clang' + ext, 'clang++' + ext, 'clang-' + version.major_version() + ext, 'clang-check' + ext, 'clang-cl' + ext, 'clang-format' + ext, 'clang-tidy' + ext, 'dsymutil' + ext, 'git-clang-format', # No extension here 'ld.lld' + ext, 'ld64.lld' + ext, 'lld' + ext, 'lld-link' + ext, 'llvm-addr2line' + ext, 'llvm-ar' + ext, 'llvm-as' + ext, 'llvm-cfi-verify' + ext, 'llvm-config' + ext, 'llvm-cov' + ext, 'llvm-dis' + ext, 'llvm-dwarfdump' + ext, 'llvm-lib' + ext, 'llvm-link' + ext, 'llvm-modextract' + ext, 'llvm-nm' + ext, 'llvm-objcopy' + ext, 'llvm-objdump' + ext, 'llvm-profdata' + ext, 'llvm-ranlib' + ext, 'llvm-rc' + ext, 'llvm-readelf' + ext, 'llvm-readobj' + ext, 'llvm-size' + ext, 'llvm-strings' + ext, 'llvm-strip' + ext, 'llvm-symbolizer' + ext, 'sancov' + ext, 'sanstats' + ext, 'scan-build' + ext, 'scan-view' + ext, } if BUILD_LLDB: necessary_bin_files.update({ 'lldb-argdumper' + ext, 'lldb' + ext, }) if host.is_windows: windows_blacklist_bin_files = { 'clang-' + version.major_version() + ext, 'scan-build' + ext, 'scan-view' + ext, } necessary_bin_files -= windows_blacklist_bin_files if BUILD_LLDB: install_lldb_deps(Path(install_dir), host) if host.is_windows: windows_additional_bin_files = { 'liblldb' + shlib_ext, 'python38' + shlib_ext } necessary_bin_files |= windows_additional_bin_files # scripts that should not be stripped script_bins = { 'git-clang-format', 'scan-build', 'scan-view', } bin_dir = os.path.join(install_dir, 'bin') lib_dir = os.path.join(install_dir, 'lib64') strip_cmd = toolchains.get_runtime_toolchain().strip for bin_filename in os.listdir(bin_dir): binary = os.path.join(bin_dir, bin_filename) if os.path.isfile(binary): if bin_filename not in necessary_bin_files: remove(binary) elif strip and bin_filename not in script_bins: # Strip all non-global symbols and debug info. # These specific flags prevent Darwin executables from being # stripped of additional global symbols that might be used # by plugins. utils.check_call([strip_cmd, '-S', '-x', binary]) # FIXME: check that all libs under lib64/clang/<version>/ are created. for necessary_bin_file in necessary_bin_files: if not os.path.isfile(os.path.join(bin_dir, necessary_bin_file)): raise RuntimeError('Did not find %s in %s' % (necessary_bin_file, bin_dir)) necessary_lib_files = { 'libc++.a', 'libc++abi.a', } if host.is_windows: necessary_lib_files |= { 'LLVMgold' + shlib_ext, 'libwinpthread-1' + shlib_ext, } # For Windows, add other relevant libraries. install_winpthreads(bin_dir, lib_dir) # Remove unnecessary static libraries. remove_static_libraries(lib_dir, necessary_lib_files) if not host.is_windows: install_wrappers(install_dir) normalize_llvm_host_libs(install_dir, host, version) # Check necessary lib files exist. for necessary_lib_file in necessary_lib_files: if not os.path.isfile(os.path.join(lib_dir, necessary_lib_file)): raise RuntimeError('Did not find %s in %s' % (necessary_lib_file, lib_dir)) # Next, we copy over stdatomic.h and bits/stdatomic.h from bionic. libc_include_path = utils.android_path('bionic', 'libc', 'include') resdir_top = os.path.join(lib_dir, 'clang') header_path = os.path.join(resdir_top, version.long_version(), 'include') stdatomic_path = utils.android_path(libc_include_path, 'stdatomic.h') install_file(stdatomic_path, header_path) bits_install_path = os.path.join(header_path, 'bits') if not os.path.isdir(bits_install_path): os.mkdir(bits_install_path) bits_stdatomic_path = utils.android_path(libc_include_path, 'bits', 'stdatomic.h') install_file(bits_stdatomic_path, bits_install_path) # Install license files as NOTICE in the toolchain install dir. install_license_files(install_dir) # Add an AndroidVersion.txt file. version_file_path = os.path.join(install_dir, 'AndroidVersion.txt') with open(version_file_path, 'w') as version_file: version_file.write('{}\n'.format(version.long_version())) svn_revision = android_version.get_svn_revision(BUILD_LLVM_NEXT) version_file.write('based on {}\n'.format(svn_revision)) # Create RBE input files. if host.is_linux: with open(os.path.join(install_dir, 'bin', 'remote_toolchain_inputs'), 'w') as inputs_file: dependencies = ('clang\n' 'clang++\n' 'clang.real\n' 'clang++.real\n' 'clang-tidy\n' 'clang-tidy.real\n' '../lib64/libc++.so.1\n' 'lld\n' 'ld64.lld\n' 'ld.lld\n' ) blacklist_dir = os.path.join('../', 'lib64', 'clang', version.long_version(), 'share\n') libs_dir = os.path.join('../', 'lib64', 'clang', version.long_version(), 'lib', 'linux\n') dependencies += (blacklist_dir + libs_dir) inputs_file.write(dependencies) # Package up the resulting trimmed install/ directory. if create_tar: tarball_name = package_name + '-' + host.os_tag package_path = os.path.join(dist_dir, tarball_name) + '.tar.bz2' logger().info('Packaging %s', package_path) args = ['tar', '-cjC', install_host_dir, '-f', package_path, package_name] utils.check_call(args)