gnu: cargo: Simplify unpacking.

Fixes <http://bugs.gnu.org/26166>.

* gnu/packages/rust.scm (cargo)
[arguments]<:modules>: Add (srfi srfi-1).
[arguments]<:phases>: Adapt 'unpack-submodule-sources' phase to more clearly
seperate the tasks it does.  Add helper procedures 'unpack', 'touch',
'install-rust-library'.
[arguments]<:phases>: Rename 'set-cargo-home' to 'set-environment-up' and
make it use official cargo directories.
[arguments]<:phases>: Remove 'configure' phase.
This commit is contained in:
Danny Milosavljevic 2017-04-14 00:04:02 +02:00
parent 002c3e6dd6
commit f0eb0a4bb1
No known key found for this signature in database
GPG key ID: E71A35542C30BAA5

View file

@ -301,6 +301,8 @@ (define-public rustc
;; Dual licensed.
(license (list license:asl2.0 license:expat))))
;; This tries very hard not to get into a cyclic dependency like this:
;; cargo <- cargo-build-system <- cargo.
(define-public cargo
(package
(name "cargo")
@ -825,6 +827,11 @@ (define-public cargo
(arguments
`(#:cargo ,cargo-bootstrap
#:tests? #f ; FIXME
#:modules
((ice-9 match)
(srfi srfi-1) ; 'every
(guix build utils)
(guix build cargo-build-system))
#:phases
(modify-phases %standard-phases
;; Avoid cargo complaining about missmatched checksums.
@ -833,30 +840,36 @@ (define-public cargo
(delete 'patch-usr-bin-file)
(add-after 'unpack 'unpack-submodule-sources
(lambda* (#:key inputs #:allow-other-keys)
(let ((unpack (lambda (source target)
(define (unpack source target)
(mkdir-p target)
(with-directory-excursion target
(zero? (system* "tar" "xf"
source
"--strip-components=1"))))))
(mkdir "vendor")
(for-each (lambda (p)
(let ((name (car p)))
"--strip-components=1"))))
(define (touch file-name)
(call-with-output-file file-name (const #t)))
(define (install-rust-library entry)
(match entry
((name . src)
(if (string-prefix? "rust-" name)
(let ((rsrc (string-append "vendor/"
(string-drop name
(string-length "rust-")))))
(unpack (assoc-ref inputs name) rsrc)
(system* "touch" (string-append rsrc "/.cargo-ok"))
(generate-checksums rsrc (assoc-ref inputs name)))))) inputs))))
;; Set CARGO_HOME to use the vendored dependencies.
(add-after 'unpack 'set-cargo-home
(let* ((rust-length (string-length "rust-"))
(rust-name (string-drop name
rust-length))
(rsrc (string-append "vendor/"
rust-name))
(unpack-status (unpack src rsrc)))
(touch (string-append rsrc "/.cargo-ok"))
(generate-checksums rsrc src)
unpack-status)))
(_ #t)))
(mkdir "vendor")
(every install-rust-library inputs)))
(add-after 'unpack 'set-environment-up
(lambda* (#:key inputs #:allow-other-keys)
(let* ((gcc (assoc-ref inputs "gcc"))
(cc (string-append gcc "/bin/gcc")))
(mkdir "cargohome")
(setenv "CARGO_HOME" (string-append (getcwd) "/cargohome"))
(call-with-output-file "cargohome/config"
(mkdir ".cargo")
(call-with-output-file ".cargo/config"
(lambda (p)
(format p "
[source.crates-io]
@ -868,7 +881,8 @@ (define-public cargo
")))
(setenv "CMAKE_C_COMPILER" cc)
(setenv "CC" cc))
#t)))))
#t))
(delete 'configure))))
(home-page "https://github.com/rust-lang/cargo")
(synopsis "Build tool and package manager for Rust")
(description "Cargo is a tool that allows Rust projects to declare their