@@ -457,9 +457,10 @@ impl Step for Rustc {
457457 let dst_dir = image. join ( "lib/rustlib" ) . join ( host) . join ( "bin" ) ;
458458 t ! ( fs:: create_dir_all( & dst_dir) ) ;
459459
460+ let src_dir = builder. sysroot_libdir ( compiler, host) . parent ( ) . unwrap ( ) . join ( "bin" ) ;
461+
460462 // Copy over lld if it's there
461463 if builder. config . lld_enabled {
462- let src_dir = builder. sysroot_libdir ( compiler, host) . parent ( ) . unwrap ( ) . join ( "bin" ) ;
463464 let rust_lld = exe ( "rust-lld" , compiler. host ) ;
464465 builder. copy_link ( & src_dir. join ( & rust_lld) , & dst_dir. join ( & rust_lld) ) ;
465466 let self_contained_lld_src_dir = src_dir. join ( "gcc-ld" ) ;
@@ -473,11 +474,10 @@ impl Step for Rustc {
473474 ) ;
474475 }
475476 }
476- if builder. build_wasm_component_ld ( ) {
477- let src_dir = builder. sysroot_libdir ( compiler, host) . parent ( ) . unwrap ( ) . join ( "bin" ) ;
478- let ld = exe ( "wasm-component-ld" , compiler. host ) ;
479- builder. copy_link ( & src_dir. join ( & ld) , & dst_dir. join ( & ld) ) ;
480- }
477+
478+ maybe_install_wasm_component_ld ( builder, compiler, compiler. host , & src_dir) ;
479+ maybe_install_llvm_tools ( builder, compiler. host , & src_dir) ;
480+ maybe_install_llvm_bitcode_linker ( builder, compiler, compiler. host , & src_dir) ;
481481
482482 // Man pages
483483 t ! ( fs:: create_dir_all( image. join( "share/man/man1" ) ) ) ;
@@ -2095,6 +2095,72 @@ pub fn maybe_install_llvm_runtime(builder: &Builder<'_>, target: TargetSelection
20952095 }
20962096}
20972097
2098+ /// Maybe add LLVM tools to the rustc sysroot.
2099+ pub fn maybe_install_llvm_tools ( builder : & Builder < ' _ > , target : TargetSelection , libdir_bin : & Path ) {
2100+ if builder. config . llvm_enabled ( target) {
2101+ let llvm:: LlvmResult { llvm_config, .. } = builder. ensure ( llvm:: Llvm { target } ) ;
2102+ if !builder. config . dry_run ( ) && builder. config . llvm_tools_enabled {
2103+ let llvm_bin_dir =
2104+ command ( llvm_config) . arg ( "--bindir" ) . run_capture_stdout ( builder) . stdout ( ) ;
2105+ let llvm_bin_dir = Path :: new ( llvm_bin_dir. trim ( ) ) ;
2106+
2107+ // Since we've already built the LLVM tools, install them to the sysroot.
2108+ // This is the equivalent of installing the `llvm-tools-preview` component via
2109+ // rustup, and lets developers use a locally built toolchain to
2110+ // build projects that expect llvm tools to be present in the sysroot
2111+ // (e.g. the `bootimage` crate).
2112+ for tool in LLVM_TOOLS {
2113+ let tool_exe = exe ( tool, target) ;
2114+ let src_path = llvm_bin_dir. join ( & tool_exe) ;
2115+ // When using `download-ci-llvm`, some of the tools
2116+ // may not exist, so skip trying to copy them.
2117+ if src_path. exists ( ) {
2118+ builder. copy_link ( & src_path, & libdir_bin. join ( & tool_exe) ) ;
2119+ }
2120+ }
2121+ }
2122+ }
2123+ }
2124+
2125+ /// Maybe add `llvm-bitcode-linker` to the rustc sysroot.
2126+ pub fn maybe_install_llvm_bitcode_linker (
2127+ builder : & Builder < ' _ > ,
2128+ compiler : Compiler ,
2129+ target : TargetSelection ,
2130+ libdir_bin : & Path ,
2131+ ) {
2132+ let dst_dir = libdir_bin. join ( "self-contained" ) ;
2133+ t ! ( std:: fs:: create_dir_all( & dst_dir) ) ;
2134+
2135+ let src_path = builder. ensure ( crate :: core:: build_steps:: tool:: LlvmBitcodeLinker {
2136+ compiler,
2137+ target,
2138+ extra_features : vec ! [ ] ,
2139+ } ) ;
2140+
2141+ let tool_exe = exe ( "llvm-bitcode-linker" , target) ;
2142+
2143+ builder. copy_link ( & src_path, & dst_dir. join ( tool_exe) ) ;
2144+ }
2145+
2146+ /// Maybe add `wasm-component-ld` to the rustc sysroot.
2147+ pub fn maybe_install_wasm_component_ld (
2148+ builder : & Builder < ' _ > ,
2149+ compiler : Compiler ,
2150+ target : TargetSelection ,
2151+ libdir_bin : & Path ,
2152+ ) {
2153+ if builder. build_wasm_component_ld ( ) {
2154+ let wasm_component_ld_exe =
2155+ builder. ensure ( crate :: core:: build_steps:: tool:: WasmComponentLd { compiler, target } ) ;
2156+
2157+ builder. copy_link (
2158+ & wasm_component_ld_exe,
2159+ & libdir_bin. join ( wasm_component_ld_exe. file_name ( ) . unwrap ( ) ) ,
2160+ ) ;
2161+ }
2162+ }
2163+
20982164#[ derive( Clone , Debug , Eq , Hash , PartialEq ) ]
20992165pub struct LlvmTools {
21002166 pub target : TargetSelection ,
0 commit comments