rewrite reproducible-build to rmake

This commit is contained in:
Oneirical 2024-07-31 14:56:34 -04:00
parent 8fbdc04f1b
commit 3c68b113c0
3 changed files with 222 additions and 141 deletions

View File

@ -8,7 +8,6 @@ run-make/jobserver-error/Makefile
run-make/libs-through-symlinks/Makefile run-make/libs-through-symlinks/Makefile
run-make/libtest-thread-limit/Makefile run-make/libtest-thread-limit/Makefile
run-make/macos-deployment-target/Makefile run-make/macos-deployment-target/Makefile
run-make/reproducible-build/Makefile
run-make/split-debuginfo/Makefile run-make/split-debuginfo/Makefile
run-make/symbol-mangling-hashed/Makefile run-make/symbol-mangling-hashed/Makefile
run-make/translation/Makefile run-make/translation/Makefile

View File

@ -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

View File

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