| // Builds with fat link-time-optimizations and the --sysroot flag used to be |
| // non-deterministic - that means, compiling twice with no changes would create |
| // slightly different outputs. This has been fixed by #63352 and #63505. |
| // Test 1: Compile with fat-lto twice, check that both compilation outputs are identical. |
| // Test 2: Compile with sysroot, then change the sysroot path from absolute to relative. |
| // Outputs should be identical. |
| // See https://github.com/rust-lang/rust/issues/34902 |
| |
| //@ ignore-windows |
| // Reasons: |
| // 1. The object files are reproducible, but their paths are not, which causes |
| // the first assertion in the test to fail. |
| // 2. When the sysroot gets copied, some symlinks must be re-created, |
| // which is a privileged action on Windows. |
| |
| use run_make_support::{rfs, rust_lib_name, rustc}; |
| |
| fn main() { |
| // test 1: fat lto |
| rustc().input("reproducible-build-aux.rs").run(); |
| rustc().input("reproducible-build.rs").arg("-Clto=fat").output("reproducible-build").run(); |
| rfs::rename("reproducible-build", "reproducible-build-a"); |
| rustc().input("reproducible-build.rs").arg("-Clto=fat").output("reproducible-build").run(); |
| assert_eq!(rfs::read("reproducible-build"), rfs::read("reproducible-build-a")); |
| |
| // test 2: sysroot |
| let sysroot = rustc().print("sysroot").run().stdout_utf8(); |
| let sysroot = sysroot.trim(); |
| |
| rustc().input("reproducible-build-aux.rs").run(); |
| rustc() |
| .input("reproducible-build.rs") |
| .crate_type("rlib") |
| .sysroot(&sysroot) |
| .arg(format!("--remap-path-prefix={sysroot}=/sysroot")) |
| .run(); |
| rfs::copy_dir_all(&sysroot, "sysroot"); |
| rfs::rename(rust_lib_name("reproducible_build"), rust_lib_name("foo")); |
| rustc() |
| .input("reproducible-build.rs") |
| .crate_type("rlib") |
| .sysroot("sysroot") |
| .arg("--remap-path-prefix=/sysroot=/sysroot") |
| .run(); |
| |
| assert_eq!(rfs::read(rust_lib_name("reproducible_build")), rfs::read(rust_lib_name("foo"))); |
| } |