GNU bug report logs - #25956
[PATCH] build/cargo-build-system: Make cargo-build-system install working packages.

Previous Next

Package: guix-patches;

Reported by: Danny Milosavljevic <dannym <at> scratchpost.org>

Date: Fri, 3 Mar 2017 19:52:02 UTC

Severity: normal

Tags: patch

Done: Danny Milosavljevic <dannym <at> scratchpost.org>

Bug is archived. No further changes may be made.

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.

View this report as an mbox folder, status mbox, maintainer mbox


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):

From: Danny Milosavljevic <dannym <at> scratchpost.org>
To: guix-patches <at> gnu.org
Cc: Danny Milosavljevic <dannym <at> scratchpost.org>
Subject: [PATCH] build/cargo-build-system: Make cargo-build-system install
 working packages.
Date: Fri,  3 Mar 2017 20:50:47 +0100
* 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):

From: Danny Milosavljevic <dannym <at> scratchpost.org>
To: 25956-done <at> debbugs.gnu.org
Subject: cargo-build-system installer pushed to master as
 27bdb509a230a6704051e6fb036eeffd8950c913
Date: Fri, 17 Mar 2017 16:48:26 +0100
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.