build-system/cargo: Use sources from package sources.

* guix/build/cargo-build-system.scm (crate-src?): New procedure.
(configure): Use the new procedure to expand crate tarballs in the vendor
directory.

Signed-off-by: Chris Marusich <cmmarusich@gmail.com>
This commit is contained in:
Ivan Petkov 2019-05-16 23:02:12 -07:00 committed by Chris Marusich
parent a6ab6b7877
commit efdf2ae14e
No known key found for this signature in database
GPG Key ID: DD409A15D822469D

View File

@ -54,6 +54,22 @@
(bin-dep? (lambda (dep) (find bin? (get-kinds dep)))))
(find bin-dep? (manifest-targets))))
(define (crate-src? path)
"Check if PATH refers to a crate source, namely a gzipped tarball with a
Cargo.toml file present at its root."
(and (gzip-file? path)
;; First we print out all file names within the tarball to see if it
;; looks like the source of a crate. However, the tarball will include
;; an extra path component which we would like to ignore (since we're
;; interested in checking if a Cargo.toml exists at the root of the
;; archive, but not nested anywhere else). We do this by cutting up
;; each output line and only looking at the second component. We then
;; check if it matches Cargo.toml exactly and short circuit if it does.
(zero? (apply system* (list "sh" "-c"
(string-append "tar -tf " path
" | cut -d/ -f2"
" | grep -q '^Cargo.toml$'"))))))
(define* (configure #:key inputs
(vendor-dir "guix-vendor")
#:allow-other-keys)
@ -67,14 +83,21 @@
(for-each
(match-lambda
((name . path)
(let* ((rust-share (string-append path "/share/rust-source"))
(basepath (basename path))
(link-dir (string-append vendor-dir "/" basepath)))
(and (file-exists? rust-share)
(let* ((basepath (basename path))
(crate-dir (string-append vendor-dir "/" basepath)))
(and (crate-src? path)
;; Gracefully handle duplicate inputs
(not (file-exists? link-dir))
(symlink rust-share link-dir)))))
(not (file-exists? crate-dir))
(mkdir-p crate-dir)
;; Cargo crates are simply gzipped tarballs but with a .crate
;; extension. We expand the source to a directory name we control
;; so that we can generate any cargo checksums.
;; The --strip-components argument is needed to prevent creating
;; an extra directory within `crate-dir`.
(invoke "tar" "xvf" path "-C" crate-dir "--strip-components" "1")
(generate-checksums crate-dir)))))
inputs)
;; Configure cargo to actually use this new directory.
(mkdir-p ".cargo")
(let ((port (open-file ".cargo/config" "w" #:encoding "utf-8")))