Auto merge of #126279 - Oneirical:you-can-run-make-but-cannot-hide, r=jieyouxu
Migrate `inaccessible-temp-dir`, `output-with-hyphens` and `issue-10971-temps-dir` `run-make` tests to `rmake` Part of #121876 and the associated [Google Summer of Code project](https://blog.rust-lang.org/2024/05/01/gsoc-2024-selected-projects.html). try-job: x86_64-msvc
This commit is contained in:
commit
c2932aaf9d
8 changed files with 112 additions and 53 deletions
|
@ -214,6 +214,38 @@ pub fn cwd() -> PathBuf {
|
|||
env::current_dir().unwrap()
|
||||
}
|
||||
|
||||
// FIXME(Oneirical): This will no longer be required after compiletest receives the ability
|
||||
// to manipulate read-only files. See https://github.com/rust-lang/rust/issues/126334
|
||||
/// Ensure that the path P is read-only while the test runs, and restore original permissions
|
||||
/// at the end so compiletest can clean up.
|
||||
/// This will panic on Windows if the path is a directory (as it would otherwise do nothing)
|
||||
#[track_caller]
|
||||
pub fn test_while_readonly<P: AsRef<Path>, F: FnOnce() + std::panic::UnwindSafe>(
|
||||
path: P,
|
||||
closure: F,
|
||||
) {
|
||||
let path = path.as_ref();
|
||||
if is_windows() && path.is_dir() {
|
||||
eprintln!("This helper function cannot be used on Windows to make directories readonly.");
|
||||
eprintln!(
|
||||
"See the official documentation:
|
||||
https://doc.rust-lang.org/std/fs/struct.Permissions.html#method.set_readonly"
|
||||
);
|
||||
panic!("`test_while_readonly` on directory detected while on Windows.");
|
||||
}
|
||||
let metadata = fs_wrapper::metadata(&path);
|
||||
let original_perms = metadata.permissions();
|
||||
|
||||
let mut new_perms = original_perms.clone();
|
||||
new_perms.set_readonly(true);
|
||||
fs_wrapper::set_permissions(&path, new_perms);
|
||||
|
||||
let success = std::panic::catch_unwind(closure);
|
||||
|
||||
fs_wrapper::set_permissions(&path, original_perms);
|
||||
success.unwrap();
|
||||
}
|
||||
|
||||
/// Use `cygpath -w` on a path to get a Windows path string back. This assumes that `cygpath` is
|
||||
/// available on the platform!
|
||||
#[track_caller]
|
||||
|
|
|
@ -61,7 +61,6 @@ run-make/foreign-double-unwind/Makefile
|
|||
run-make/foreign-exceptions/Makefile
|
||||
run-make/foreign-rust-exceptions/Makefile
|
||||
run-make/glibc-staticlib-args/Makefile
|
||||
run-make/inaccessible-temp-dir/Makefile
|
||||
run-make/include_bytes_deps/Makefile
|
||||
run-make/incr-add-rust-src-component/Makefile
|
||||
run-make/incr-foreign-head-span/Makefile
|
||||
|
@ -74,7 +73,6 @@ run-make/invalid-library/Makefile
|
|||
run-make/invalid-so/Makefile
|
||||
run-make/invalid-staticlib/Makefile
|
||||
run-make/issue-107094/Makefile
|
||||
run-make/issue-10971-temps-dir/Makefile
|
||||
run-make/issue-109934-lto-debuginfo/Makefile
|
||||
run-make/issue-14698/Makefile
|
||||
run-make/issue-15460/Makefile
|
||||
|
@ -150,7 +148,6 @@ run-make/optimization-remarks-dir/Makefile
|
|||
run-make/output-filename-conflicts-with-directory/Makefile
|
||||
run-make/output-filename-overwrites-input/Makefile
|
||||
run-make/output-type-permutations/Makefile
|
||||
run-make/output-with-hyphens/Makefile
|
||||
run-make/override-aliased-flags/Makefile
|
||||
run-make/overwrite-input/Makefile
|
||||
run-make/panic-abort-eh_frame/Makefile
|
||||
|
|
|
@ -1,32 +0,0 @@
|
|||
# only-linux
|
||||
# ignore-arm - linker error on `armhf-gnu`
|
||||
|
||||
include ../tools.mk
|
||||
|
||||
# Issue #66530: We would ICE if someone compiled with `-o /dev/null`,
|
||||
# because we would try to generate auxiliary files in `/dev/` (which
|
||||
# at least the OS X file system rejects).
|
||||
#
|
||||
# An attempt to `-Ztemps-dir` into a directory we cannot write into should
|
||||
# indeed be an error; but not an ICE.
|
||||
#
|
||||
# However, some folks run tests as root, which can write `/dev/` and end
|
||||
# up clobbering `/dev/null`. Instead we'll use an inaccessible path, which
|
||||
# also used to ICE, but even root can't magically write there.
|
||||
#
|
||||
# Note that `-Ztemps-dir` uses `create_dir_all` so it is not sufficient to
|
||||
# use a directory with non-existing parent like `/does-not-exist/output`.
|
||||
|
||||
all:
|
||||
# Create an inaccessible directory
|
||||
mkdir $(TMPDIR)/inaccessible
|
||||
chmod 000 $(TMPDIR)/inaccessible
|
||||
|
||||
# Run rustc with `-Ztemps-dir` set to a directory
|
||||
# *inside* the inaccessible one, so that it can't create it
|
||||
$(RUSTC) program.rs -Ztemps-dir=$(TMPDIR)/inaccessible/tmp 2>&1 \
|
||||
| $(CGREP) 'failed to find or create the directory specified by `--temps-dir`'
|
||||
|
||||
# Make the inaccessible directory accessible,
|
||||
# so that compiletest can delete the temp dir
|
||||
chmod +rw $(TMPDIR)/inaccessible
|
38
tests/run-make/inaccessible-temp-dir/rmake.rs
Normal file
38
tests/run-make/inaccessible-temp-dir/rmake.rs
Normal file
|
@ -0,0 +1,38 @@
|
|||
// Issue #66530: We would ICE if someone compiled with `-o /dev/null`,
|
||||
// because we would try to generate auxiliary files in `/dev/` (which
|
||||
// at least the OS X file system rejects).
|
||||
//
|
||||
// An attempt to `-Ztemps-dir` into a directory we cannot write into should
|
||||
// indeed be an error; but not an ICE.
|
||||
//
|
||||
// However, some folks run tests as root, which can write `/dev/` and end
|
||||
// up clobbering `/dev/null`. Instead we'll use an inaccessible path, which
|
||||
// also used to ICE, but even root can't magically write there.
|
||||
//
|
||||
// Note that `-Ztemps-dir` uses `create_dir_all` so it is not sufficient to
|
||||
// use a directory with non-existing parent like `/does-not-exist/output`.
|
||||
// See https://github.com/rust-lang/rust/issues/66530
|
||||
|
||||
//@ ignore-arm
|
||||
// Reason: linker error on `armhf-gnu`
|
||||
//@ ignore-windows
|
||||
// Reason: `set_readonly` has no effect on directories
|
||||
// and does not prevent modification.
|
||||
|
||||
use run_make_support::{fs_wrapper, rustc, test_while_readonly};
|
||||
|
||||
fn main() {
|
||||
// Create an inaccessible directory.
|
||||
fs_wrapper::create_dir("inaccessible");
|
||||
test_while_readonly("inaccessible", || {
|
||||
// Run rustc with `-Z temps-dir` set to a directory *inside* the inaccessible one,
|
||||
// so that it can't create `tmp`.
|
||||
rustc()
|
||||
.input("program.rs")
|
||||
.arg("-Ztemps-dir=inaccessible/tmp")
|
||||
.run_fail()
|
||||
.assert_stderr_contains(
|
||||
"failed to find or create the directory specified by `--temps-dir`",
|
||||
);
|
||||
});
|
||||
}
|
|
@ -1,10 +0,0 @@
|
|||
include ../tools.mk
|
||||
|
||||
# Regression test for issue #10971
|
||||
# Running two invocations in parallel would overwrite each other's temp files.
|
||||
|
||||
all:
|
||||
touch $(TMPDIR)/lib.rs
|
||||
|
||||
$(RUSTC) --crate-type=lib -Z temps-dir=$(TMPDIR)/temp1 $(TMPDIR)/lib.rs & \
|
||||
$(RUSTC) --crate-type=staticlib -Z temps-dir=$(TMPDIR)/temp2 $(TMPDIR)/lib.rs
|
|
@ -1,8 +0,0 @@
|
|||
# ignore-cross-compile
|
||||
include ../tools.mk
|
||||
|
||||
all:
|
||||
$(RUSTC) foo-bar.rs --crate-type bin
|
||||
[ -f $(TMPDIR)/$(call BIN,foo-bar) ]
|
||||
$(RUSTC) foo-bar.rs --crate-type lib
|
||||
[ -f $(TMPDIR)/libfoo_bar.rlib ]
|
17
tests/run-make/output-with-hyphens/rmake.rs
Normal file
17
tests/run-make/output-with-hyphens/rmake.rs
Normal file
|
@ -0,0 +1,17 @@
|
|||
// Rust files with hyphens in their filename should
|
||||
// not result in compiled libraries keeping that hyphen -
|
||||
// it should become an underscore. Only bin executables
|
||||
// should keep the hyphen. This test ensures that this rule
|
||||
// remains enforced.
|
||||
// See https://github.com/rust-lang/rust/pull/23786
|
||||
|
||||
//@ ignore-cross-compile
|
||||
|
||||
use run_make_support::{bin_name, path, rust_lib_name, rustc};
|
||||
|
||||
fn main() {
|
||||
rustc().input("foo-bar.rs").crate_type("bin").run();
|
||||
assert!(path(bin_name("foo-bar")).exists());
|
||||
rustc().input("foo-bar.rs").crate_type("lib").run();
|
||||
assert!(path(rust_lib_name("foo_bar")).exists());
|
||||
}
|
25
tests/run-make/parallel-rustc-no-overwrite/rmake.rs
Normal file
25
tests/run-make/parallel-rustc-no-overwrite/rmake.rs
Normal file
|
@ -0,0 +1,25 @@
|
|||
// When two instances of rustc are invoked in parallel, they
|
||||
// can conflict on their temporary files and overwrite each others',
|
||||
// leading to unsuccessful compilation. The -Z temps-dir flag adds
|
||||
// separate designated directories for each rustc invocation, preventing
|
||||
// conflicts. This test uses this flag and checks for successful compilation.
|
||||
// See https://github.com/rust-lang/rust/pull/83846
|
||||
|
||||
use run_make_support::{fs_wrapper, rustc};
|
||||
use std::sync::{Arc, Barrier};
|
||||
use std::thread;
|
||||
|
||||
fn main() {
|
||||
fs_wrapper::create_file("lib.rs");
|
||||
let barrier = Arc::new(Barrier::new(2));
|
||||
let handle = {
|
||||
let barrier = Arc::clone(&barrier);
|
||||
thread::spawn(move || {
|
||||
barrier.wait();
|
||||
rustc().crate_type("lib").arg("-Ztemps-dir=temp1").input("lib.rs").run();
|
||||
})
|
||||
};
|
||||
barrier.wait();
|
||||
rustc().crate_type("staticlib").arg("-Ztemps-dir=temp2").input("lib.rs").run();
|
||||
handle.join().expect("lib thread panicked");
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue