From 6990ab9ad2cde9b67073ffac29ffecc2be8e722f Mon Sep 17 00:00:00 2001 From: KittyBorgX Date: Sun, 12 Feb 2023 21:01:27 +0530 Subject: [PATCH] Copy `bin/*` and `lib/*.dylib` files to `stage0-sysroot` --- src/bootstrap/compile.rs | 66 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/src/bootstrap/compile.rs b/src/bootstrap/compile.rs index 07c0d2233caeb..97a1102e3c576 100644 --- a/src/bootstrap/compile.rs +++ b/src/bootstrap/compile.rs @@ -445,6 +445,72 @@ impl Step for StdLink { let libdir = builder.sysroot_libdir(target_compiler, target); let hostdir = builder.sysroot_libdir(target_compiler, compiler.host); add_to_sysroot(builder, &libdir, &hostdir, &libstd_stamp(builder, compiler, target)); + + if compiler.stage == 0 { + // special handling for stage0, to make `rustup toolchain link` and `x dist --stage 0` + // work for stage0-sysroot + let sysroot = builder.out.join(&compiler.host.triple).join("stage0-sysroot"); + + let host_lib_dir = builder.initial_rustc.ancestors().nth(2).unwrap().join("lib"); + let host_bin_dir = builder.out.join(&builder.initial_rustc.parent().unwrap()); + let host_codegen_backends = + host_lib_dir.join("rustlib").join(&compiler.host.triple).join("codegen-backends"); + let sysroot_bin_dir = sysroot.join("bin"); + let sysroot_lib_dir = sysroot.join("lib"); + let sysroot_codegen_backends = builder.sysroot_codegen_backends(compiler); + + // Create the `bin` directory in stage0-sysroot + t!(fs::create_dir_all(&sysroot_bin_dir)); + + // copy bin files from `builder.initial_rustc/./` to `stage0-sysroot/bin` + if let Ok(files) = fs::read_dir(&host_bin_dir) { + for file in files { + let file = t!(file); + if file.file_name() == "rustfmt" { + // This is when `rustc` and `cargo` are set in `config.toml` + if !file.path().starts_with(&builder.out) { + builder.copy( + &file.path().into_boxed_path(), + &sysroot_bin_dir.join(file.file_name()), + ); + } else { + builder.copy( + &builder + .out + .join(&compiler.host.triple) + .join("rustfmt/bin/rustfmt"), + &sysroot_bin_dir.join(file.file_name()), + ); + } + } else { + builder.copy( + &file.path().into_boxed_path(), + &sysroot_bin_dir.join(file.file_name()), + ); + } + } + } + + // copy dylib files from `builder.initial_rustc/../lib/*` while excluding the `rustlib` directory to `stage0-sysroot/lib` + if let Ok(files) = fs::read_dir(&host_lib_dir) { + for file in files { + let file = t!(file); + let path = file.path(); + if path.is_file() + && is_dylib(&file.file_name().into_string().unwrap()) + && !path.starts_with(sysroot_lib_dir.join("rustlib").into_boxed_path()) + { + builder.copy(&path, &sysroot_lib_dir.join(path.file_name().unwrap())); + } + } + } + + t!(fs::create_dir_all(&sysroot_codegen_backends)); + // copy `codegen-backends` from `host_lib_dir/rustlib/codegen_backends` to `stage0-sysroot/lib/rustlib/host-triple/codegen-backends` if it exists. + if host_codegen_backends.exists() { + builder.cp_r(&host_codegen_backends, &sysroot_codegen_backends); + } + } } }