| 
 | 1 | +// This test case makes sure that two identical invocations of the compiler  | 
 | 2 | +// (i.e. same code base, same compile-flags, same compiler-versions, etc.)  | 
 | 3 | +// produce the same output. In the past, symbol names of monomorphized functions  | 
 | 4 | +// were not deterministic (which we want to avoid).  | 
 | 5 | +//  | 
 | 6 | +// The test tries to exercise as many different paths into symbol name  | 
 | 7 | +// generation as possible:  | 
 | 8 | +//  | 
 | 9 | +// - regular functions  | 
 | 10 | +// - generic functions  | 
 | 11 | +// - methods  | 
 | 12 | +// - statics  | 
 | 13 | +// - closures  | 
 | 14 | +// - enum variant constructors  | 
 | 15 | +// - tuple struct constructors  | 
 | 16 | +// - drop glue  | 
 | 17 | +// - FnOnce adapters  | 
 | 18 | +// - Trait object shims  | 
 | 19 | +// - Fn Pointer shims  | 
 | 20 | +// See https://github.com/rust-lang/rust/pull/32293  | 
 | 21 | + | 
 | 22 | +// FIXME(Oneirical): ignore-musl  | 
 | 23 | +// FIXME(Oneirical): two of these test blocks will apparently fail on windows  | 
 | 24 | +// FIXME(Oneirical): try it on test-various  | 
 | 25 | +// # FIXME: Builds of `bin` crate types are not deterministic with debuginfo=2 on  | 
 | 26 | +// # Windows.  | 
 | 27 | +// # See: https://github.com/rust-lang/rust/pull/87320#issuecomment-920105533  | 
 | 28 | +// # Issue: https://github.com/rust-lang/rust/issues/88982  | 
 | 29 | + | 
 | 30 | +use run_make_support::{bin_name, cwd, diff, rfs, run_in_tmpdir, rust_lib_name, rustc};  | 
 | 31 | + | 
 | 32 | +fn main() {  | 
 | 33 | +    run_in_tmpdir(|| {  | 
 | 34 | +        rustc().input("linker.rs").opt().run();  | 
 | 35 | +        rustc().input("reproducible-build-aux.rs").run();  | 
 | 36 | +        rustc()  | 
 | 37 | +            .input("reproducible-build.rs")  | 
 | 38 | +            .linker(&cwd().join(bin_name("linker")).display().to_string())  | 
 | 39 | +            .run();  | 
 | 40 | +        rustc()  | 
 | 41 | +            .input("reproducible-build.rs")  | 
 | 42 | +            .linker(&cwd().join(bin_name("linker")).display().to_string())  | 
 | 43 | +            .run();  | 
 | 44 | +        diff().actual_file("linker-arguments1").expected_file("linker-arguments2").run();  | 
 | 45 | +    });  | 
 | 46 | + | 
 | 47 | +    run_in_tmpdir(|| {  | 
 | 48 | +        rustc().input("linker.rs").opt().run();  | 
 | 49 | +        rustc().arg("-g").input("reproducible-build-aux.rs").run();  | 
 | 50 | +        rustc()  | 
 | 51 | +            .arg("-g")  | 
 | 52 | +            .input("reproducible-build.rs")  | 
 | 53 | +            .linker(&cwd().join(bin_name("linker")).display().to_string())  | 
 | 54 | +            .run();  | 
 | 55 | +        rustc()  | 
 | 56 | +            .arg("-g")  | 
 | 57 | +            .input("reproducible-build.rs")  | 
 | 58 | +            .linker(&cwd().join(bin_name("linker")).display().to_string())  | 
 | 59 | +            .run();  | 
 | 60 | +        diff().actual_file("linker-arguments1").expected_file("linker-arguments2").run();  | 
 | 61 | +    });  | 
 | 62 | + | 
 | 63 | +    run_in_tmpdir(|| {  | 
 | 64 | +        rustc().input("linker.rs").opt().run();  | 
 | 65 | +        rustc().opt().input("reproducible-build-aux.rs").run();  | 
 | 66 | +        rustc()  | 
 | 67 | +            .opt()  | 
 | 68 | +            .input("reproducible-build.rs")  | 
 | 69 | +            .linker(&cwd().join(bin_name("linker")).display().to_string())  | 
 | 70 | +            .run();  | 
 | 71 | +        rustc()  | 
 | 72 | +            .opt()  | 
 | 73 | +            .input("reproducible-build.rs")  | 
 | 74 | +            .linker(&cwd().join(bin_name("linker")).display().to_string())  | 
 | 75 | +            .run();  | 
 | 76 | +        diff().actual_file("linker-arguments1").expected_file("linker-arguments2").run();  | 
 | 77 | +    });  | 
 | 78 | + | 
 | 79 | +    run_in_tmpdir(|| {  | 
 | 80 | +        rustc().input("reproducible-build-aux.rs").run();  | 
 | 81 | +        rustc().input("reproducible-build.rs").crate_type("rlib").library_search_path("b").run();  | 
 | 82 | +        rfs::copy(rust_lib_name("reproducible_build"), rust_lib_name("foo"));  | 
 | 83 | +        rustc().input("reproducible-build.rs").crate_type("rlib").library_search_path("a").run();  | 
 | 84 | +        assert_eq!(rfs::read(rust_lib_name("reproducible_build")), rfs::read(rust_lib_name("foo")));  | 
 | 85 | +    });  | 
 | 86 | + | 
 | 87 | +    run_in_tmpdir(|| {  | 
 | 88 | +        rustc().input("reproducible-build-aux.rs").run();  | 
 | 89 | +        rustc()  | 
 | 90 | +            .input("reproducible-build.rs")  | 
 | 91 | +            .crate_type("rlib")  | 
 | 92 | +            .arg("--remap-path-prefix=/a=/c")  | 
 | 93 | +            .run();  | 
 | 94 | +        rfs::copy(rust_lib_name("reproducible_build"), rust_lib_name("foo"));  | 
 | 95 | +        rustc()  | 
 | 96 | +            .input("reproducible-build.rs")  | 
 | 97 | +            .crate_type("rlib")  | 
 | 98 | +            .arg("--remap-path-prefix=/b=/c")  | 
 | 99 | +            .run();  | 
 | 100 | +        assert_eq!(rfs::read(rust_lib_name("reproducible_build")), rfs::read(rust_lib_name("foo")));  | 
 | 101 | +    });  | 
 | 102 | + | 
 | 103 | +    run_in_tmpdir(|| {  | 
 | 104 | +        rustc().input("reproducible-build-aux.rs").run();  | 
 | 105 | +        rfs::create_dir("test");  | 
 | 106 | +        rfs::copy("reproducible-build.rs", "test/reproducible-build.rs");  | 
 | 107 | +        rustc()  | 
 | 108 | +            .input("reproducible-build.rs")  | 
 | 109 | +            .crate_type("bin")  | 
 | 110 | +            .arg(&format!("--remap-path-prefix={}=/b", cwd().display()))  | 
 | 111 | +            .run();  | 
 | 112 | +        eprintln!("{:#?}", rfs::shallow_find_dir_entries(cwd()));  | 
 | 113 | +        rfs::copy(bin_name("reproducible_build"), bin_name("foo"));  | 
 | 114 | +        rustc()  | 
 | 115 | +            .input("test/reproducible-build.rs")  | 
 | 116 | +            .crate_type("bin")  | 
 | 117 | +            .arg("--remap-path-prefix=/test=/b")  | 
 | 118 | +            .run();  | 
 | 119 | +        assert_eq!(rfs::read(bin_name("reproducible_build")), rfs::read(bin_name("foo")));  | 
 | 120 | +    });  | 
 | 121 | + | 
 | 122 | +    run_in_tmpdir(|| {  | 
 | 123 | +        rustc().input("reproducible-build-aux.rs").run();  | 
 | 124 | +        rfs::create_dir("test");  | 
 | 125 | +        rfs::copy("reproducible-build.rs", "test/reproducible-build.rs");  | 
 | 126 | +        rustc()  | 
 | 127 | +            .input("reproducible-build.rs")  | 
 | 128 | +            .crate_type("rlib")  | 
 | 129 | +            .arg(&format!("--remap-path-prefix={}=/b", cwd().display()))  | 
 | 130 | +            .run();  | 
 | 131 | +        rfs::copy(rust_lib_name("reproducible_build"), rust_lib_name("foo"));  | 
 | 132 | +        rustc()  | 
 | 133 | +            .input("test/reproducible-build.rs")  | 
 | 134 | +            .crate_type("rlib")  | 
 | 135 | +            .arg("--remap-path-prefix=/test=/b")  | 
 | 136 | +            .run();  | 
 | 137 | +        assert_eq!(rfs::read(rust_lib_name("reproducible_build")), rfs::read(rust_lib_name("foo")));  | 
 | 138 | +    });  | 
 | 139 | + | 
 | 140 | +    run_in_tmpdir(|| {  | 
 | 141 | +        rustc().input("reproducible-build-aux.rs").run();  | 
 | 142 | +        rfs::create_dir("test");  | 
 | 143 | +        rfs::copy("reproducible-build.rs", "test/reproducible-build.rs");  | 
 | 144 | +        rustc()  | 
 | 145 | +            .input("reproducible-build.rs")  | 
 | 146 | +            .crate_type("bin")  | 
 | 147 | +            .arg("-Zremap-path-prefix=.")  | 
 | 148 | +            .arg("-Cdebuginfo=2")  | 
 | 149 | +            .run();  | 
 | 150 | +        rfs::copy(bin_name("reproducible_build"), bin_name("first"));  | 
 | 151 | +        rustc()  | 
 | 152 | +            .input("test/reproducible-build.rs")  | 
 | 153 | +            .crate_type("bin")  | 
 | 154 | +            .arg("-Zremap-path-prefix=.")  | 
 | 155 | +            .arg("-Cdebuginfo=2")  | 
 | 156 | +            .run();  | 
 | 157 | +        assert_eq!(rfs::read(bin_name("first")), rfs::read(bin_name("reproducible_build")));  | 
 | 158 | +    });  | 
 | 159 | + | 
 | 160 | +    run_in_tmpdir(|| {  | 
 | 161 | +        rustc().input("reproducible-build-aux.rs").run();  | 
 | 162 | +        rfs::create_dir("test");  | 
 | 163 | +        rfs::copy("reproducible-build.rs", "test/reproducible-build.rs");  | 
 | 164 | +        rustc()  | 
 | 165 | +            .input("reproducible-build.rs")  | 
 | 166 | +            .crate_type("rlib")  | 
 | 167 | +            .arg("-Zremap-path-prefix=.")  | 
 | 168 | +            .arg("-Cdebuginfo=2")  | 
 | 169 | +            .run();  | 
 | 170 | +        rfs::copy("reproducible_build", "first");  | 
 | 171 | +        rustc()  | 
 | 172 | +            .input("test/reproducible-build.rs")  | 
 | 173 | +            .crate_type("rlib")  | 
 | 174 | +            .arg("-Zremap-path-prefix=.")  | 
 | 175 | +            .arg("-Cdebuginfo=2")  | 
 | 176 | +            .run();  | 
 | 177 | +        assert_eq!(  | 
 | 178 | +            rfs::read(rust_lib_name("first")),  | 
 | 179 | +            rfs::read(rust_lib_name("reproducible_build"))  | 
 | 180 | +        );  | 
 | 181 | +    });  | 
 | 182 | + | 
 | 183 | +    run_in_tmpdir(|| {  | 
 | 184 | +        rustc().input("reproducible-build-aux.rs").run();  | 
 | 185 | +        rfs::create_dir("test");  | 
 | 186 | +        rfs::copy("reproducible-build.rs", "test/reproducible-build.rs");  | 
 | 187 | +        rustc()  | 
 | 188 | +            .input("reproducible-build.rs")  | 
 | 189 | +            .crate_type("rlib")  | 
 | 190 | +            .arg("-Zremap-path-prefix=")  | 
 | 191 | +            .arg("-Cdebuginfo=2")  | 
 | 192 | +            .run();  | 
 | 193 | +        rfs::copy(rust_lib_name("reproducible_build"), rust_lib_name("first"));  | 
 | 194 | +        rustc()  | 
 | 195 | +            .input("test/reproducible-build.rs")  | 
 | 196 | +            .crate_type("rlib")  | 
 | 197 | +            .arg("-Zremap-path-prefix=")  | 
 | 198 | +            .arg("-Cdebuginfo=2")  | 
 | 199 | +            .run();  | 
 | 200 | +        assert_eq!(  | 
 | 201 | +            rfs::read(rust_lib_name("first")),  | 
 | 202 | +            rfs::read(rust_lib_name("reproducible_build"))  | 
 | 203 | +        );  | 
 | 204 | +    });  | 
 | 205 | + | 
 | 206 | +    run_in_tmpdir(|| {  | 
 | 207 | +        rustc().input("reproducible-build-aux.rs").run();  | 
 | 208 | +        rustc()  | 
 | 209 | +            .input("reproducible-build.rs")  | 
 | 210 | +            .crate_type("rlib")  | 
 | 211 | +            .extern_("reproducible_build_aux", rust_lib_name("reproducible_build_aux"))  | 
 | 212 | +            .run();  | 
 | 213 | +        rfs::copy(rust_lib_name("reproducible_build"), rust_lib_name("foo"));  | 
 | 214 | +        rfs::copy(rust_lib_name("reproducible_build_aux"), rust_lib_name("bar"));  | 
 | 215 | +        rustc()  | 
 | 216 | +            .input("reproducible-build.rs")  | 
 | 217 | +            .crate_type("rlib")  | 
 | 218 | +            .extern_("reproducible_build_aux", rust_lib_name("bar"))  | 
 | 219 | +            .run();  | 
 | 220 | +        assert_eq!(rfs::read(rust_lib_name("foo")), rfs::read(rust_lib_name("reproducible_build")));  | 
 | 221 | +    });  | 
 | 222 | +}  | 
0 commit comments