GNU bug report logs -
#25956
[PATCH] build/cargo-build-system: Make cargo-build-system install working packages.
Previous Next
To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 25956 in the body.
You can then email your comments to 25956 AT debbugs.gnu.org in the normal way.
Toggle the display of automated, internal messages from the tracker.
Report forwarded
to
guix-patches <at> gnu.org
:
bug#25956
; Package
guix-patches
.
(Fri, 03 Mar 2017 19:52:02 GMT)
Full text and
rfc822 format available.
Acknowledgement sent
to
Danny Milosavljevic <dannym <at> scratchpost.org>
:
New bug report received and forwarded. Copy sent to
guix-patches <at> gnu.org
.
(Fri, 03 Mar 2017 19:52:02 GMT)
Full text and
rfc822 format available.
Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):
* guix/build/cargo-build-system.scm (configure): Remove proprietary
dependencies. Add rust dependencies and configure Cargo to find them.
(build): Also build libraries, not just applications.
(file-sha256): New variable.
(generate-checksums): New variable. Export it.
(touch): New variable.
(install): Generate checksums so Cargo accepts the package.
---
guix/build/cargo-build-system.scm | 116 +++++++++++++++++++++++++++++++-------
1 file changed, 95 insertions(+), 21 deletions(-)
diff --git a/guix/build/cargo-build-system.scm b/guix/build/cargo-build-system.scm
index 7d656a8d5..f11d85874 100644
--- a/guix/build/cargo-build-system.scm
+++ b/guix/build/cargo-build-system.scm
@@ -19,13 +19,16 @@
(define-module (guix build cargo-build-system)
#:use-module ((guix build gnu-build-system) #:prefix gnu:)
#:use-module (guix build utils)
+ #:use-module (ice-9 popen)
+ #:use-module (ice-9 rdelim)
#:use-module (ice-9 ftw)
#:use-module (ice-9 format)
#:use-module (ice-9 match)
#:use-module (srfi srfi-1)
#:use-module (srfi srfi-26)
#:export (%standard-phases
- cargo-build))
+ cargo-build
+ generate-checksums))
;; Commentary:
;;
@@ -45,27 +48,57 @@
"Replace Cargo.toml [dependencies] section with guix inputs."
;; Make sure Cargo.toml is writeable when the crate uses git-fetch.
(chmod "Cargo.toml" #o644)
- (let ((port (open-file "Cargo.toml" "a" #:encoding "utf-8")))
- (format port "~%[replace]~%")
- (for-each
- (match-lambda
- ((name . path)
- (let ((crate (package-name->crate-name name)))
- (when (and crate path)
- (match (string-split (basename path) #\-)
- ((_ ... version)
- (format port "\"~a:~a\" = { path = \"~a/share/rust-source\" }~%"
- crate version path)))))))
- inputs)
- (close-port port))
+ (chmod "." #o755)
+ (if (not (file-exists? "vendor"))
+ (if (not (file-exists? "Cargo.lock"))
+ (begin
+ (substitute* "Cargo.toml"
+ ((".*32-sys.*") "
+")
+ ((".*winapi.*") "
+")
+ ((".*core-foundation.*") "
+"))
+ ;; Prepare one new directory with all the required dependencies.
+ ;; It's necessary to do this (instead of just using /gnu/store as the
+ ;; directory) because we want to hide the libraries in subdirectories
+ ;; share/rust-source/... instead of polluting the user's profile root.
+ (mkdir "vendor")
+ (for-each
+ (match-lambda
+ ((name . path)
+ (let ((crate (package-name->crate-name name)))
+ (when (and crate path)
+ (match (string-split (basename path) #\-)
+ ((_ ... version)
+ (symlink (string-append path "/share/rust-source")
+ (string-append "vendor/" (basename path)))))))))
+ inputs)
+ ;; Configure cargo to actually use this new directory.
+ (mkdir-p ".cargo")
+ (let ((port (open-file ".cargo/config" "w" #:encoding "utf-8")))
+ (display "
+[source.crates-io]
+registry = 'https://github.com/rust-lang/crates.io-index'
+replace-with = 'vendored-sources'
+
+[source.vendored-sources]
+directory = '" port)
+ (display (getcwd) port)
+ (display "/vendor" port)
+ (display "'
+" port)
+ (close-port port)))))
+ (setenv "CC" (string-append (assoc-ref inputs "gcc") "/bin/gcc"))
+
+ ;(setenv "CARGO_HOME" "/gnu/store")
+ ; (setenv "CMAKE_C_COMPILER" cc)
#t)
-(define* (build #:key (cargo-build-flags '("--release" "--frozen"))
+(define* (build #:key (cargo-build-flags '("--release"))
#:allow-other-keys)
"Build a given Cargo package."
- (if (file-exists? "Cargo.lock")
- (zero? (apply system* `("cargo" "build" ,@cargo-build-flags)))
- #t))
+ (zero? (apply system* `("cargo" "build" ,@cargo-build-flags))))
(define* (check #:key tests? #:allow-other-keys)
"Run tests for a given Cargo package."
@@ -73,6 +106,44 @@
(zero? (system* "cargo" "test"))
#t))
+(define (file-sha256 file-name)
+ "Calculate the hexdigest of the sha256 checksum of FILE-NAME and return it."
+ (let ((port (open-pipe* OPEN_READ
+ "sha256sum"
+ "--"
+ file-name)))
+ (let ((result (read-delimited " " port)))
+ (close-pipe port)
+ result)))
+
+;; Example dir-name: "/gnu/store/hwlr49riz3la33m6in2n898ly045ylld-rust-rand-0.3.15".
+(define (generate-checksums dir-name src-name)
+ "Given DIR-NAME, checksum all the files in it one by one and put the
+ result into the file \".cargo-checksum.json\" in the same directory.
+ Also includes the checksum of an extra file SRC-NAME as if it was
+ part of the directory DIR-NAME with name \"package\"."
+ (let* ((file-names (find-files dir-name "."))
+ (dir-prefix-name (string-append dir-name "/"))
+ (dir-prefix-name-len (string-length dir-prefix-name))
+ (checksums-file-name (string-append dir-name "/.cargo-checksum.json")))
+ (call-with-output-file checksums-file-name
+ (lambda (port)
+ (display "{\"files\":{" port)
+ (let ((sep ""))
+ (for-each (lambda (file-name)
+ (let ((file-relative-name (string-drop file-name dir-prefix-name-len)))
+ (display sep port)
+ (set! sep ",")
+ (write file-relative-name port)
+ (display ":" port)
+ (write (file-sha256 file-name) port))) file-names))
+ (display "},\"package\":" port)
+ (write (file-sha256 src-name) port)
+ (display "}" port)))))
+
+(define (touch file-name)
+ (call-with-output-file file-name (const #t)))
+
(define* (install #:key inputs outputs #:allow-other-keys)
"Install a given Cargo package."
(let* ((out (assoc-ref outputs "out"))
@@ -86,16 +157,19 @@
;; distributing crates as source and replacing
;; references in Cargo.toml with store paths.
(copy-recursively "src" (string-append rsrc "/src"))
+ (touch (string-append rsrc "/.cargo-ok"))
+ (generate-checksums rsrc src)
(install-file "Cargo.toml" rsrc)
;; When the package includes executables we install
;; it using cargo install. This fails when the crate
;; doesn't contain an executable.
(if (file-exists? "Cargo.lock")
- (system* "cargo" "install" "--root" out)
- (mkdir out))))
+ (zero? (system* "cargo" "install" "--root" out))
+ (begin
+ (mkdir out)
+ #t))))
(define %standard-phases
- ;; 'configure' phase is not needed.
(modify-phases gnu:%standard-phases
(replace 'configure configure)
(replace 'build build)
Reply sent
to
Danny Milosavljevic <dannym <at> scratchpost.org>
:
You have taken responsibility.
(Fri, 17 Mar 2017 15:49:03 GMT)
Full text and
rfc822 format available.
Notification sent
to
Danny Milosavljevic <dannym <at> scratchpost.org>
:
bug acknowledged by developer.
(Fri, 17 Mar 2017 15:49:03 GMT)
Full text and
rfc822 format available.
Message #10 received at 25956-done <at> debbugs.gnu.org (full text, mbox):
cargo-build-system installer pushed to master as 27bdb509a230a6704051e6fb036eeffd8950c913. Closing bugreport.
bug archived.
Request was from
Debbugs Internal Request <help-debbugs <at> gnu.org>
to
internal_control <at> debbugs.gnu.org
.
(Sat, 15 Apr 2017 11:24:04 GMT)
Full text and
rfc822 format available.
This bug report was last modified 8 years and 129 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.