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/reproducible-build/Makefile140
-rw-r--r--tests/run-make/reproducible-build/rmake.rs222
3 files changed, 222 insertions, 141 deletions
diff --git a/src/tools/tidy/src/allowed_run_make_makefiles.txt b/src/tools/tidy/src/allowed_run_make_makefiles.txt
index 92405bdb876..f55abb513b8 100644
--- a/src/tools/tidy/src/allowed_run_make_makefiles.txt
+++ b/src/tools/tidy/src/allowed_run_make_makefiles.txt
@@ -8,7 +8,6 @@ run-make/jobserver-error/Makefile
 run-make/libs-through-symlinks/Makefile
 run-make/libtest-thread-limit/Makefile
 run-make/macos-deployment-target/Makefile
-run-make/reproducible-build/Makefile
 run-make/split-debuginfo/Makefile
 run-make/symbol-mangling-hashed/Makefile
 run-make/translation/Makefile
diff --git a/tests/run-make/reproducible-build/Makefile b/tests/run-make/reproducible-build/Makefile
deleted file mode 100644
index f5d17a234c0..00000000000
--- a/tests/run-make/reproducible-build/Makefile
+++ /dev/null
@@ -1,140 +0,0 @@
-# ignore-cross-compile
-include ../tools.mk
-
-# ignore-musl
-# Objects are reproducible but their path is not.
-
-all:  \
-	smoke \
-	debug \
-	opt \
-	link_paths \
-	remap_paths \
-	different_source_dirs_rlib \
-	remap_cwd_rlib \
-	remap_cwd_to_empty \
-	extern_flags
-
-# TODO: Builds of `bin` crate types are not deterministic with debuginfo=2 on
-# Windows.
-# See: https://github.com/rust-lang/rust/pull/87320#issuecomment-920105533
-# Issue: https://github.com/rust-lang/rust/issues/88982
-#
-#	different_source_dirs_bin \
-#	remap_cwd_bin \
-
-smoke:
-	rm -rf $(TMPDIR) && mkdir $(TMPDIR)
-	$(RUSTC) linker.rs -O
-	$(RUSTC) reproducible-build-aux.rs
-	$(RUSTC) reproducible-build.rs -C linker=$(call RUN_BINFILE,linker)
-	$(RUSTC) reproducible-build.rs -C linker=$(call RUN_BINFILE,linker)
-	diff -u "$(TMPDIR)/linker-arguments1" "$(TMPDIR)/linker-arguments2"
-
-debug:
-	rm -rf $(TMPDIR) && mkdir $(TMPDIR)
-	$(RUSTC) linker.rs -O
-	$(RUSTC) reproducible-build-aux.rs -g
-	$(RUSTC) reproducible-build.rs -C linker=$(call RUN_BINFILE,linker) -g
-	$(RUSTC) reproducible-build.rs -C linker=$(call RUN_BINFILE,linker) -g
-	diff -u "$(TMPDIR)/linker-arguments1" "$(TMPDIR)/linker-arguments2"
-
-opt:
-	rm -rf $(TMPDIR) && mkdir $(TMPDIR)
-	$(RUSTC) linker.rs -O
-	$(RUSTC) reproducible-build-aux.rs -O
-	$(RUSTC) reproducible-build.rs -C linker=$(call RUN_BINFILE,linker) -O
-	$(RUSTC) reproducible-build.rs -C linker=$(call RUN_BINFILE,linker) -O
-	diff -u "$(TMPDIR)/linker-arguments1" "$(TMPDIR)/linker-arguments2"
-
-link_paths:
-	rm -rf $(TMPDIR) && mkdir $(TMPDIR)
-	$(RUSTC) reproducible-build-aux.rs
-	$(RUSTC) reproducible-build.rs --crate-type rlib -L /b
-	cp $(TMPDIR)/libreproducible_build.rlib $(TMPDIR)/libfoo.rlib
-	$(RUSTC) reproducible-build.rs --crate-type rlib -L /a
-	cmp "$(TMPDIR)/libreproducible_build.rlib" "$(TMPDIR)/libfoo.rlib" || exit 1
-
-remap_paths:
-	rm -rf $(TMPDIR) && mkdir $(TMPDIR)
-	$(RUSTC) reproducible-build-aux.rs
-	$(RUSTC) reproducible-build.rs --crate-type rlib --remap-path-prefix=/a=/c
-	cp $(TMPDIR)/libreproducible_build.rlib $(TMPDIR)/libfoo.rlib
-	$(RUSTC) reproducible-build.rs --crate-type rlib --remap-path-prefix=/b=/c
-	cmp "$(TMPDIR)/libreproducible_build.rlib" "$(TMPDIR)/libfoo.rlib" || exit 1
-
-different_source_dirs_bin:
-	rm -rf $(TMPDIR) && mkdir $(TMPDIR)
-	$(RUSTC) reproducible-build-aux.rs
-	mkdir $(TMPDIR)/test
-	cp reproducible-build.rs $(TMPDIR)/test
-	$(RUSTC) reproducible-build.rs --crate-type bin --remap-path-prefix=$$PWD=/b
-	cp $(TMPDIR)/reproducible-build $(TMPDIR)/foo
-	(cd $(TMPDIR)/test && $(RUSTC) reproducible-build.rs \
-		--remap-path-prefix=$(TMPDIR)/test=/b \
-		--crate-type bin)
-	cmp "$(TMPDIR)/reproducible-build" "$(TMPDIR)/foo" || exit 1
-
-different_source_dirs_rlib:
-	rm -rf $(TMPDIR) && mkdir $(TMPDIR)
-	$(RUSTC) reproducible-build-aux.rs
-	mkdir $(TMPDIR)/test
-	cp reproducible-build.rs $(TMPDIR)/test
-	$(RUSTC) reproducible-build.rs --crate-type rlib --remap-path-prefix=$$PWD=/b
-	cp $(TMPDIR)/libreproducible_build.rlib $(TMPDIR)/libfoo.rlib
-	(cd $(TMPDIR)/test && $(RUSTC) reproducible-build.rs \
-		--remap-path-prefix=$(TMPDIR)/test=/b \
-		--crate-type rlib)
-	cmp "$(TMPDIR)/libreproducible_build.rlib" "$(TMPDIR)/libfoo.rlib" || exit 1
-
-remap_cwd_bin:
-	rm -rf $(TMPDIR) && mkdir $(TMPDIR)
-	$(RUSTC) reproducible-build-aux.rs
-	mkdir $(TMPDIR)/test
-	cp reproducible-build.rs $(TMPDIR)/test
-	$(RUSTC) reproducible-build.rs --crate-type bin -C debuginfo=2 \
-	  -Z remap-cwd-prefix=.
-	cp $(TMPDIR)/reproducible-build $(TMPDIR)/first
-	(cd $(TMPDIR)/test && \
-	 $(RUSTC) reproducible-build.rs --crate-type bin -C debuginfo=2 \
-	   -Z remap-cwd-prefix=.)
-	cmp "$(TMPDIR)/first" "$(TMPDIR)/reproducible-build" || exit 1
-
-remap_cwd_rlib:
-	rm -rf $(TMPDIR) && mkdir $(TMPDIR)
-	$(RUSTC) reproducible-build-aux.rs
-	mkdir $(TMPDIR)/test
-	cp reproducible-build.rs $(TMPDIR)/test
-	$(RUSTC) reproducible-build.rs --crate-type rlib -C debuginfo=2 \
-	  -Z remap-cwd-prefix=.
-	cp $(TMPDIR)/libreproducible_build.rlib $(TMPDIR)/libfirst.rlib
-	(cd $(TMPDIR)/test && \
-	 $(RUSTC) reproducible-build.rs --crate-type rlib -C debuginfo=2 \
-	   -Z remap-cwd-prefix=.)
-	cmp "$(TMPDIR)/libfirst.rlib" "$(TMPDIR)/libreproducible_build.rlib" || exit 1
-
-remap_cwd_to_empty:
-	rm -rf $(TMPDIR) && mkdir $(TMPDIR)
-	$(RUSTC) reproducible-build-aux.rs
-	mkdir $(TMPDIR)/test
-	cp reproducible-build.rs $(TMPDIR)/test
-	$(RUSTC) reproducible-build.rs --crate-type rlib -C debuginfo=2 \
-	  -Z remap-cwd-prefix=
-	cp $(TMPDIR)/libreproducible_build.rlib $(TMPDIR)/libfirst.rlib
-	(cd $(TMPDIR)/test && \
-	 $(RUSTC) reproducible-build.rs --crate-type rlib -C debuginfo=2 \
-	   -Z remap-cwd-prefix=)
-	cmp "$(TMPDIR)/libfirst.rlib" "$(TMPDIR)/libreproducible_build.rlib" || exit 1
-
-extern_flags:
-	rm -rf $(TMPDIR) && mkdir $(TMPDIR)
-	$(RUSTC) reproducible-build-aux.rs
-	$(RUSTC) reproducible-build.rs \
-		--extern reproducible_build_aux=$(TMPDIR)/libreproducible_build_aux.rlib \
-		--crate-type rlib
-	cp $(TMPDIR)/libreproducible_build_aux.rlib $(TMPDIR)/libbar.rlib
-	cp $(TMPDIR)/libreproducible_build.rlib $(TMPDIR)/libfoo.rlib
-	$(RUSTC) reproducible-build.rs \
-		--extern reproducible_build_aux=$(TMPDIR)/libbar.rlib \
-		--crate-type rlib
-	cmp "$(TMPDIR)/libreproducible_build.rlib" "$(TMPDIR)/libfoo.rlib" || exit 1
diff --git a/tests/run-make/reproducible-build/rmake.rs b/tests/run-make/reproducible-build/rmake.rs
new file mode 100644
index 00000000000..a5f27f34f4f
--- /dev/null
+++ b/tests/run-make/reproducible-build/rmake.rs
@@ -0,0 +1,222 @@
+// This test case makes sure that two identical invocations of the compiler
+// (i.e. same code base, same compile-flags, same compiler-versions, etc.)
+// produce the same output. In the past, symbol names of monomorphized functions
+// were not deterministic (which we want to avoid).
+//
+// The test tries to exercise as many different paths into symbol name
+// generation as possible:
+//
+// - regular functions
+// - generic functions
+// - methods
+// - statics
+// - closures
+// - enum variant constructors
+// - tuple struct constructors
+// - drop glue
+// - FnOnce adapters
+// - Trait object shims
+// - Fn Pointer shims
+// See https://github.com/rust-lang/rust/pull/32293
+
+// FIXME(Oneirical): ignore-musl
+// FIXME(Oneirical): two of these test blocks will apparently fail on windows
+// FIXME(Oneirical): try it on test-various
+// # FIXME: Builds of `bin` crate types are not deterministic with debuginfo=2 on
+// # Windows.
+// # See: https://github.com/rust-lang/rust/pull/87320#issuecomment-920105533
+// # Issue: https://github.com/rust-lang/rust/issues/88982
+
+use run_make_support::{bin_name, cwd, diff, rfs, run_in_tmpdir, rust_lib_name, rustc};
+
+fn main() {
+    run_in_tmpdir(|| {
+        rustc().input("linker.rs").opt().run();
+        rustc().input("reproducible-build-aux.rs").run();
+        rustc()
+            .input("reproducible-build.rs")
+            .linker(&cwd().join(bin_name("linker")).display().to_string())
+            .run();
+        rustc()
+            .input("reproducible-build.rs")
+            .linker(&cwd().join(bin_name("linker")).display().to_string())
+            .run();
+        diff().actual_file("linker-arguments1").expected_file("linker-arguments2").run();
+    });
+
+    run_in_tmpdir(|| {
+        rustc().input("linker.rs").opt().run();
+        rustc().arg("-g").input("reproducible-build-aux.rs").run();
+        rustc()
+            .arg("-g")
+            .input("reproducible-build.rs")
+            .linker(&cwd().join(bin_name("linker")).display().to_string())
+            .run();
+        rustc()
+            .arg("-g")
+            .input("reproducible-build.rs")
+            .linker(&cwd().join(bin_name("linker")).display().to_string())
+            .run();
+        diff().actual_file("linker-arguments1").expected_file("linker-arguments2").run();
+    });
+
+    run_in_tmpdir(|| {
+        rustc().input("linker.rs").opt().run();
+        rustc().opt().input("reproducible-build-aux.rs").run();
+        rustc()
+            .opt()
+            .input("reproducible-build.rs")
+            .linker(&cwd().join(bin_name("linker")).display().to_string())
+            .run();
+        rustc()
+            .opt()
+            .input("reproducible-build.rs")
+            .linker(&cwd().join(bin_name("linker")).display().to_string())
+            .run();
+        diff().actual_file("linker-arguments1").expected_file("linker-arguments2").run();
+    });
+
+    run_in_tmpdir(|| {
+        rustc().input("reproducible-build-aux.rs").run();
+        rustc().input("reproducible-build.rs").crate_type("rlib").library_search_path("b").run();
+        rfs::copy(rust_lib_name("reproducible_build"), rust_lib_name("foo"));
+        rustc().input("reproducible-build.rs").crate_type("rlib").library_search_path("a").run();
+        assert_eq!(rfs::read(rust_lib_name("reproducible_build")), rfs::read(rust_lib_name("foo")));
+    });
+
+    run_in_tmpdir(|| {
+        rustc().input("reproducible-build-aux.rs").run();
+        rustc()
+            .input("reproducible-build.rs")
+            .crate_type("rlib")
+            .arg("--remap-path-prefix=/a=/c")
+            .run();
+        rfs::copy(rust_lib_name("reproducible_build"), rust_lib_name("foo"));
+        rustc()
+            .input("reproducible-build.rs")
+            .crate_type("rlib")
+            .arg("--remap-path-prefix=/b=/c")
+            .run();
+        assert_eq!(rfs::read(rust_lib_name("reproducible_build")), rfs::read(rust_lib_name("foo")));
+    });
+
+    run_in_tmpdir(|| {
+        rustc().input("reproducible-build-aux.rs").run();
+        rfs::create_dir("test");
+        rfs::copy("reproducible-build.rs", "test/reproducible-build.rs");
+        rustc()
+            .input("reproducible-build.rs")
+            .crate_type("bin")
+            .arg(&format!("--remap-path-prefix={}=/b", cwd().display()))
+            .run();
+        eprintln!("{:#?}", rfs::shallow_find_dir_entries(cwd()));
+        rfs::copy(bin_name("reproducible_build"), bin_name("foo"));
+        rustc()
+            .input("test/reproducible-build.rs")
+            .crate_type("bin")
+            .arg("--remap-path-prefix=/test=/b")
+            .run();
+        assert_eq!(rfs::read(bin_name("reproducible_build")), rfs::read(bin_name("foo")));
+    });
+
+    run_in_tmpdir(|| {
+        rustc().input("reproducible-build-aux.rs").run();
+        rfs::create_dir("test");
+        rfs::copy("reproducible-build.rs", "test/reproducible-build.rs");
+        rustc()
+            .input("reproducible-build.rs")
+            .crate_type("rlib")
+            .arg(&format!("--remap-path-prefix={}=/b", cwd().display()))
+            .run();
+        rfs::copy(rust_lib_name("reproducible_build"), rust_lib_name("foo"));
+        rustc()
+            .input("test/reproducible-build.rs")
+            .crate_type("rlib")
+            .arg("--remap-path-prefix=/test=/b")
+            .run();
+        assert_eq!(rfs::read(rust_lib_name("reproducible_build")), rfs::read(rust_lib_name("foo")));
+    });
+
+    run_in_tmpdir(|| {
+        rustc().input("reproducible-build-aux.rs").run();
+        rfs::create_dir("test");
+        rfs::copy("reproducible-build.rs", "test/reproducible-build.rs");
+        rustc()
+            .input("reproducible-build.rs")
+            .crate_type("bin")
+            .arg("-Zremap-path-prefix=.")
+            .arg("-Cdebuginfo=2")
+            .run();
+        rfs::copy(bin_name("reproducible_build"), bin_name("first"));
+        rustc()
+            .input("test/reproducible-build.rs")
+            .crate_type("bin")
+            .arg("-Zremap-path-prefix=.")
+            .arg("-Cdebuginfo=2")
+            .run();
+        assert_eq!(rfs::read(bin_name("first")), rfs::read(bin_name("reproducible_build")));
+    });
+
+    run_in_tmpdir(|| {
+        rustc().input("reproducible-build-aux.rs").run();
+        rfs::create_dir("test");
+        rfs::copy("reproducible-build.rs", "test/reproducible-build.rs");
+        rustc()
+            .input("reproducible-build.rs")
+            .crate_type("rlib")
+            .arg("-Zremap-path-prefix=.")
+            .arg("-Cdebuginfo=2")
+            .run();
+        rfs::copy("reproducible_build", "first");
+        rustc()
+            .input("test/reproducible-build.rs")
+            .crate_type("rlib")
+            .arg("-Zremap-path-prefix=.")
+            .arg("-Cdebuginfo=2")
+            .run();
+        assert_eq!(
+            rfs::read(rust_lib_name("first")),
+            rfs::read(rust_lib_name("reproducible_build"))
+        );
+    });
+
+    run_in_tmpdir(|| {
+        rustc().input("reproducible-build-aux.rs").run();
+        rfs::create_dir("test");
+        rfs::copy("reproducible-build.rs", "test/reproducible-build.rs");
+        rustc()
+            .input("reproducible-build.rs")
+            .crate_type("rlib")
+            .arg("-Zremap-path-prefix=")
+            .arg("-Cdebuginfo=2")
+            .run();
+        rfs::copy(rust_lib_name("reproducible_build"), rust_lib_name("first"));
+        rustc()
+            .input("test/reproducible-build.rs")
+            .crate_type("rlib")
+            .arg("-Zremap-path-prefix=")
+            .arg("-Cdebuginfo=2")
+            .run();
+        assert_eq!(
+            rfs::read(rust_lib_name("first")),
+            rfs::read(rust_lib_name("reproducible_build"))
+        );
+    });
+
+    run_in_tmpdir(|| {
+        rustc().input("reproducible-build-aux.rs").run();
+        rustc()
+            .input("reproducible-build.rs")
+            .crate_type("rlib")
+            .extern_("reproducible_build_aux", rust_lib_name("reproducible_build_aux"))
+            .run();
+        rfs::copy(rust_lib_name("reproducible_build"), rust_lib_name("foo"));
+        rfs::copy(rust_lib_name("reproducible_build_aux"), rust_lib_name("bar"));
+        rustc()
+            .input("reproducible-build.rs")
+            .crate_type("rlib")
+            .extern_("reproducible_build_aux", rust_lib_name("bar"))
+            .run();
+        assert_eq!(rfs::read(rust_lib_name("foo")), rfs::read(rust_lib_name("reproducible_build")));
+    });
+}