summaryrefslogtreecommitdiff
path: root/guix/build/cargo-build-system.scm
diff options
context:
space:
mode:
Diffstat (limited to 'guix/build/cargo-build-system.scm')
-rw-r--r--guix/build/cargo-build-system.scm41
1 files changed, 37 insertions, 4 deletions
diff --git a/guix/build/cargo-build-system.scm b/guix/build/cargo-build-system.scm
index fbba554e9b..505c0b4b01 100644
--- a/guix/build/cargo-build-system.scm
+++ b/guix/build/cargo-build-system.scm
@@ -111,6 +111,13 @@ Cargo.toml file present at its root."
(define (rust-package? name)
(string-prefix? "rust-" name))
+(define* (check-for-pregenerated-files #:rest _)
+ "Check the source code for files which are known to generally be bundled
+libraries or executables."
+ (let ((pregenerated-files (find-files "." "\\.(a|dll|dylib|exe|lib)$")))
+ (when (not (null-list? pregenerated-files))
+ (error "Possible pre-generated files found:" pregenerated-files))))
+
(define* (configure #:key inputs
(vendor-dir "guix-vendor")
#:allow-other-keys)
@@ -224,10 +231,10 @@ directory = '" port)
(for-each
(lambda (file)
(make-file-writable file)
- ;; Strip the hash and replace '.tar.gz' with '.crate'.
+ ;; Strip the hash and rust prefix and replace '.tar.gz' with '.crate'.
(rename-file file
(string-append (string-drop-right
- (string-drop file 35)
+ (string-drop file 40)
(string-length ".tar.gz"))
".crate")))
(find-files "." "\\.tar\\.gz$"))))
@@ -235,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)
@@ -285,7 +317,8 @@ directory = '" port)
(replace 'check check)
(replace 'install install)
(add-after 'build 'package package)
- (add-after 'unpack 'unpack-rust-crates unpack-rust-crates)
+ (add-after 'unpack 'check-for-pregenerated-files check-for-pregenerated-files)
+ (add-after 'check-for-pregenerated-files 'unpack-rust-crates unpack-rust-crates)
(add-after 'patch-generated-file-shebangs 'patch-cargo-checksums patch-cargo-checksums)))
(define* (cargo-build #:key inputs (phases %standard-phases)