gnu: rust: Factor out "cargo-utils" from "cargo-build-system".

* guix/build/cargo-utils.scm: New file.
* Makefile.am (MODULES): Add it.
* guix/build-system/cargo.scm (%cargo-utils-modules): New variable.
(%cargo-build-system-modules): Use it.
* guix/build/cargo-build-system.scm (file-sha256, generate-checksums): Move
from here...
* guix/build/cargo-utils.scm: ...to here.
* gnu/packages/rust.scm (rust-1.19.0)[arguments]<#:imported-modules>: Use
%cargo-utils-modules.
<#:phases>[patch-cargo-checksums]: Use (guix build cargo-utils).
* gnu/packages/gnuzilla.scm (icecat):
[arguments]<#:imported-modules>: Use %cargo-utils-modules.
<#phases>[patch-cargo-checksums]: import (guix build cargo-utils).

Signed-off-by: Danny Milosavljevic <dannym@scratchpost.org>
This commit is contained in:
Ivan Petkov 2019-02-14 23:04:28 -08:00 committed by Danny Milosavljevic
parent a215c938b3
commit 7d141788b1
No known key found for this signature in database
GPG key ID: E71A35542C30BAA5
6 changed files with 85 additions and 43 deletions

View file

@ -144,6 +144,7 @@ MODULES = \
guix/build/download.scm \ guix/build/download.scm \
guix/build/download-nar.scm \ guix/build/download-nar.scm \
guix/build/cargo-build-system.scm \ guix/build/cargo-build-system.scm \
guix/build/cargo-utils.scm \
guix/build/cmake-build-system.scm \ guix/build/cmake-build-system.scm \
guix/build/dub-build-system.scm \ guix/build/dub-build-system.scm \
guix/build/dune-build-system.scm \ guix/build/dune-build-system.scm \

View file

@ -9,6 +9,7 @@
;;; Copyright © 2017 Nils Gillmann <ng0@n0.is> ;;; Copyright © 2017 Nils Gillmann <ng0@n0.is>
;;; Copyright © 2017, 2018 Tobias Geerinckx-Rice <me@tobias.gr> ;;; Copyright © 2017, 2018 Tobias Geerinckx-Rice <me@tobias.gr>
;;; Copyright © 2018 Ricardo Wurmus <rekado@elephly.net> ;;; Copyright © 2018 Ricardo Wurmus <rekado@elephly.net>
;;; Copyright © 2019 Ivan Petkov <ivanppetkov@gmail.com>
;;; ;;;
;;; This file is part of GNU Guix. ;;; This file is part of GNU Guix.
;;; ;;;
@ -866,8 +867,6 @@ (define-public icecat
;; practice somehow. See <http://hydra.gnu.org/build/378133>. ;; practice somehow. See <http://hydra.gnu.org/build/378133>.
#:validate-runpath? #f #:validate-runpath? #f
#:imported-modules ,%cargo-build-system-modules ;for `generate-checksums'
#:configure-flags `("--enable-default-toolkit=cairo-gtk3" #:configure-flags `("--enable-default-toolkit=cairo-gtk3"
"--with-distribution-id=org.gnu" "--with-distribution-id=org.gnu"
@ -939,6 +938,8 @@ (define-public icecat
;; "--with-system-png" ;; "--with-system-png"
) )
#:imported-modules ,%cargo-utils-modules ;for `generate-checksums'
#:modules ((ice-9 ftw) #:modules ((ice-9 ftw)
(ice-9 rdelim) (ice-9 rdelim)
(ice-9 match) (ice-9 match)
@ -978,7 +979,7 @@ (define-public icecat
(invoke "sh" "-c" "autoconf old-configure.in > old-configure"))) (invoke "sh" "-c" "autoconf old-configure.in > old-configure")))
(add-after 'patch-source-shebangs 'patch-cargo-checksums (add-after 'patch-source-shebangs 'patch-cargo-checksums
(lambda _ (lambda _
(use-modules (guix build cargo-build-system)) (use-modules (guix build cargo-utils))
(let ((null-file "/dev/null") (let ((null-file "/dev/null")
(null-hash "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855")) (null-hash "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"))
(substitute* '("Cargo.lock" "servo/Cargo.lock") (substitute* '("Cargo.lock" "servo/Cargo.lock")

View file

@ -7,6 +7,7 @@
;;; Copyright © 2017 Efraim Flashner <efraim@flashner.co.il> ;;; Copyright © 2017 Efraim Flashner <efraim@flashner.co.il>
;;; Copyright © 2018 Tobias Geerinckx-Rice <me@tobias.gr> ;;; Copyright © 2018 Tobias Geerinckx-Rice <me@tobias.gr>
;;; Copyright © 2018 Danny Milosavljevic <dannym+a@scratchpost.org> ;;; Copyright © 2018 Danny Milosavljevic <dannym+a@scratchpost.org>
;;; Copyright © 2019 Ivan Petkov <ivanppetkov@gmail.com>
;;; ;;;
;;; This file is part of GNU Guix. ;;; This file is part of GNU Guix.
;;; ;;;
@ -194,7 +195,7 @@ (define rust-1.19
(properties '((timeout . 72000) ;20 hours (properties '((timeout . 72000) ;20 hours
(max-silent-time . 18000))) ;5 hours (for armel) (max-silent-time . 18000))) ;5 hours (for armel)
(arguments (arguments
`(#:imported-modules ,%cargo-build-system-modules ;for `generate-checksums' `(#:imported-modules ,%cargo-utils-modules ;for `generate-checksums'
#:modules ((guix build utils) (ice-9 match) (guix build gnu-build-system)) #:modules ((guix build utils) (ice-9 match) (guix build gnu-build-system))
#:phases #:phases
(modify-phases %standard-phases (modify-phases %standard-phases
@ -273,7 +274,7 @@ (define rust-1.19
(string-append name "\"" ,%cargo-reference-hash "\""))) (string-append name "\"" ,%cargo-reference-hash "\"")))
(for-each (for-each
(lambda (filename) (lambda (filename)
(use-modules (guix build cargo-build-system)) (use-modules (guix build cargo-utils))
(delete-file filename) (delete-file filename)
(let* ((dir (dirname filename))) (let* ((dir (dirname filename)))
(display (string-append (display (string-append

View file

@ -3,6 +3,7 @@
;;; Copyright © 2013 Andreas Enge <andreas@enge.fr> ;;; Copyright © 2013 Andreas Enge <andreas@enge.fr>
;;; Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.org> ;;; Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.org>
;;; Copyright © 2016 David Craven <david@craven.ch> ;;; Copyright © 2016 David Craven <david@craven.ch>
;;; Copyright © 2019 Ivan Petkov <ivanppetkov@gmail.com>
;;; ;;;
;;; This file is part of GNU Guix. ;;; This file is part of GNU Guix.
;;; ;;;
@ -30,6 +31,7 @@ (define-module (guix build-system cargo)
#:use-module (ice-9 match) #:use-module (ice-9 match)
#:use-module (srfi srfi-26) #:use-module (srfi srfi-26)
#:export (%cargo-build-system-modules #:export (%cargo-build-system-modules
%cargo-utils-modules
cargo-build-system cargo-build-system
crate-url crate-url
crate-url? crate-url?
@ -49,10 +51,15 @@ (define (default-rust)
(let ((rust (resolve-interface '(gnu packages rust)))) (let ((rust (resolve-interface '(gnu packages rust))))
(module-ref rust 'rust))) (module-ref rust 'rust)))
(define %cargo-utils-modules
;; Build-side modules imported by default.
`((guix build cargo-utils)
,@%gnu-build-system-modules))
(define %cargo-build-system-modules (define %cargo-build-system-modules
;; Build-side modules imported by default. ;; Build-side modules imported by default.
`((guix build cargo-build-system) `((guix build cargo-build-system)
,@%gnu-build-system-modules)) ,@%cargo-utils-modules))
(define* (cargo-build store name inputs (define* (cargo-build store name inputs
#:key #:key

View file

@ -20,6 +20,7 @@
(define-module (guix build cargo-build-system) (define-module (guix build cargo-build-system)
#:use-module ((guix build gnu-build-system) #:prefix gnu:) #:use-module ((guix build gnu-build-system) #:prefix gnu:)
#:use-module (guix build utils) #:use-module (guix build utils)
#:use-module (guix build cargo-utils)
#:use-module (ice-9 popen) #:use-module (ice-9 popen)
#:use-module (ice-9 rdelim) #:use-module (ice-9 rdelim)
#:use-module (ice-9 ftw) #:use-module (ice-9 ftw)
@ -28,8 +29,7 @@ (define-module (guix build cargo-build-system)
#:use-module (srfi srfi-1) #:use-module (srfi srfi-1)
#:use-module (srfi srfi-26) #:use-module (srfi srfi-26)
#:export (%standard-phases #:export (%standard-phases
cargo-build cargo-build))
generate-checksums))
;; Commentary: ;; Commentary:
;; ;;
@ -107,41 +107,6 @@ (define* (check #:key tests? #:allow-other-keys)
(zero? (system* "cargo" "test")) (zero? (system* "cargo" "test"))
#t)) #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)))
(define (generate-checksums dir-name src-name)
"Given DIR-NAME, a store directory, 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) (define (touch file-name)
(call-with-output-file file-name (const #t))) (call-with-output-file file-name (const #t)))

View file

@ -0,0 +1,67 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2016 David Craven <david@craven.ch>
;;; Copyright © 2017 Mathieu Othacehe <m.othacehe@gmail.com>
;;; Copyright © 2019 Ivan Petkov <ivanppetkov@gmail.com>
;;;
;;; This file is part of GNU Guix.
;;;
;;; GNU Guix is free software; you can redistribute it and/or modify it
;;; under the terms of the GNU General Public License as published by
;;; the Free Software Foundation; either version 3 of the License, or (at
;;; your option) any later version.
;;;
;;; GNU Guix is distributed in the hope that it will be useful, but
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;;; GNU General Public License for more details.
;;;
;;; You should have received a copy of the GNU General Public License
;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
(define-module (guix build cargo-utils)
#:use-module (guix build utils)
#:use-module (ice-9 popen)
#:use-module (ice-9 rdelim)
#:export (generate-checksums))
;; Commentary:
;;
;; Stand alone utilities for building Rust crates or the compiler itself,
;; without depending on the entire cargo build-system itself.
;;
;; Code:
(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)))
(define (generate-checksums dir-name src-name)
"Given DIR-NAME, a store directory, 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)))))