Skip to content

Commit

Permalink
rewrite reproducible-build to rmake
Browse files Browse the repository at this point in the history
  • Loading branch information
Oneirical committed Jul 31, 2024
1 parent 0b5eb7b commit 31604f2
Show file tree
Hide file tree
Showing 3 changed files with 170 additions and 141 deletions.
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 @@ -42,7 +42,6 @@ run-make/raw-dylib-c/Makefile
run-make/redundant-libs/Makefile
run-make/remap-path-prefix-dwarf/Makefile
run-make/reproducible-build-2/Makefile
run-make/reproducible-build/Makefile
run-make/rlib-format-packed-bundled-libs/Makefile
run-make/simd-ffi/Makefile
run-make/split-debuginfo/Makefile
Expand Down
140 changes: 0 additions & 140 deletions tests/run-make/reproducible-build/Makefile

This file was deleted.

170 changes: 170 additions & 0 deletions tests/run-make/reproducible-build/rmake.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,170 @@
// 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
// # TODO: Builds of `bin` crate types are not deterministic with debuginfo=2 on

Check failure on line 25 in tests/run-make/reproducible-build/rmake.rs

View workflow job for this annotation

GitHub Actions / PR - mingw-check-tidy

TODO is used for tasks that should be done before merging a PR; If you want to leave a message in the codebase use FIXME
// # 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, rust_lib_name, rustc};

fn main() {
rustc().input("linker.rs").opt().run();
rustc().input("reproducible-build-aux.rs").run();
eprintln!("{:#?}", rfs::shallow_find_dir_entries(cwd()));
rustc().input("reproducible-build.rs").linker(&bin_name("linker")).run();
rustc().input("reproducible-build.rs").linker(&bin_name("linker")).run();
diff().actual_file("linker-arguments1").expected_file("linker-arguments2").run();
rustc().input("linker.rs").opt().run();
rustc().arg("-g").input("reproducible-build-aux.rs").run();
rustc().arg("-g").input("reproducible-build.rs").linker(&bin_name("linker")).run();
rustc().arg("-g").input("reproducible-build.rs").linker(&bin_name("linker")).run();
diff().actual_file("linker-arguments1").expected_file("linker-arguments2").run();
rustc().input("linker.rs").opt().run();
rustc().opt().input("reproducible-build-aux.rs").run();
rustc().opt().input("reproducible-build.rs").linker(&bin_name("linker")).run();
rustc().opt().input("reproducible-build.rs").linker(&bin_name("linker")).run();
diff().actual_file("linker-arguments1").expected_file("linker-arguments2").run();

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")));

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")));

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();
rfs::copy("reproducible_build", "foo");
rustc()
.input("test/reproducible-build.rs")
.crate_type("bin")
.arg("--remap-path-prefix=/test=/b")
.run();
assert_eq!(rfs::read("reproducible_build"), rfs::read("foo"));

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")));

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("reproducible_build", "first");
rustc()
.input("test/reproducible-build.rs")
.crate_type("bin")
.arg("-Zremap-path-prefix=.")
.arg("-Cdebuginfo=2")
.run();
assert_eq!(rfs::read("first"), rfs::read("reproducible_build"));

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")));

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")));

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")));
}

0 comments on commit 31604f2

Please sign in to comment.