guix-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Rust reprodubility -- .rmeta and shadow-rs


From: Maxime Devos
Subject: Rust reprodubility -- .rmeta and shadow-rs
Date: Sun, 26 Jun 2022 09:54:29 +0200
User-agent: Evolution 3.38.3-1

Hi,

There was some mail about irreproducibility in Rust, but I couldn't
find it anymore.  Anyway, I found a potential cause: rust-shadow-rs
embeds timestamps (even though it nominally respects
SOURCE_DATE_EPOCH???) and the ordering of definitions it generates is
based on a hash map (and hence, irreproducible).

The crate id is based on a hash over the source code, so this
irreproducibility can cause build failures if substitutes are used.

By removing the time stamp and sorting the definitions, 'nushell'
successfully built on ci.guix.gnu.org whereas it previously failed to
build on ci.guix.gnu.org but built successfully locally (with
antioxidant), and IIRC the (antioxidated) 'rust-nu-command' is now
reproducible:

Anyway, here the patch I used:

    ("rust-shadow-rs"
     ,#~((add-after 'unpack 'fixup-source-date-epoch
           (lambda _
             ;; TODO: it nominally supports SOURCE_DATE_EPOCH, yet something 
things go wrong,
             ;; as the shadow.rs still contains the unnormalised time stamp ...
             ;; For now, do a work-around.
             (substitute* '("src/lib.rs" "src/env.rs")
               (("BuildTime::Local\\(Local::now\\(\\)\\)\\.human_format\\(\\)")
                (object->string "[timestamp expunged for reproducibility]"))
               (("time\\.human_format\\(\\)")
                "\"[timestamp expunged for reproducibility]\".to_string()")
               (("time\\.to_rfc3339_opts\\(SecondsFormat::Secs, true)")
                "\"[timestamp expunged for reproducibility]\".to_string()")
               (("time\\.to_rfc2822\\(\\)")
                "\"[timestamp expunged for reproducibility]\".to_string()"))))
         (add-after 'unpack 'more-reproducibility ;; by default, it uses a 
hashmap, leading to an irreproducible ordering in shadow.rs and hence an 
irreproducible .rmeta (TODO: upstream?)
           (lambda _
             (substitute* "src/lib.rs" ; sort
               (("\\(k, v\\) in self\\.map\\.clone\\(\\)")
                "(k, v) in 
std::collections::BTreeMap::from_iter(self.map.clone().iter())")
               (("self\\.write_const\\(k, v\\)") "self.write_const(k, 
v.clone())")
               (("self\\.map\\.keys\\(\\)") 
"std::collections::BTreeSet::from_iter(self.map.keys())"))))))

Maybe that was the cause?

Greetings,
Maxime.

Attachment: signature.asc
Description: This is a digitally signed message part


reply via email to

[Prev in Thread] Current Thread [Next in Thread]