@@ -243,6 +243,7 @@ pub struct Build {
243243 initial_rustc : PathBuf ,
244244 initial_cargo : PathBuf ,
245245 initial_lld : PathBuf ,
246+ initial_libdir : PathBuf ,
246247
247248 // Runtime state filled in later on
248249 // C/C++ compilers and archiver for all targets
@@ -344,18 +345,39 @@ impl Build {
344345 // we always try to use git for LLVM builds
345346 let in_tree_llvm_info = channel:: GitInfo :: new ( false , & src. join ( "src/llvm-project" ) ) ;
346347
347- let initial_sysroot = config. initial_rustc . parent ( ) . unwrap ( ) . parent ( ) . unwrap ( ) ;
348- let initial_lld = initial_sysroot
349- . join ( "lib" )
350- . join ( "rustlib" )
351- . join ( config. build )
352- . join ( "bin" )
353- . join ( "rust-lld" ) ;
348+ let initial_target_libdir_str = if config. dry_run {
349+ "/dummy/lib/path/to/lib/" . to_string ( )
350+ } else {
351+ output (
352+ Command :: new ( & config. initial_rustc )
353+ . arg ( "--target" )
354+ . arg ( config. build )
355+ . arg ( "--print" )
356+ . arg ( "target-libdir" ) ,
357+ )
358+ } ;
359+ let initial_target_dir = Path :: new ( & initial_target_libdir_str) . parent ( ) . unwrap ( ) ;
360+ let initial_lld = initial_target_dir. join ( "bin" ) . join ( "rust-lld" ) ;
361+
362+ let initial_sysroot = if config. dry_run {
363+ "/dummy" . to_string ( )
364+ } else {
365+ output ( Command :: new ( & config. initial_rustc ) . arg ( "--print" ) . arg ( "sysroot" ) )
366+ } ;
367+ let initial_libdir = initial_target_dir
368+ . parent ( )
369+ . unwrap ( )
370+ . parent ( )
371+ . unwrap ( )
372+ . strip_prefix ( initial_sysroot. trim ( ) )
373+ . unwrap ( )
374+ . to_path_buf ( ) ;
354375
355376 let mut build = Build {
356377 initial_rustc : config. initial_rustc . clone ( ) ,
357378 initial_cargo : config. initial_cargo . clone ( ) ,
358379 initial_lld,
380+ initial_libdir,
359381 local_rebuild : config. local_rebuild ,
360382 fail_fast : config. cmd . fail_fast ( ) ,
361383 doc_tests : config. cmd . doc_tests ( ) ,
0 commit comments