diff --git a/llvm-build/build.py b/llvm-build/build.py index bef40a27305b806a335cc673709c4180a0112691..dd6d845f2a479813aa51166960f1a763db192cb4 100755 --- a/llvm-build/build.py +++ b/llvm-build/build.py @@ -85,7 +85,7 @@ class BuildConfig(): self.CLANG_VERSION = prebuilts_clang_version self.MINGW_TRIPLE = 'x86_64-windows-gnu' self.build_libs_with_hb = self.build_libs_flags == 'OH' or self.build_libs_flags == 'BOTH' - + self.ARCHIVE_EXTENSION = '.tar.' + self.compression_format self.ARCHIVE_OPTION = '-c' + ('j' if self.compression_format == "bz2" else 'z') self.LIBXML2_VERSION = None @@ -252,7 +252,7 @@ class BuildConfig(): action='store_true', default=False, help='Enable lldb performance monitoring') - + compression_formats = ['bz2', 'gz'] parser.add_argument( @@ -603,6 +603,15 @@ class BuildUtils(object): return None + def get_libxml2_source_path(self): + return self.merge_out_path('third_party', 'libxml2', ('libxml2-' + self.build_config.LIBXML2_VERSION)) + + def get_libxml2_install_path(self, triple): + return self.merge_out_path('third_party', 'libxml2', 'install', triple) + + def get_libxml2_build_path(self, triple): + return self.merge_out_path('third_party', 'libxml2', 'build', triple) + class LlvmCore(BuildUtils): def __init__(self, build_config): @@ -678,7 +687,7 @@ class LlvmCore(BuildUtils): llvm_defines['LibEdit_LIBRARIES'] = os.path.join(self.get_prebuilts_dir('libedit'), 'lib', 'libedit.0.dylib') if self.build_config.build_libxml2: - llvm_defines['LIBXML2_LIBRARIES'] = os.path.join(self.get_prebuilts_dir('libxml2'), self.use_platform(), 'lib', f'libxml2.{self.build_config.LIBXML2_VERSION}.dylib') + llvm_defines['LIBXML2_LIBRARIES'] = os.path.join(self.get_libxml2_install_path(self.use_platform()), 'lib', f'libxml2.{self.build_config.LIBXML2_VERSION}.dylib') def llvm_compile_linux_defines(self, @@ -724,7 +733,7 @@ class LlvmCore(BuildUtils): llvm_defines['LLVM_ENABLE_LTO'] = 'Thin' if self.build_config.build_libxml2: - llvm_defines['LIBXML2_LIBRARY'] = os.path.join(self.get_prebuilts_dir('libxml2'), self.use_platform(), 'lib', f'libxml2.so.{self.build_config.LIBXML2_VERSION}') + llvm_defines['LIBXML2_LIBRARY'] = os.path.join(self.get_libxml2_install_path(self.use_platform()), 'lib', f'libxml2.so.{self.build_config.LIBXML2_VERSION}') def llvm_compile_llvm_defines(self, llvm_defines, llvm_root, cflags, ldflags): llvm_defines['LLVM_ENABLE_PROJECTS'] = ';'.join(self.build_config.host_projects) @@ -773,8 +782,8 @@ class LlvmCore(BuildUtils): if self.build_config.build_libxml2: llvm_defines['LLDB_ENABLE_LIBXML2'] = 'ON' - llvm_defines['LIBXML2_INCLUDE_DIR'] = os.path.join(self.get_prebuilts_dir('libxml2'), self.use_platform(), 'include', 'libxml2') - + llvm_defines['LIBXML2_INCLUDE_DIR'] = os.path.join(self.get_libxml2_install_path(self.use_platform()), 'include', 'libxml2') + if self.build_config.enable_monitoring: llvm_defines['LLDB_ENABLE_PERFORMANCE'] = 'ON' @@ -899,8 +908,8 @@ class LlvmCore(BuildUtils): if self.build_config.build_libxml2: windows_defines['LLDB_ENABLE_LIBXML2'] = 'ON' - windows_defines['LIBXML2_INCLUDE_DIR'] = os.path.join(self.get_prebuilts_dir('libxml2'), 'windows-x86_64', 'include', 'libxml2') - windows_defines['LIBXML2_LIBRARY'] = os.path.join(self.get_prebuilts_dir('libxml2'), 'windows-x86_64', 'lib', 'libxml2.dll.a') + windows_defines['LIBXML2_INCLUDE_DIR'] = os.path.join(self.get_libxml2_install_path('windows-x86_64'), 'include', 'libxml2') + windows_defines['LIBXML2_LIBRARY'] = os.path.join(self.get_libxml2_install_path('windows-x86_64'), 'lib', 'libxml2.dll.a') if self.build_config.enable_monitoring: windows_defines['LLDB_ENABLE_PERFORMANCE'] = 'ON' @@ -1051,7 +1060,7 @@ class SysrootComposer(BuildUtils): target_cpu, '--build-target', target_name, '--gn-args', gn_args, llvm_gn_args, '--deps-guard=false'], shell=False, stdout=subprocess.PIPE, cwd=self.build_config.REPOROOT_DIR) - + def build_musl_libs(self, product_name, target_cpu, target_name, ohos_lib_dir, sysroot_lib_dir, ld_musl_lib, gn_args=''): self.run_hb_build(product_name, target_cpu, target_name, gn_args) @@ -1245,7 +1254,7 @@ class LlvmLibs(BuildUtils): ldflag.append('-Wl,-z,relro,-z,now -pie') if self.build_config.strip and not self.build_config.no_strip_libs: ldflag.append('-s') - + ldflags.extend(ldflag) cflag = [ @@ -1258,7 +1267,7 @@ class LlvmLibs(BuildUtils): cflag.append('-g') cflags.extend(cflag) - + def run_hb_build_libs(self, libs_name): gn_args = 'build_libs_flags={} llvm_lib={}'.format(self.build_config.build_libs_flags, libs_name) self.sysroot_composer.run_hb_build('llvm_build', 'arm', 'build_libs', gn_args) @@ -1319,7 +1328,7 @@ class LlvmLibs(BuildUtils): self.open_ohos_triple('mipsel'), self.open_ohos_triple('x86_64')] libcxx_ndk_install = self.merge_out_path('libcxx-ndk') self.check_create_dir(libcxx_ndk_install) - + if precompilation: self.build_crts(llvm_install, arch, llvm_triple, cflags, ldflags, multilib_suffix, defines) continue @@ -1681,6 +1690,13 @@ class LlvmLibs(BuildUtils): lldb_defines['LIBLLDB_BUILD_STATIC'] = 'ON' lldb_target.append('lldb') + if self.build_config.build_libxml2: + self.build_libxml2(llvm_triple, None, llvm_install) + lldb_defines['LLDB_ENABLE_LIBXML2'] = 'ON' + libxml2_install_path = self.get_libxml2_install_path(llvm_triple) + lldb_defines['LIBXML2_INCLUDE_DIR'] = os.path.join(libxml2_install_path, 'include', 'libxml2') + lldb_defines['LIBXML2_LIBRARY'] = os.path.join(libxml2_install_path, 'lib', 'libxml2.a') + if self.build_config.lldb_timeout: lldb_defines['LLDB_ENABLE_TIMEOUT'] = 'True' @@ -1841,39 +1857,64 @@ class LlvmLibs(BuildUtils): return libxml2_defines - def build_libxml2(self, llvm_make, llvm_install): - self.logger().info('Building libxml2') + def build_libxml2(self, triple, llvm_make, llvm_install): + self.logger().info('Building libxml2 for %s', triple) - libxml2_defines = self.build_libxml2_defines() + cmake_path = self.get_libxml2_source_path() + if not os.path.exists(cmake_path): + package_path = os.path.join(self.build_config.REPOROOT_DIR, 'third_party', 'libxml2') + untar_py = os.path.join(package_path, 'install.py') + untar_path = self.merge_out_path('third_party', 'libxml2') + self.check_create_dir(untar_path) + subprocess.run(['python3', untar_py, '--gen-dir', untar_path, '--source-file', package_path]) - libxml2_cmake_path = os.path.abspath(os.path.join(self.build_config.REPOROOT_DIR, 'out', ('libxml2-' + self.build_config.LIBXML2_VERSION))) + build_path = self.get_libxml2_build_path(triple) + install_path = self.get_libxml2_install_path(triple) + self.check_rm_tree(build_path) + self.check_rm_tree(install_path) - libxml2_build_path = self.merge_out_path('libxml2') - libxml2_install_path = os.path.join(self.get_prebuilts_dir('libxml2'), self.use_platform()) - libxml2_defines['CMAKE_INSTALL_PREFIX'] = libxml2_install_path + defines = self.build_libxml2_defines() + defines['CMAKE_INSTALL_PREFIX'] = install_path - self.rm_cmake_cache(libxml2_build_path) + if triple != self.use_platform(): + configs_list, cc, cxx, ar, llvm_config = self.libs_argument(llvm_install) + for (arch, llvm_triple, extra_flags, multilib_suffix) in configs_list: + if llvm_triple != triple or multilib_suffix != '': + continue - self.invoke_cmake(libxml2_cmake_path, - libxml2_build_path, - libxml2_defines, - env=dict(self.build_config.ORIG_ENV)) + ldflags = [] + cflags = [] + self.build_libs_defines(triple, defines, cc, cxx, ar, llvm_config, ldflags, cflags, extra_flags) + defines['CMAKE_C_FLAGS'] = ' '.join(cflags) + defines['CMAKE_CXX_FLAGS'] = ' '.join(cflags) + defines['CMAKE_SHARED_LINKER_FLAGS'] = ' '.join(ldflags) + defines['CMAKE_LINKER'] = os.path.join(llvm_install, 'bin', 'ld.lld') + defines['CMAKE_SYSTEM_NAME'] = 'OHOS' + defines['CMAKE_CROSSCOMPILING'] = 'True' + defines['BUILD_SHARED_LIBS'] = 'OFF' + break - self.invoke_ninja(out_path=libxml2_build_path, - env=dict(self.build_config.ORIG_ENV), - target=None, - install=True) + self.invoke_cmake(cmake_path, + build_path, + defines, + dict(self.build_config.ORIG_ENV)) + + self.invoke_ninja(build_path, + dict(self.build_config.ORIG_ENV), + None, + True) - self.llvm_package.copy_libxml2_to_llvm(llvm_make) - self.llvm_package.copy_libxml2_to_llvm(llvm_install) + if triple == self.use_platform(): + self.llvm_package.copy_libxml2_to_llvm(triple, llvm_make) + self.llvm_package.copy_libxml2_to_llvm(triple, llvm_install) def build_libxml2_for_windows(self, windows64_install): self.logger().info('Building libxml2 for windows') windows_sysroot = self.merge_out_path('mingw', self.build_config.MINGW_TRIPLE) windowstool_path = self.merge_out_path('llvm-install') - libxml2_build_path = self.merge_out_path('libxml2-windows-build') - libxml2_install_path = os.path.join(self.get_prebuilts_dir('libxml2'), 'windows-x86_64') + libxml2_build_path = self.get_libxml2_build_path('windows-x86_64') + libxml2_install_path = self.get_libxml2_install_path('windows-x86_64') cflags = ['--target=x86_64-pc-windows-gnu'] cflags.extend(('-I', os.path.join(windows_sysroot, 'include'))) @@ -1900,8 +1941,7 @@ class LlvmLibs(BuildUtils): libxml2_defines['CMAKE_RC_FLAGS'] = ' '.join(rcflags) libxml2_defines['XML_INCLUDEDIR'] = os.path.join(windows_sysroot, 'include') - libxml2_cmake_path = os.path.abspath(os.path.join(self.build_config.REPOROOT_DIR, 'out', ('libxml2-' + self.build_config.LIBXML2_VERSION))) - + libxml2_cmake_path = self.get_libxml2_source_path() self.invoke_cmake(libxml2_cmake_path, libxml2_build_path, libxml2_defines, @@ -1911,7 +1951,7 @@ class LlvmLibs(BuildUtils): env=dict(self.build_config.ORIG_ENV), target=None, install=True) - + if not os.path.exists(os.path.join(windows64_install, 'bin')): os.makedirs(os.path.join(windows64_install, 'bin')) shutil.copyfile(os.path.join(libxml2_build_path, 'libxml2.dll'), os.path.join(windows64_install, 'bin', 'libxml2.dll')) @@ -2125,7 +2165,7 @@ class LlvmPackage(BuildUtils): 'opt%s' % ext, ] - + necessary_bin_files.extend(necessary_bin_file) @staticmethod @@ -2368,7 +2408,7 @@ class LlvmPackage(BuildUtils): st = os.stat(os.path.join(bin_dir, sh_filename)) os.chmod(os.path.join(bin_dir, sh_filename), st.st_mode | stat.S_IEXEC | stat.S_IXGRP | stat.S_IXOTH) - def copy_libxml2_to_llvm(self, install_dir): + def copy_libxml2_to_llvm(self, triple, install_dir): self.logger().info('LlvmPackage copy_libxml2_to_llvm install_dir is %s', install_dir) libxml2_version = self.get_libxml2_version() @@ -2378,7 +2418,7 @@ class LlvmPackage(BuildUtils): if self.host_is_linux(): shlib_ext = f'.so.{libxml2_version}' - libxml2_lib_path = self.merge_out_path('libxml2') + libxml2_lib_path = os.path.join(self.get_libxml2_install_path(triple), 'lib') libxml2_src = os.path.join(libxml2_lib_path, 'libxml2%s' % shlib_ext) lib_dst_path = os.path.join(install_dir, 'lib') @@ -2452,7 +2492,7 @@ class LlvmPackage(BuildUtils): # Strip lldb-server self.strip_lldb_server(host, install_dir) - + # Copy lldb script lldb_script_file = 'lldb.cmd' if host.startswith('windows') else 'lldb.sh' self.check_copy_file(os.path.join(self.build_config.LLVM_PROJECT_DIR, 'lldb', 'scripts', lldb_script_file), os.path.join(install_dir, 'bin')) @@ -2528,13 +2568,7 @@ def main(): build_config.build_libxml2 = False if build_config.build_libxml2: - libxml2_untar_py = os.path.join( - build_config.REPOROOT_DIR, 'third_party', 'libxml2', 'install.py') - if not os.path.exists(build_config.REPOROOT_DIR + '/out'): - os.makedirs(build_config.REPOROOT_DIR + '/out') - subprocess.run(['python3', libxml2_untar_py, '--gen-dir', build_config.REPOROOT_DIR + '/out', - '--source-file', build_config.REPOROOT_DIR + '/third_party/libxml2']) - llvm_libs.build_libxml2(llvm_make, llvm_install) + llvm_libs.build_libxml2(build_utils.use_platform(), llvm_make, llvm_install) if build_config.do_build and need_host: llvm_core.llvm_compile(