fune/build/build-rust/rust-vendor-std.patch
Cristian Tuns c4685ab34e Backed out 4 changesets (bug 1878764, bug 1894860, bug 1849075) for causing multiple Gtest failures. CLOSED TREE
Backed out changeset 1b6f68a55002 (bug 1878764)
Backed out changeset dbcef036309d (bug 1894860)
Backed out changeset 440056d02985 (bug 1878764)
Backed out changeset df59a0aca986 (bug 1849075)
2024-05-04 18:03:30 -04:00

81 lines
3.5 KiB
Diff

Teaches Rust's build system to vendor std's dependencies into the
rust-src component.
This was originally landed in https://github.com/rust-lang/rust/pull/78790
but was backed out for causing some breakage for distro maintainers who
need to build Rust itself in a vendored/offline context. It doesn't actually
fetch anything interesting from crates.io, just the magic fake std/core crates
that exist to make the build work right. Those crates *are* vendored but
their contents are ignored in favour of the actual stdlib.
For firefox's purposes, these patches still work fine, and are necessary
to make -Zbuild-std work in a vendored environment.
diff --git a/src/bootstrap/dist.rs b/src/bootstrap/dist.rs
index 3cb0eccd324..a3b8154c024 100644
--- a/src/bootstrap/src/core/build_steps/dist.rs
+++ b/src/bootstrap/src/core/build_steps/dist.rs
@@ -905,6 +905,31 @@ fn run(self, builder: &Builder<'_>) -> GeneratedTarball {
builder.copy(&builder.src.join(file), &dst_src.join(file));
}
+ // libsysroot includes std and everything else, so vendoring it
+ // creates exactly what's needed for `cargo -Zbuild-std` or any
+ // other analysis of the stdlib's source. Cargo also needs help
+ // finding the lock, so we copy it to libsysroot temporarily.
+ //
+ // Note that this requires std to only have one version of each
+ // crate. e.g. two versions of getopts won't be patchable.
+ let dst_libsysroot = dst_src.join("library/sysroot");
+ let dst_vendor = dst_src.join("vendor");
+ let root_lock = dst_src.join("Cargo.lock");
+ let temp_lock = dst_libsysroot.join("Cargo.lock");
+
+ // `cargo vendor` will delete everything from the lockfile that
+ // isn't used by libsysroot, so we need to not use any links!
+ builder.really_copy(&root_lock, &temp_lock);
+
+ let mut cmd = Command::new(&builder.initial_cargo);
+ cmd.arg("vendor").arg(dst_vendor).current_dir(&dst_libsysroot);
+ cmd.env("RUSTC_BOOTSTRAP", "1");
+ builder.info("Dist src");
+ let _time = timeit(builder);
+ builder.run(&mut cmd);
+
+ builder.remove(&temp_lock);
+
tarball.generate()
}
}
diff --git a/src/bootstrap/lib.rs b/src/bootstrap/lib.rs
index 3ed53452309..1fc0d887748 100644
--- a/src/bootstrap/src/lib.rs
+++ b/src/bootstrap/src/lib.rs
@@ -1437,6 +1437,27 @@ fn read_stamp_file(&self, stamp: &Path) -> Vec<(PathBuf, DependencyType)> {
paths
}
+ /// Copies a file from `src` to `dst` and doesn't use links, so
+ /// that the copy can be modified without affecting the original.
+ pub fn really_copy(&self, src: &Path, dst: &Path) {
+ if self.config.dry_run() {
+ return;
+ }
+ self.verbose_than(1, &format!("Copy {:?} to {:?}", src, dst));
+ if src == dst {
+ return;
+ }
+ let _ = fs::remove_file(&dst);
+ let metadata = t!(src.symlink_metadata());
+ if let Err(e) = fs::copy(src, dst) {
+ panic!("failed to copy `{}` to `{}`: {}", src.display(), dst.display(), e)
+ }
+ t!(fs::set_permissions(dst, metadata.permissions()));
+ let atime = FileTime::from_last_access_time(&metadata);
+ let mtime = FileTime::from_last_modification_time(&metadata);
+ t!(filetime::set_file_times(dst, atime, mtime));
+ }
+
/// Copies a file from `src` to `dst`
pub fn copy(&self, src: &Path, dst: &Path) {
self.copy_internal(src, dst, false);