about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/tools/tidy/src/allowed_run_make_makefiles.txt1
-rw-r--r--tests/run-make/rlib-format-packed-bundled-libs-3/Makefile35
-rw-r--r--tests/run-make/rlib-format-packed-bundled-libs-3/rmake.rs88
3 files changed, 88 insertions, 36 deletions
diff --git a/src/tools/tidy/src/allowed_run_make_makefiles.txt b/src/tools/tidy/src/allowed_run_make_makefiles.txt
index 7fffe7c6ea5..63e96566a09 100644
--- a/src/tools/tidy/src/allowed_run_make_makefiles.txt
+++ b/src/tools/tidy/src/allowed_run_make_makefiles.txt
@@ -92,7 +92,6 @@ run-make/reproducible-build-2/Makefile
 run-make/reproducible-build/Makefile
 run-make/return-non-c-like-enum-from-c/Makefile
 run-make/rlib-format-packed-bundled-libs-2/Makefile
-run-make/rlib-format-packed-bundled-libs-3/Makefile
 run-make/rlib-format-packed-bundled-libs/Makefile
 run-make/sanitizer-cdylib-link/Makefile
 run-make/sanitizer-dylib-link/Makefile
diff --git a/tests/run-make/rlib-format-packed-bundled-libs-3/Makefile b/tests/run-make/rlib-format-packed-bundled-libs-3/Makefile
deleted file mode 100644
index 9ba077b1854..00000000000
--- a/tests/run-make/rlib-format-packed-bundled-libs-3/Makefile
+++ /dev/null
@@ -1,35 +0,0 @@
-include ../tools.mk
-
-# ignore-cross-compile
-# only-linux
-
-# Make sure -Zpacked_bundled_libs-like behavior activates with +bundle,+whole-archive.
-
-# We're using the llvm-nm instead of the system nm to ensure it is compatible
-# with the LLVM bitcode generated by rustc.
-NM = "$(LLVM_BIN_DIR)"/llvm-nm
-
-all: $(call NATIVE_STATICLIB,native_dep_1) $(call NATIVE_STATICLIB,native_dep_2) $(call NATIVE_STATICLIB,native_dep_3) $(call NATIVE_STATICLIB,native_dep_4)
-	# test cfg with packed bundle
-	$(RUSTC) rust_dep_cfg.rs --crate-type=rlib
-	$(RUSTC) main.rs --extern rust_dep=$(TMPDIR)/librust_dep_cfg.rlib --crate-type=staticlib --cfg should_add
-	$(AR) t $(TMPDIR)/librust_dep_cfg.rlib | $(CGREP) -e "libnative_dep_1.a"
-	$(AR) t $(TMPDIR)/librust_dep_cfg.rlib | $(CGREP) -e "libnative_dep_2.a"
-	$(AR) t $(TMPDIR)/libmain.a | $(CGREP) -e "libnative_dep_1.o"
-	$(AR) t $(TMPDIR)/libmain.a | $(CGREP) -ev "libnative_dep_2.o"
-
-
-	# test bundle with whole_archive
-	$(RUSTC) rust_dep.rs --crate-type=rlib
-	$(AR) t $(TMPDIR)/librust_dep.rlib | $(CGREP) -e "native_dep_1"
-	$(AR) t $(TMPDIR)/librust_dep.rlib | $(CGREP) -e "native_dep_3"
-	$(AR) t $(TMPDIR)/librust_dep.rlib | $(CGREP) -ev "native_dep_2"
-	$(AR) t $(TMPDIR)/librust_dep.rlib | $(CGREP) -ev "native_dep_4"
-
-	# Make sure compiler doesn't use files, that it shouldn't know about.
-	rm $(TMPDIR)/libnative_dep_1.a
-	rm $(TMPDIR)/libnative_dep_3.a
-
-	$(RUSTC) main.rs --extern rust_dep=$(TMPDIR)/librust_dep.rlib --print link-args > $(TMPDIR)/link_args
-	cat $(TMPDIR)/link_args | $(CGREP) -ev "native_dep_3"
-	cat $(TMPDIR)/link_args | $(CGREP) -e "--whole-archive.*native_dep_1.*--whole-archive.*lnative_dep_2.*no-whole-archive.*lnative_dep_4"
diff --git a/tests/run-make/rlib-format-packed-bundled-libs-3/rmake.rs b/tests/run-make/rlib-format-packed-bundled-libs-3/rmake.rs
new file mode 100644
index 00000000000..ede4d9f031d
--- /dev/null
+++ b/tests/run-make/rlib-format-packed-bundled-libs-3/rmake.rs
@@ -0,0 +1,88 @@
+// `-Z packed_bundled_libs` is an unstable rustc flag that makes the compiler
+// only require a native library and no supplementary object files to compile.
+// #105601 made it possible to have this behaviour without an unstable flag by
+// passing +bundle in modifiers, and this test checks that this feature successfully
+// compiles and includes only the static libraries, with no object files.
+// See https://github.com/rust-lang/rust/pull/105601
+
+use run_make_support::{
+    build_native_static_lib, fs_wrapper, is_msvc, llvm_ar, regex, rust_lib_name, rustc,
+    static_lib_name,
+};
+
+// FIXME only-linux test-various
+
+fn main() {
+    build_native_static_lib("native_dep_1");
+    build_native_static_lib("native_dep_2");
+    build_native_static_lib("native_dep_3");
+    build_native_static_lib("native_dep_4");
+    // Test cfg with packed bundle.
+    rustc().input("rust_dep_cfg.rs").crate_type("rlib").run();
+    rustc()
+        .input("main.rs")
+        .extern_("rust_dep", rust_lib_name("rust_dep_cfg"))
+        .crate_type("staticlib")
+        .cfg("should_add")
+        .run();
+    // Only static libraries should appear, no object files at all.
+    llvm_ar()
+        .arg("t")
+        .arg(rust_lib_name("rust_dep_cfg"))
+        .run()
+        .assert_stdout_contains(static_lib_name("native_dep_1"));
+    llvm_ar()
+        .arg("t")
+        .arg(rust_lib_name("rust_dep_cfg"))
+        .run()
+        .assert_stdout_contains(static_lib_name("native_dep_2"));
+    llvm_ar()
+        .arg("t")
+        .arg(static_lib_name("main"))
+        .run()
+        .assert_stdout_contains(object_file_name("native_dep_1"));
+    llvm_ar()
+        .arg("t")
+        .arg(static_lib_name("main"))
+        .run()
+        .assert_stdout_not_contains(object_file_name("native_dep_2"));
+
+    // Test bundle with whole archive.
+    rustc().input("rust_dep.rs").crate_type("rlib").run();
+    // Only deps with `+bundle` should appear.
+    llvm_ar().arg("t").arg(rust_lib_name("rust_dep")).run().assert_stdout_contains("native_dep_1");
+    llvm_ar().arg("t").arg(rust_lib_name("rust_dep")).run().assert_stdout_contains("native_dep_3");
+    llvm_ar()
+        .arg("t")
+        .arg(rust_lib_name("rust_dep"))
+        .run()
+        .assert_stdout_not_contains("native_dep_2");
+    llvm_ar()
+        .arg("t")
+        .arg(rust_lib_name("rust_dep"))
+        .run()
+        .assert_stdout_not_contains("native_dep_4");
+
+    // The compiler shouldn't use files which it doesn't know about.
+    fs_wrapper::remove_file(static_lib_name("native_dep_1"));
+    fs_wrapper::remove_file(static_lib_name("native_dep_3"));
+
+    let out = rustc()
+        .input("main.rs")
+        .extern_("rust_dep", rust_lib_name("rust_dep"))
+        .print("link-args")
+        .run()
+        .assert_stdout_not_contains("native_dep_3")
+        .stdout_utf8();
+
+    let re = regex::Regex::new(
+"--whole-archive.*native_dep_1.*--whole-archive.*lnative_dep_2.*no-whole-archive.*lnative_dep_4"
+    ).unwrap();
+
+    assert!(re.is_match(&out));
+}
+
+//FIXME(Oneirical): potential helper fn if this works on msvc too
+fn object_file_name(name: &str) -> String {
+    if is_msvc() { format!("{name}.obj") } else { format!("{name}.o") }
+}