aboutsummaryrefslogtreecommitdiff
path: root/guix/build
diff options
context:
space:
mode:
authorEfraim Flashner <efraim@flashner.co.il>2023-10-04 12:20:14 +0300
committerEfraim Flashner <efraim@flashner.co.il>2023-10-18 11:36:16 +0300
commitfafbad0ce2dc9d94bc03b5e9e5ec8dad759ca929 (patch)
tree83a00a6e530e4bc9032d64626f88c6368b4803c1 /guix/build
parent48e5110c25cf47dce46fb90980d8902f4236cf99 (diff)
downloadguix-fafbad0ce2dc9d94bc03b5e9e5ec8dad759ca929.tar
guix-fafbad0ce2dc9d94bc03b5e9e5ec8dad759ca929.tar.gz
build: cargo-build-system: Reset timestamps in crates.
This fixes reproducibility in rust crates from the package phase, see <https://issues.guix.gnu.org/50015>. * guix/build/cargo-build-system.scm (package): After running 'cargo package' on the source unpack the tarball, reset the timestamps and repack it.
Diffstat (limited to 'guix/build')
-rw-r--r--guix/build/cargo-build-system.scm27
1 files changed, 26 insertions, 1 deletions
diff --git a/guix/build/cargo-build-system.scm b/guix/build/cargo-build-system.scm
index 9094ea41d1..8bf6ba510b 100644
--- a/guix/build/cargo-build-system.scm
+++ b/guix/build/cargo-build-system.scm
@@ -242,7 +242,32 @@ directory = '" port)
;;error: invalid inclusion of reserved file name Cargo.toml.orig in package source
(when (file-exists? "Cargo.toml.orig")
(delete-file "Cargo.toml.orig"))
- (apply invoke `("cargo" "package" ,@cargo-package-flags))))
+ (apply invoke `("cargo" "package" ,@cargo-package-flags))
+
+ ;; Then unpack the crate, reset the timestamp of all contained files, and
+ ;; repack them. This is necessary to ensure that they are reproducible.
+ (with-directory-excursion "target/package"
+ (for-each
+ (lambda (crate)
+ (invoke "tar" "xf" crate)
+ (delete-file crate)
+ ;; Some of the crate names have underscores, so we need to
+ ;; search the current directory to find the unpacked crate.
+ (let ((dir
+ (car (scandir "."
+ (lambda (file)
+ (and (not (member file '("." "..")))
+ (not (string-suffix? ".crate" file))))))))
+ ;; XXX: copied from (gnu build install)
+ (for-each (lambda (file)
+ (let ((s (lstat file)))
+ (unless (eq? (stat:type s) 'symlink)
+ (utime file 0 0 0 0))))
+ (find-files dir #:directories? #t))
+ (apply invoke "tar" "czf" (string-append dir ".crate")
+ (find-files dir #:directories? #t))
+ (delete-file-recursively dir)))
+ (find-files "." "\\.crate$")))))
(format #t "Not installing cargo sources, skipping `cargo package`.~%"))
#t)