From: Alexander Kanavin <[email protected]> The original reproducibility fix was problematic for a couple reasons:
- disabling both lto and parallel builds had an unfortunate effect of nearly doubling rust-native and rust build times (which are slow to begin with). Disabling lto hurts runtime performance too. - both of these things were done for the *entire build*, while the only problematic item is the librustdoc crate. - lto=off option in config.toml has an effect only on building rustc (the compiler itself), and doesn't help with rustdoc reproducibility. Actual fix is the codegen-units setting, which indirectly disables lto via giving llvm only one unit to work with at a time. After some digging, here's a more targeted fix for the problem. Why librustdoc is non-reproducible, but not anything else remains a mystery, hidden deep in rust-llvm's lto optimization code. Signed-off-by: Alexander Kanavin <[email protected]> --- ...teps-tool.rs-switch-off-lto-for-rust.patch | 46 +++++++++++++++++++ ...ue-fix-cargo-config-for-codegenunits.patch | 26 ----------- meta/recipes-devtools/rust/rust-source.inc | 2 +- meta/recipes-devtools/rust/rust_1.81.0.bb | 1 - 4 files changed, 47 insertions(+), 28 deletions(-) create mode 100644 meta/recipes-devtools/rust/files/0001-src-core-build_steps-tool.rs-switch-off-lto-for-rust.patch delete mode 100644 meta/recipes-devtools/rust/files/rustdoc-repro-issue-fix-cargo-config-for-codegenunits.patch diff --git a/meta/recipes-devtools/rust/files/0001-src-core-build_steps-tool.rs-switch-off-lto-for-rust.patch b/meta/recipes-devtools/rust/files/0001-src-core-build_steps-tool.rs-switch-off-lto-for-rust.patch new file mode 100644 index 00000000000..e63cfb07198 --- /dev/null +++ b/meta/recipes-devtools/rust/files/0001-src-core-build_steps-tool.rs-switch-off-lto-for-rust.patch @@ -0,0 +1,46 @@ +From ce68809d41291f671b440abce41f8f71c95428aa Mon Sep 17 00:00:00 2001 +From: Alexander Kanavin <[email protected]> +Date: Mon, 3 Feb 2025 20:06:46 +0100 +Subject: [PATCH] src/core/build_steps/tool.rs: switch off lto for rustdoc + +For reasons currently unknown, librustdoc binary ends up with +non-reproducible .llvm.<number> suffixes in its symbols - but +not any other binary. + +Disabling lto avoids creating these suffixes. More info about the option: +https://doc.rust-lang.org/rustc/codegen-options/index.html#lto + +As seen below, there's a comment in the source tree saying not to tweak the options +but this only creates a mix of lto and non-lto optimized binary objects from +various crates, which should be safe to mix. + +Upstream-Status: Inappropriate [reported at https://github.com/rust-lang/rust/issues/134589] +Signed-off-by: Alexander Kanavin <[email protected]> +--- + src/bootstrap/src/core/build_steps/tool.rs | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/src/bootstrap/src/core/build_steps/tool.rs b/src/bootstrap/src/core/build_steps/tool.rs +index 087df2f8a..00790affb 100644 +--- a/src/bootstrap/src/core/build_steps/tool.rs ++++ b/src/bootstrap/src/core/build_steps/tool.rs +@@ -635,7 +635,7 @@ impl Step for Rustdoc { + } + + // NOTE: Never modify the rustflags here, it breaks the build cache for other tools! +- let cargo = prepare_tool_cargo( ++ let mut cargo = prepare_tool_cargo( + builder, + build_compiler, + Mode::ToolRustc, +@@ -645,6 +645,7 @@ impl Step for Rustdoc { + SourceType::InTree, + features.as_slice(), + ); ++ cargo.rustflag("-Clto=off"); + + let _guard = builder.msg_tool( + Kind::Build, +-- +2.39.5 + diff --git a/meta/recipes-devtools/rust/files/rustdoc-repro-issue-fix-cargo-config-for-codegenunits.patch b/meta/recipes-devtools/rust/files/rustdoc-repro-issue-fix-cargo-config-for-codegenunits.patch deleted file mode 100644 index 0aab8772eb2..00000000000 --- a/meta/recipes-devtools/rust/files/rustdoc-repro-issue-fix-cargo-config-for-codegenunits.patch +++ /dev/null @@ -1,26 +0,0 @@ -rust: rustdoc reproducibility issue fix - -rust: rustdoc reproducibility issue fix - -The 'codegen-units' option split the crate into multiple compilation units for parallel compilation. Currently, this split is causing the rustdoc to generate differnt binary between the builds. -To fix this the codegen-units & the lto options are disabled. - -More info about options: -https://doc.rust-lang.org/cargo/reference/profiles.html#codegen-units -https://doc.rust-lang.org/rustc/codegen-options/index.html#lto - -Upstream-Status: Inappropriate [oe specific] - -Signed-off-by: Sundeep KOKKONDA <[email protected]> ---- ---- a/.cargo/config.toml -+++ b/.cargo/config.toml -@@ -3,3 +3,7 @@ - - [source.vendored-sources] - directory = "vendor" -+ -+[profile.release] -+codegen-units = 1 -+ - diff --git a/meta/recipes-devtools/rust/rust-source.inc b/meta/recipes-devtools/rust/rust-source.inc index 8484c94ef8b..83355935fcc 100644 --- a/meta/recipes-devtools/rust/rust-source.inc +++ b/meta/recipes-devtools/rust/rust-source.inc @@ -4,10 +4,10 @@ SRC_URI += "https://static.rust-lang.org/dist/rustc-${RUST_VERSION}-src.tar.xz;n file://zlib-off64_t.patch;patchdir=${RUSTSRC} \ file://rv32-rustix-libc-backend.patch;patchdir=${RUSTSRC} \ file://rv32-cargo-rustix-0.38.28-fix.patch;patchdir=${RUSTSRC} \ - file://rustdoc-repro-issue-fix-cargo-config-for-codegenunits.patch;patchdir=${RUSTSRC} \ file://rust-oe-selftest.patch;patchdir=${RUSTSRC} \ file://repro-issue-fix-with-cc-crate-hashmap.patch;patchdir=${RUSTSRC} \ file://oeqa-selftest-Increase-timeout-in-process-sigpipe-ru.patch;patchdir=${RUSTSRC} \ + file://0001-src-core-build_steps-tool.rs-switch-off-lto-for-rust.patch;patchdir=${RUSTSRC} \ " SRC_URI[rust.sha256sum] = "36217ef7e32f40a180e3d79bd666b4dfdaed49dd381023a5fb765fd12d0092ce" diff --git a/meta/recipes-devtools/rust/rust_1.81.0.bb b/meta/recipes-devtools/rust/rust_1.81.0.bb index 288b0fbb443..1038c275f6d 100644 --- a/meta/recipes-devtools/rust/rust_1.81.0.bb +++ b/meta/recipes-devtools/rust/rust_1.81.0.bb @@ -136,7 +136,6 @@ python do_configure() { config.add_section("rust") config.set("rust", "rpath", e(True)) config.set("rust", "remap-debuginfo", e(True)) - config.set("rust", "lto", "\"off\"") config.set("rust", "channel", e(d.expand("${RUST_CHANNEL}"))) # Whether or not to optimize the compiler and standard library -- 2.39.5
-=-=-=-=-=-=-=-=-=-=-=- Links: You receive all messages sent to this group. View/Reply Online (#210763): https://lists.openembedded.org/g/openembedded-core/message/210763 Mute This Topic: https://lists.openembedded.org/mt/110989647/21656 Group Owner: [email protected] Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [[email protected]] -=-=-=-=-=-=-=-=-=-=-=-
