def main(): args = parse_args() if args.skip_build: # Skips all builds BuilderRegistry.add_filter(lambda name: False) elif args.skip: BuilderRegistry.add_skips(args.skip) elif args.build: BuilderRegistry.add_builds(args.build) do_runtimes = not args.skip_runtimes do_package = not args.skip_package do_strip = not args.no_strip do_strip_host_package = do_strip and not args.debug and not args.build_llvm_next build_lldb = 'lldb' not in args.no_build android_version.set_llvm_next(args.build_llvm_next) need_host = hosts.build_host().is_darwin or ('linux' not in args.no_build) need_windows = hosts.build_host().is_linux and ('windows' not in args.no_build) logging.basicConfig(level=logging.DEBUG) logger().info( 'do_build=%r do_stage1=%r do_stage2=%r do_runtimes=%r do_package=%r need_windows=%r' % (not args.skip_build, BuilderRegistry.should_build('stage1'), BuilderRegistry.should_build('stage2'), do_runtimes, do_package, need_windows)) # Clone sources to be built and apply patches. if not args.skip_source_setup: source_manager.setup_sources(source_dir=paths.LLVM_PATH) # Build the stage1 Clang for the build host instrumented = hosts.build_host().is_linux and args.build_instrumented stage1 = builders.Stage1Builder() stage1.build_name = 'stage1' stage1.svn_revision = android_version.get_svn_revision() # Build lldb for lldb-tblgen. It will be used to build lldb-server and windows lldb. stage1.build_lldb = build_lldb stage1.build_android_targets = args.debug or instrumented stage1.build() set_default_toolchain(stage1.installed_toolchain) if build_lldb: # Swig is needed for both host and windows lldb. swig_builder = builders.SwigBuilder() swig_builder.build() else: swig_builder = None if need_host: if not args.no_pgo: profdata = extract_profdata() else: profdata = None stage2 = builders.Stage2Builder() stage2.build_name = args.build_name stage2.svn_revision = android_version.get_svn_revision() stage2.debug_build = args.debug stage2.enable_assertions = args.enable_assertions stage2.lto = not args.no_lto stage2.build_instrumented = instrumented stage2.profdata_file = profdata if profdata else None libxml2_builder = builders.LibXml2Builder() libxml2_builder.build() stage2.libxml2 = libxml2_builder stage2.build_lldb = build_lldb if build_lldb: stage2.swig_executable = swig_builder.install_dir / 'bin' / 'swig' xz_builder = builders.XzBuilder() xz_builder.build() stage2.liblzma = xz_builder libncurses = builders.LibNcursesBuilder() libncurses.build() stage2.libncurses = libncurses libedit_builder = builders.LibEditBuilder() libedit_builder.libncurses = libncurses libedit_builder.build() stage2.libedit = libedit_builder stage2_tags = [] # Annotate the version string if there is no profdata. if profdata is None: stage2_tags.append('NO PGO PROFILE') # Annotate the version string if this is an llvm-next build. if args.build_llvm_next: stage2_tags.append('ANDROID_LLVM_NEXT') stage2.build_tags = stage2_tags stage2.build() if not (stage2.build_instrumented or stage2.debug_build): set_default_toolchain(stage2.installed_toolchain) Builder.output_toolchain = stage2.installed_toolchain if hosts.build_host().is_linux and do_runtimes: build_runtimes(build_lldb_server=build_lldb) if need_windows: if args.windows_sdk: win_sdk.set_path(Path(args.windows_sdk)) win_builder, win_lldb_bins = build_llvm_for_windows( enable_assertions=args.enable_assertions, build_name=args.build_name, build_lldb=build_lldb, swig_builder=swig_builder) if do_package and need_host: package_toolchain(stage2, strip=do_strip_host_package, create_tar=args.create_tar, llvm_next=args.build_llvm_next) if do_package and need_windows: package_toolchain(win_builder, necessary_bin_files=win_lldb_bins, strip=do_strip, create_tar=args.create_tar) return 0
def main(): args = parse_args() if args.skip_build: # Skips all builds BuilderRegistry.add_filter(lambda name: False) elif args.skip: BuilderRegistry.add_skips(args.skip) elif args.build: BuilderRegistry.add_builds(args.build) do_runtimes = not args.skip_runtimes do_package = not args.skip_package do_strip = not args.no_strip do_strip_host_package = do_strip and not args.debug # TODO (Pirama): Avoid using global statement global BUILD_LLDB, BUILD_LLVM_NEXT BUILD_LLDB = 'lldb' not in args.no_build BUILD_LLVM_NEXT = args.build_llvm_next need_host = hosts.build_host().is_darwin or ('linux' not in args.no_build) need_windows = hosts.build_host().is_linux and ('windows' not in args.no_build) log_levels = [logging.INFO, logging.DEBUG] verbosity = min(args.verbose, len(log_levels) - 1) log_level = log_levels[verbosity] logging.basicConfig(level=log_level) logger().info('do_build=%r do_stage1=%r do_stage2=%r do_runtimes=%r do_package=%r need_windows=%r' % (not args.skip_build, BuilderRegistry.should_build('stage1'), BuilderRegistry.should_build('stage2'), do_runtimes, do_package, need_windows)) # Clone sources to be built and apply patches. source_manager.setup_sources(source_dir=utils.llvm_path(), build_llvm_next=args.build_llvm_next) # Build the stage1 Clang for the build host instrumented = hosts.build_host().is_linux and args.build_instrumented # Windows libs are built with stage1 toolchain. llvm-config is required. stage1_build_llvm_tools = instrumented or \ need_windows or \ args.debug stage1 = builders.Stage1Builder() stage1.build_name = args.build_name stage1.svn_revision = android_version.get_svn_revision(BUILD_LLVM_NEXT) stage1.build_llvm_tools = stage1_build_llvm_tools stage1.build_android_targets = args.debug or instrumented stage1.use_goma_for_stage1 = USE_GOMA_FOR_STAGE1 stage1.build() stage1_toolchain = toolchains.get_toolchain_from_builder(stage1) toolchains.set_runtime_toolchain(stage1_toolchain) stage1_install = str(stage1.install_dir) if BUILD_LLDB: builders.SwigBuilder().build() if BuilderRegistry.should_build('stage2'): # libedit is not needed for windows lldb. builders.LibEditBuilder().build() if need_host: profdata_filename = pgo_profdata_filename() profdata = pgo_profdata_file(profdata_filename) # Do not use PGO profiles if profdata file doesn't exist unless failure # is explicitly requested via --check-pgo-profile. if profdata is None and args.check_pgo_profile: raise RuntimeError('Profdata file does not exist for ' + profdata_filename) stage2 = builders.Stage2Builder() stage2.build_name = args.build_name stage2.svn_revision = android_version.get_svn_revision(BUILD_LLVM_NEXT) stage2.build_lldb = BUILD_LLDB stage2.debug_build = args.debug stage2.enable_assertions = args.enable_assertions stage2.lto = not args.no_lto stage2.build_instrumented = instrumented stage2.profdata_file = Path(profdata) if profdata else None # Annotate the version string if there is no profdata. if profdata is None: stage2.build_name += ', NO PGO PROFILE, ' stage2.build() if not (stage2.build_instrumented or stage2.debug_build): stage2_toolchain = toolchains.get_toolchain_from_builder(stage2) toolchains.set_runtime_toolchain(stage2_toolchain) stage2_install = str(stage2.install_dir) if hosts.build_host().is_linux and do_runtimes: runtimes_toolchain = stage2_install if args.debug or instrumented: runtimes_toolchain = stage1_install build_runtimes(runtimes_toolchain, args) if need_windows: windows64_install = build_llvm_for_windows( enable_assertions=args.enable_assertions, build_name=args.build_name) dist_dir = ORIG_ENV.get('DIST_DIR', utils.out_path()) if do_package and need_host: package_toolchain( stage2_install, args.build_name, hosts.build_host(), dist_dir, strip=do_strip_host_package) if do_package and need_windows: package_toolchain( windows64_install, args.build_name, hosts.Host.Windows, dist_dir, strip=do_strip) return 0