@@ -457,9 +457,10 @@ impl Step for Rustc {
457
457
let dst_dir = image. join ( "lib/rustlib" ) . join ( host) . join ( "bin" ) ;
458
458
t ! ( fs:: create_dir_all( & dst_dir) ) ;
459
459
460
+ let src_dir = builder. sysroot_libdir ( compiler, host) . parent ( ) . unwrap ( ) . join ( "bin" ) ;
461
+
460
462
// Copy over lld if it's there
461
463
if builder. config . lld_enabled {
462
- let src_dir = builder. sysroot_libdir ( compiler, host) . parent ( ) . unwrap ( ) . join ( "bin" ) ;
463
464
let rust_lld = exe ( "rust-lld" , compiler. host ) ;
464
465
builder. copy_link ( & src_dir. join ( & rust_lld) , & dst_dir. join ( & rust_lld) ) ;
465
466
let self_contained_lld_src_dir = src_dir. join ( "gcc-ld" ) ;
@@ -473,11 +474,10 @@ impl Step for Rustc {
473
474
) ;
474
475
}
475
476
}
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) ;
481
481
482
482
// Man pages
483
483
t ! ( fs:: create_dir_all( image. join( "share/man/man1" ) ) ) ;
@@ -2095,6 +2095,72 @@ pub fn maybe_install_llvm_runtime(builder: &Builder<'_>, target: TargetSelection
2095
2095
}
2096
2096
}
2097
2097
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
+
2098
2164
#[ derive( Clone , Debug , Eq , Hash , PartialEq ) ]
2099
2165
pub struct LlvmTools {
2100
2166
pub target : TargetSelection ,
0 commit comments