tests: migrate incr-add-rust-src-component
to rmake.rs
The Makefile version seems to contain a bug. Over the years, the directory structure of the `rust-src` component changed as the source tree directory structure changed. `libstd` is no longer a thing directly under `root/lib/rustlib/src/rust/src/`, it is moved to `root/lib/rustlib/src/rust/library/std`. Co-authored-by: Oneirical <manchot@videotron.ca>
This commit is contained in:
parent
85c39893a7
commit
7ee520491e
3 changed files with 131 additions and 46 deletions
|
@ -1,7 +1,6 @@
|
||||||
run-make/branch-protection-check-IBT/Makefile
|
run-make/branch-protection-check-IBT/Makefile
|
||||||
run-make/cat-and-grep-sanity-check/Makefile
|
run-make/cat-and-grep-sanity-check/Makefile
|
||||||
run-make/extern-fn-reachable/Makefile
|
run-make/extern-fn-reachable/Makefile
|
||||||
run-make/incr-add-rust-src-component/Makefile
|
|
||||||
run-make/jobserver-error/Makefile
|
run-make/jobserver-error/Makefile
|
||||||
run-make/libs-through-symlinks/Makefile
|
run-make/libs-through-symlinks/Makefile
|
||||||
run-make/split-debuginfo/Makefile
|
run-make/split-debuginfo/Makefile
|
||||||
|
|
|
@ -1,45 +0,0 @@
|
||||||
# ignore-cross-compile
|
|
||||||
include ../tools.mk
|
|
||||||
|
|
||||||
# rust-lang/rust#70924: Test that if we add rust-src component in between two
|
|
||||||
# incremental compiles, the compiler does not ICE on the second.
|
|
||||||
|
|
||||||
# This test uses `ln -s` rather than copying to save testing time, but its
|
|
||||||
# usage doesn't work on windows. So ignore windows.
|
|
||||||
|
|
||||||
# ignore-windows
|
|
||||||
|
|
||||||
SYSROOT:=$(shell $(RUSTC) --print sysroot)
|
|
||||||
FAKEROOT=$(TMPDIR)/fakeroot
|
|
||||||
INCR=$(TMPDIR)/incr
|
|
||||||
|
|
||||||
# Make a local copy of the sysroot; then remove the rust-src part of it, if
|
|
||||||
# present, for the *first* build. Then put in a facsimile of the rust-src
|
|
||||||
# component for the second build, in order to expose the ICE from issue #70924.
|
|
||||||
#
|
|
||||||
# Note that it is much easier to just do `cp -a $(SYSROOT)/* $(FAKEROOT)` as a
|
|
||||||
# first step, but I am concerned that would be too expensive in a unit test
|
|
||||||
# compared to making symbolic links.
|
|
||||||
#
|
|
||||||
# Anyway, the pattern you'll see here is: For every prefix in
|
|
||||||
# root/lib/rustlib/src, link all of prefix parent content, then remove the
|
|
||||||
# prefix, then loop on the next prefix. This way, we basically create a copy of
|
|
||||||
# the context around root/lib/rustlib/src, and can freely add/remove the src
|
|
||||||
# component itself.
|
|
||||||
all:
|
|
||||||
mkdir $(FAKEROOT)
|
|
||||||
ln -s $(SYSROOT)/* $(FAKEROOT)
|
|
||||||
rm -f $(FAKEROOT)/lib
|
|
||||||
mkdir $(FAKEROOT)/lib
|
|
||||||
ln -s $(SYSROOT)/lib/* $(FAKEROOT)/lib
|
|
||||||
rm -f $(FAKEROOT)/lib/rustlib
|
|
||||||
mkdir $(FAKEROOT)/lib/rustlib
|
|
||||||
ln -s $(SYSROOT)/lib/rustlib/* $(FAKEROOT)/lib/rustlib
|
|
||||||
rm -f $(FAKEROOT)/lib/rustlib/src
|
|
||||||
mkdir $(FAKEROOT)/lib/rustlib/src
|
|
||||||
ln -s $(SYSROOT)/lib/rustlib/src/* $(FAKEROOT)/lib/rustlib/src
|
|
||||||
rm -f $(FAKEROOT)/lib/rustlib/src/rust
|
|
||||||
$(RUSTC) --sysroot $(FAKEROOT) -C incremental=$(INCR) main.rs
|
|
||||||
mkdir -p $(FAKEROOT)/lib/rustlib/src/rust/src/libstd
|
|
||||||
touch $(FAKEROOT)/lib/rustlib/src/rust/src/libstd/lib.rs
|
|
||||||
$(RUSTC) --sysroot $(FAKEROOT) -C incremental=$(INCR) main.rs
|
|
131
tests/run-make/incr-add-rust-src-component/rmake.rs
Normal file
131
tests/run-make/incr-add-rust-src-component/rmake.rs
Normal file
|
@ -0,0 +1,131 @@
|
||||||
|
//! Regression test for rust-lang/rust#70924. Check that if we add the `rust-src` component in
|
||||||
|
//! between two incremental compiles, that the compiler doesn't ICE on the second invocation.
|
||||||
|
//!
|
||||||
|
//! This test uses symbolic links to save testing time.
|
||||||
|
//!
|
||||||
|
//! The way this test works is that, for every prefix in `root/lib/rustlib/src`, link all of prefix
|
||||||
|
//! parent content, then remove the prefix, then loop on the next prefix. This way, we basically
|
||||||
|
//! create a copy of the context around `root/lib/rustlib/src`, and can freely add/remove the src
|
||||||
|
//! component itself.
|
||||||
|
|
||||||
|
//@ ignore-cross-compile
|
||||||
|
// Reason: test needs to run.
|
||||||
|
|
||||||
|
//@ needs-symlink
|
||||||
|
// Reason: test needs symlink to create stub directories and files.
|
||||||
|
|
||||||
|
use std::path::Path;
|
||||||
|
|
||||||
|
use run_make_support::rfs::read_dir_entries;
|
||||||
|
use run_make_support::{bare_rustc, path, rfs, run};
|
||||||
|
|
||||||
|
#[derive(Debug, Copy, Clone)]
|
||||||
|
struct Symlink<'a, 'b> {
|
||||||
|
src_dir: &'a Path,
|
||||||
|
dst_dir: &'b Path,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn shallow_symlink_dir<'a, 'b>(Symlink { src_dir, dst_dir }: Symlink<'a, 'b>) {
|
||||||
|
eprintln!(
|
||||||
|
"shallow_symlink_dir: src_dir={} -> dst_dir={}",
|
||||||
|
src_dir.display(),
|
||||||
|
dst_dir.display()
|
||||||
|
);
|
||||||
|
|
||||||
|
read_dir_entries(src_dir, |src_path| {
|
||||||
|
let src_metadata = rfs::symlink_metadata(src_path);
|
||||||
|
let filename = src_path.file_name().unwrap();
|
||||||
|
if src_metadata.is_dir() {
|
||||||
|
rfs::symlink_dir(src_path, dst_dir.join(filename));
|
||||||
|
} else if src_metadata.is_file() {
|
||||||
|
rfs::symlink_file(src_path, dst_dir.join(filename));
|
||||||
|
} else if src_metadata.is_symlink() {
|
||||||
|
rfs::copy_symlink(src_path, dst_dir.join(filename));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
fn recreate_dir(path: &Path) {
|
||||||
|
rfs::recursive_remove(path);
|
||||||
|
rfs::create_dir(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let sysroot = bare_rustc().print("sysroot").run().stdout_utf8();
|
||||||
|
let sysroot = sysroot.trim();
|
||||||
|
let sysroot = path(sysroot);
|
||||||
|
|
||||||
|
let incr = path("incr");
|
||||||
|
|
||||||
|
let fakeroot = path("fakeroot");
|
||||||
|
rfs::create_dir(&fakeroot);
|
||||||
|
|
||||||
|
shallow_symlink_dir(Symlink { src_dir: &sysroot, dst_dir: &fakeroot });
|
||||||
|
recreate_dir(&fakeroot.join("lib"));
|
||||||
|
|
||||||
|
shallow_symlink_dir(Symlink { src_dir: &sysroot.join("lib"), dst_dir: &fakeroot.join("lib") });
|
||||||
|
recreate_dir(&fakeroot.join("lib").join("rustlib"));
|
||||||
|
|
||||||
|
shallow_symlink_dir(Symlink {
|
||||||
|
src_dir: &sysroot.join("lib").join("rustlib"),
|
||||||
|
dst_dir: &fakeroot.join("lib").join("rustlib"),
|
||||||
|
});
|
||||||
|
recreate_dir(&fakeroot.join("lib").join("rustlib").join("src"));
|
||||||
|
|
||||||
|
shallow_symlink_dir(Symlink {
|
||||||
|
src_dir: &sysroot.join("lib").join("rustlib").join("src"),
|
||||||
|
dst_dir: &fakeroot.join("lib").join("rustlib").join("src"),
|
||||||
|
});
|
||||||
|
|
||||||
|
rfs::recursive_remove(&fakeroot.join("lib").join("rustlib").join("src").join("rust"));
|
||||||
|
|
||||||
|
let run_incr_rustc = || {
|
||||||
|
bare_rustc()
|
||||||
|
.sysroot(&fakeroot)
|
||||||
|
.arg("-C")
|
||||||
|
.arg(format!("incremental={}", incr.to_str().unwrap()))
|
||||||
|
.input("main.rs")
|
||||||
|
.run();
|
||||||
|
};
|
||||||
|
|
||||||
|
// Run rustc w/ incremental once...
|
||||||
|
run_incr_rustc();
|
||||||
|
|
||||||
|
// NOTE: the Makefile version of this used `$SYSROOT/lib/rustlib/src/rust/src/libstd/lib.rs`,
|
||||||
|
// but that actually got moved around and reorganized over the years. As of Dec 2024, the
|
||||||
|
// rust-src component is more like (specific for our purposes):
|
||||||
|
//
|
||||||
|
// ```
|
||||||
|
// $SYSROOT/lib/rustlib/src/rust/
|
||||||
|
// library/std/src/lib.rs
|
||||||
|
// src/
|
||||||
|
// ```
|
||||||
|
rfs::create_dir_all(
|
||||||
|
&fakeroot
|
||||||
|
.join("lib")
|
||||||
|
.join("rustlib")
|
||||||
|
.join("src")
|
||||||
|
.join("rust")
|
||||||
|
.join("library")
|
||||||
|
.join("std")
|
||||||
|
.join("src"),
|
||||||
|
);
|
||||||
|
rfs::write(
|
||||||
|
&fakeroot
|
||||||
|
.join("lib")
|
||||||
|
.join("rustlib")
|
||||||
|
.join("src")
|
||||||
|
.join("rust")
|
||||||
|
.join("library")
|
||||||
|
.join("std")
|
||||||
|
.join("src")
|
||||||
|
.join("lib.rs"),
|
||||||
|
b"",
|
||||||
|
);
|
||||||
|
|
||||||
|
// ... and a second time.
|
||||||
|
run_incr_rustc();
|
||||||
|
|
||||||
|
// Basic sanity check that the compiled binary can run.
|
||||||
|
run("main");
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue