Skip to content

Commit

Permalink
Replace the random substring of a linker argument with a placeholder …
Browse files Browse the repository at this point in the history
…and nullify the timestamp field of XCOFF files for file comparison.
  • Loading branch information
xingxue-ibm committed Jan 6, 2025
1 parent 243d2ca commit e1f4629
Showing 1 changed file with 50 additions and 3 deletions.
53 changes: 50 additions & 3 deletions tests/run-make/reproducible-build/rmake.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
// Tracking Issue: https://github.com/rust-lang/rust/issues/129080

use run_make_support::{
bin_name, cwd, diff, is_darwin, is_windows, rfs, run_in_tmpdir, rust_lib_name, rustc,
bin_name, cwd, diff, is_darwin, is_windows, regex, rfs, run_in_tmpdir, rust_lib_name, rustc,
};

fn main() {
Expand Down Expand Up @@ -117,7 +117,40 @@ fn smoke_test(flag: Option<SmokeFlag>) {
.input("reproducible-build.rs")
.linker(&cwd().join(bin_name("linker")).display().to_string())
.run();
diff().actual_file("linker-arguments1").expected_file("linker-arguments2").run();

#[cfg(not(target_os = "aix"))]
{
diff()
.actual_file("linker-arguments1")
.expected_file("linker-arguments2")
.run();
}
#[cfg(target_os = "aix")]
{
// The AIX link command includes an additional argument
// that specifies the file containing exported symbols, e.g.,
// -bE:/tmp/rustcO6hxkY/list.exp. In this example, the part of the
// directory name "rustcO6hxkY" is randomly generated to ensure that
// different linking processes do not collide. For the purpose
// of comparing link arguments, the randomly generated part is
// replaced with a placeholder.
let content1 =
std::fs::read_to_string("linker-arguments1").expect("Failed to read file");
let content2 =
std::fs::read_to_string("linker-arguments2").expect("Failed to read file");

// Define the regex for the directory name containing the random substring.
let re = regex::Regex::new(r"rustc[a-zA-Z0-9]{6}/list\.exp").expect("Invalid regex");

// Compare link commands with random strings replaced by placeholders.
assert!(
re.replace_all(&content1, "rustcXXXXXX/list.exp")
.to_string()
== re
.replace_all(&content2, "rustcXXXXXX/list.exp")
.to_string()
);
}
});
}

Expand Down Expand Up @@ -207,7 +240,21 @@ fn diff_dir_test(crate_type: CrateType, remap_type: RemapType) {
std::env::set_current_dir(&base_dir).unwrap();
match crate_type {
CrateType::Bin => {
assert!(rfs::read(bin_name("reproducible-build")) == rfs::read(bin_name("foo")));
#[cfg(not(target_os = "aix"))]
{
assert!(
rfs::read(bin_name("reproducible-build")) == rfs::read(bin_name("foo"))
);
}
#[cfg(target_os = "aix")]
{
// At the 4th-byte offset, the AIX XCOFF file header defines a
// 4-byte timestamp. Nullify the timestamp before performing a
// binary comparison.
let mut file1 = rfs::read(bin_name("reproducible-build"));
let mut file2 = rfs::read(bin_name("foo"));
assert!(file1[4..8].fill(0x00) == file2[4..8].fill(0x00));
};
}
CrateType::Rlib => {
assert!(
Expand Down

0 comments on commit e1f4629

Please sign in to comment.