Skip to content

Commit

Permalink
Auto merge of #125031 - Oneirical:dynamic-libs, r=jieyouxu
Browse files Browse the repository at this point in the history
Migrate `run-make/issue-11908` to new `rmake.rs` format

Part of #121876 and the associated [Google Summer of Code project](https://blog.rust-lang.org/2024/05/01/gsoc-2024-selected-projects.html).

Set as draft, because I have a few concerns:

- [x] I am not sure if `target().contains("darwin")` is a good way of checking that the target is on OSX.
- [x] I find it strange that the `dylib` part of the test adapts to different target platforms, but not the `rlib` part. Is `rlib` named the same on all platforms?
  • Loading branch information
bors committed May 15, 2024
2 parents 0160bff + 81f7e54 commit 9e7aff7
Show file tree
Hide file tree
Showing 8 changed files with 79 additions and 37 deletions.
51 changes: 47 additions & 4 deletions src/tools/run-make-support/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -40,12 +40,17 @@ pub fn target() -> String {

/// Check if target is windows-like.
pub fn is_windows() -> bool {
env::var_os("IS_WINDOWS").is_some()
target().contains("windows")
}

/// Check if target uses msvc.
pub fn is_msvc() -> bool {
env::var_os("IS_MSVC").is_some()
target().contains("msvc")
}

/// Check if target uses macOS.
pub fn is_darwin() -> bool {
target().contains("darwin")
}

/// Construct a path to a static library under `$TMPDIR` given the library name. This will return a
Expand Down Expand Up @@ -82,9 +87,47 @@ pub fn static_lib_name(name: &str) -> String {
// endif
// endif
// ```
assert!(!name.contains(char::is_whitespace), "name cannot contain whitespace");
assert!(!name.contains(char::is_whitespace), "static library name cannot contain whitespace");

if is_msvc() { format!("{name}.lib") } else { format!("lib{name}.a") }
}

/// Construct a path to a dynamic library under `$TMPDIR` given the library name. This will return a
/// path with `$TMPDIR` joined with platform-and-compiler-specific library name.
pub fn dynamic_lib(name: &str) -> PathBuf {
tmp_dir().join(dynamic_lib_name(name))
}

/// Construct the dynamic library name based on the platform.
pub fn dynamic_lib_name(name: &str) -> String {
// See tools.mk (irrelevant lines omitted):
//
// ```makefile
// ifeq ($(UNAME),Darwin)
// DYLIB = $(TMPDIR)/lib$(1).dylib
// else
// ifdef IS_WINDOWS
// DYLIB = $(TMPDIR)/$(1).dll
// else
// DYLIB = $(TMPDIR)/lib$(1).so
// endif
// endif
// ```
assert!(!name.contains(char::is_whitespace), "dynamic library name cannot contain whitespace");

if is_darwin() {
format!("lib{name}.dylib")
} else if is_windows() {
format!("{name}.dll")
} else {
format!("lib{name}.so")
}
}

if target().contains("msvc") { format!("{name}.lib") } else { format!("lib{name}.a") }
/// Construct a path to a rust library (rlib) under `$TMPDIR` given the library name. This will return a
/// path with `$TMPDIR` joined with the library name.
pub fn rust_lib(name: &str) -> PathBuf {
tmp_dir().join(format!("lib{name}.rlib"))
}

/// Construct the binary name based on platform.
Expand Down
10 changes: 2 additions & 8 deletions src/tools/run-make-support/src/rustc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ impl Rustc {
self
}

/// Specify path to the output file.
/// Specify path to the output file. Equivalent to `-o`` in rustc.
pub fn output<P: AsRef<Path>>(&mut self, path: P) -> &mut Self {
self.cmd.arg("-o");
self.cmd.arg(path.as_ref());
Expand Down Expand Up @@ -150,13 +150,7 @@ impl Rustc {
self
}

/// Enables link time optimizations in rustc. Equivalent to `-Clto``.
pub fn lto(&mut self) -> &mut Self {
self.cmd.arg("-Clto");
self
}

/// Add a directory to the library search path.
/// Add a directory to the library search path. Equivalent to `-L`` in rustc.
pub fn library_search_path<P: AsRef<Path>>(&mut self, path: P) -> &mut Self {
self.cmd.arg("-L");
self.cmd.arg(path.as_ref());
Expand Down
1 change: 0 additions & 1 deletion src/tools/tidy/src/allowed_run_make_makefiles.txt
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,6 @@ 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-11908/Makefile
run-make/issue-14698/Makefile
run-make/issue-15460/Makefile
run-make/issue-18943/Makefile
Expand Down
22 changes: 0 additions & 22 deletions tests/run-make/issue-11908/Makefile

This file was deleted.

4 changes: 2 additions & 2 deletions tests/run-make/reachable-extern-fn-available-lto/rmake.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,15 @@

//@ ignore-cross-compile

use run_make_support::{cc, extra_c_flags, run, rustc, static_lib, tmp_dir};
use run_make_support::{cc, extra_c_flags, run, rustc, static_lib};

fn main() {
let libbar_path = static_lib("bar");
rustc().input("foo.rs").crate_type("rlib").run();
rustc()
.input("bar.rs")
.crate_type("staticlib")
.lto()
.arg("-Clto")
.library_search_path(".")
.output(&libbar_path)
.run();
Expand Down
File renamed without changes.
File renamed without changes.
28 changes: 28 additions & 0 deletions tests/run-make/same-lib-two-locations-no-panic/rmake.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// A path which contains the same rlib or dylib in two locations
// should not cause an assertion panic in the compiler.
// This test tries to replicate the linked issue and checks
// if the bugged error makes a resurgence.

// See https://github.com/rust-lang/rust/issues/11908

//@ ignore-cross-compile

use run_make_support::{dynamic_lib, rust_lib, rustc, tmp_dir};
use std::fs;

fn main() {
let tmp_dir_other = tmp_dir().join("other");

fs::create_dir(&tmp_dir_other);
rustc().input("foo.rs").crate_type("dylib").arg("-Cprefer-dynamic").run();
fs::rename(dynamic_lib("foo"), &tmp_dir_other);
rustc().input("foo.rs").crate_type("dylib").arg("-Cprefer-dynamic").run();
rustc().input("bar.rs").library_search_path(&tmp_dir_other).run();
fs::remove_dir_all(tmp_dir());

fs::create_dir_all(&tmp_dir_other);
rustc().input("foo.rs").crate_type("rlib").run();
fs::rename(rust_lib("foo"), &tmp_dir_other);
rustc().input("foo.rs").crate_type("rlib").run();
rustc().input("bar.rs").library_search_path(tmp_dir_other).run();
}

0 comments on commit 9e7aff7

Please sign in to comment.