Skip to content
Snippets Groups Projects
Unverified Commit f0eb0a4b authored by Danny Milosavljevic's avatar Danny Milosavljevic
Browse files

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.
parent 002c3e6d
No related branches found
No related tags found
No related merge requests found
...@@ -301,6 +301,8 @@ (define-public rustc ...@@ -301,6 +301,8 @@ (define-public rustc
;; Dual licensed. ;; Dual licensed.
(license (list license:asl2.0 license:expat)))) (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 (define-public cargo
(package (package
(name "cargo") (name "cargo")
...@@ -825,6 +827,11 @@ (define-public cargo ...@@ -825,6 +827,11 @@ (define-public cargo
(arguments (arguments
`(#:cargo ,cargo-bootstrap `(#:cargo ,cargo-bootstrap
#:tests? #f ; FIXME #:tests? #f ; FIXME
#:modules
((ice-9 match)
(srfi srfi-1) ; 'every
(guix build utils)
(guix build cargo-build-system))
#:phases #:phases
(modify-phases %standard-phases (modify-phases %standard-phases
;; Avoid cargo complaining about missmatched checksums. ;; Avoid cargo complaining about missmatched checksums.
...@@ -833,30 +840,36 @@ (define-public cargo ...@@ -833,30 +840,36 @@ (define-public cargo
(delete 'patch-usr-bin-file) (delete 'patch-usr-bin-file)
(add-after 'unpack 'unpack-submodule-sources (add-after 'unpack 'unpack-submodule-sources
(lambda* (#:key inputs #:allow-other-keys) (lambda* (#:key inputs #:allow-other-keys)
(let ((unpack (lambda (source target) (define (unpack source target)
(mkdir-p target) (mkdir-p target)
(with-directory-excursion target (with-directory-excursion target
(zero? (system* "tar" "xf" (zero? (system* "tar" "xf"
source source
"--strip-components=1")))))) "--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* ((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") (mkdir "vendor")
(for-each (lambda (p) (every install-rust-library inputs)))
(let ((name (car p))) (add-after 'unpack 'set-environment-up
(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
(lambda* (#:key inputs #:allow-other-keys) (lambda* (#:key inputs #:allow-other-keys)
(let* ((gcc (assoc-ref inputs "gcc")) (let* ((gcc (assoc-ref inputs "gcc"))
(cc (string-append gcc "/bin/gcc"))) (cc (string-append gcc "/bin/gcc")))
(mkdir "cargohome") (mkdir ".cargo")
(setenv "CARGO_HOME" (string-append (getcwd) "/cargohome")) (call-with-output-file ".cargo/config"
(call-with-output-file "cargohome/config"
(lambda (p) (lambda (p)
(format p " (format p "
[source.crates-io] [source.crates-io]
...@@ -868,7 +881,8 @@ (define-public cargo ...@@ -868,7 +881,8 @@ (define-public cargo
"))) ")))
(setenv "CMAKE_C_COMPILER" cc) (setenv "CMAKE_C_COMPILER" cc)
(setenv "CC" cc)) (setenv "CC" cc))
#t))))) #t))
(delete 'configure))))
(home-page "https://github.com/rust-lang/cargo") (home-page "https://github.com/rust-lang/cargo")
(synopsis "Build tool and package manager for Rust") (synopsis "Build tool and package manager for Rust")
(description "Cargo is a tool that allows Rust projects to declare their (description "Cargo is a tool that allows Rust projects to declare their
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment