build-system/cargo: Propagate crates across builds.
* guix/build-system/cargo.scm (cargo-build): Add cargo-package-flags, install-source flags. * guix/build/cargo-build-system.scm (unpack-rust-crates, package): New procedures. (install): Also install crate sources. (%standard-phases): Add new phases. * doc/guix.texi (Packaging-guidelines)[Rust Crates]: Adjust to changes in the cargo-build-system.master
parent
61a1165340
commit
4d00185d66
|
@ -32,7 +32,7 @@ Copyright @copyright{} 2015, 2016, 2017, 2019, 2020, 2021 Leo Famulari@*
|
|||
Copyright @copyright{} 2015, 2016, 2017, 2018, 2019, 2020 Ricardo Wurmus@*
|
||||
Copyright @copyright{} 2016 Ben Woodcroft@*
|
||||
Copyright @copyright{} 2016, 2017, 2018 Chris Marusich@*
|
||||
Copyright @copyright{} 2016, 2017, 2018, 2019, 2020 Efraim Flashner@*
|
||||
Copyright @copyright{} 2016, 2017, 2018, 2019, 2020, 2021 Efraim Flashner@*
|
||||
Copyright @copyright{} 2016 John Darrington@*
|
||||
Copyright @copyright{} 2016, 2017 Nikita Gillmann@*
|
||||
Copyright @copyright{} 2016, 2017, 2018, 2019, 2020 Jan Nieuwenhuizen@*
|
||||
|
@ -7449,8 +7449,10 @@ supports builds of packages using Cargo, the build tool of the
|
|||
It adds @code{rustc} and @code{cargo} to the set of inputs.
|
||||
A different Rust package can be specified with the @code{#:rust} parameter.
|
||||
|
||||
Regular cargo dependencies should be added to the package definition via the
|
||||
@code{#:cargo-inputs} parameter as a list of name and spec pairs, where the
|
||||
Regular cargo dependencies should be added to the package definition similarly
|
||||
to other packages; those needed only at build time to native-inputs, others to
|
||||
inputs. If you need to add source-only crates then you should add them to via
|
||||
the @code{#:cargo-inputs} parameter as a list of name and spec pairs, where the
|
||||
spec can be a package or a source definition. Note that the spec must
|
||||
evaluate to a path to a gzipped tarball which includes a @code{Cargo.toml}
|
||||
file at its root, or it will be ignored. Similarly, cargo dev-dependencies
|
||||
|
@ -7461,8 +7463,11 @@ In its @code{configure} phase, this build system will make any source inputs
|
|||
specified in the @code{#:cargo-inputs} and @code{#:cargo-development-inputs}
|
||||
parameters available to cargo. It will also remove an included
|
||||
@code{Cargo.lock} file to be recreated by @code{cargo} during the
|
||||
@code{build} phase. The @code{install} phase installs the binaries
|
||||
defined by the crate.
|
||||
@code{build} phase. The @code{package} phase will run @code{cargo package}
|
||||
to create a source crate for future use. The @code{install} phase installs
|
||||
the binaries defined by the crate. Unless @code{install-source? #f} is
|
||||
defined it will also install a source crate repository of itself and unpacked
|
||||
sources, to ease in future hacking on rust packages.
|
||||
@end defvr
|
||||
|
||||
@defvr {Scheme Variable} chicken-build-system
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
;;; Copyright © 2016 David Craven <david@craven.ch>
|
||||
;;; Copyright © 2019 Ivan Petkov <ivanppetkov@gmail.com>
|
||||
;;; Copyright © 2020 Jakub Kądziołka <kuba@kadziolka.net>
|
||||
;;; Copyright © 2021 Efraim Flashner <efraim@flashner.co.il>
|
||||
;;;
|
||||
;;; This file is part of GNU Guix.
|
||||
;;;
|
||||
|
@ -77,8 +78,10 @@ to NAME and VERSION."
|
|||
(vendor-dir "guix-vendor")
|
||||
(cargo-build-flags ''("--release"))
|
||||
(cargo-test-flags ''("--release"))
|
||||
(cargo-package-flags ''("--no-metadata" "--no-verify"))
|
||||
(features ''())
|
||||
(skip-build? #f)
|
||||
(install-source? #t)
|
||||
(phases '(@ (guix build cargo-build-system)
|
||||
%standard-phases))
|
||||
(outputs '("out"))
|
||||
|
@ -106,8 +109,10 @@ to NAME and VERSION."
|
|||
#:vendor-dir ,vendor-dir
|
||||
#:cargo-build-flags ,cargo-build-flags
|
||||
#:cargo-test-flags ,cargo-test-flags
|
||||
#:cargo-package-flags ,cargo-package-flags
|
||||
#:features ,features
|
||||
#:skip-build? ,skip-build?
|
||||
#:install-source? ,install-source?
|
||||
#:tests? ,(and tests? (not skip-build?))
|
||||
#:phases ,phases
|
||||
#:outputs %outputs
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
;;; Copyright © 2016 David Craven <david@craven.ch>
|
||||
;;; Copyright © 2017 Mathieu Othacehe <m.othacehe@gmail.com>
|
||||
;;; Copyright © 2019 Ivan Petkov <ivanppetkov@gmail.com>
|
||||
;;; Copyright © 2019, 2020 Efraim Flashner <efraim@flashner.co.il>
|
||||
;;; Copyright © 2019, 2020, 2021 Efraim Flashner <efraim@flashner.co.il>
|
||||
;;; Copyright © 2020 Jakub Kądziołka <kuba@kadziolka.net>
|
||||
;;; Copyright © 2020 Marius Bakke <marius@gnu.org>
|
||||
;;;
|
||||
|
@ -73,6 +73,38 @@ Cargo.toml file present at its root."
|
|||
" | cut -d/ -f2"
|
||||
" | grep -q '^Cargo.toml$'")))))
|
||||
|
||||
(define* (unpack-rust-crates #:key inputs vendor-dir #:allow-other-keys)
|
||||
(define (inputs->rust-inputs inputs)
|
||||
"Filter using the label part from INPUTS."
|
||||
(filter (lambda (input)
|
||||
(match input
|
||||
((name . _) (rust-package? name))))
|
||||
inputs))
|
||||
(define (inputs->directories inputs)
|
||||
"Extract the directory part from INPUTS."
|
||||
(match inputs
|
||||
(((names . directories) ...)
|
||||
directories)))
|
||||
|
||||
(let ((rust-inputs (inputs->directories (inputs->rust-inputs inputs))))
|
||||
(unless (null? rust-inputs)
|
||||
(mkdir-p "target/package")
|
||||
(mkdir-p vendor-dir)
|
||||
;; TODO: copy only regular inputs to target/package, not native-inputs.
|
||||
(for-each (lambda (input-crate)
|
||||
(copy-recursively (string-append input-crate
|
||||
"/share/cargo/registry")
|
||||
"target/package"))
|
||||
(delete-duplicates rust-inputs))
|
||||
|
||||
(for-each (lambda (crate)
|
||||
(invoke "tar" "xzf" crate "-C" vendor-dir))
|
||||
(find-files "target/package" "\\.crate$"))))
|
||||
#t)
|
||||
|
||||
(define (rust-package? name)
|
||||
(string-prefix? "rust-" name))
|
||||
|
||||
(define* (configure #:key inputs
|
||||
(vendor-dir "guix-vendor")
|
||||
#:allow-other-keys)
|
||||
|
@ -170,9 +202,27 @@ directory = '" port)
|
|||
(apply invoke "cargo" "test" cargo-test-flags)
|
||||
#t))
|
||||
|
||||
(define* (install #:key inputs outputs skip-build? features #:allow-other-keys)
|
||||
(define* (package #:key
|
||||
install-source?
|
||||
(cargo-package-flags '("--no-metadata" "--no-verify"))
|
||||
#:allow-other-keys)
|
||||
"Run 'cargo-package' for a given Cargo package."
|
||||
(if install-source?
|
||||
(apply invoke `("cargo" "package" ,@cargo-package-flags))
|
||||
(format #t "Not installing cargo sources, skipping `cargo package`.~%"))
|
||||
#t)
|
||||
|
||||
(define* (install #:key
|
||||
inputs
|
||||
outputs
|
||||
skip-build?
|
||||
install-source?
|
||||
features
|
||||
#:allow-other-keys)
|
||||
"Install a given Cargo package."
|
||||
(let* ((out (assoc-ref outputs "out")))
|
||||
(let* ((out (assoc-ref outputs "out"))
|
||||
(registry (string-append out "/share/cargo/registry"))
|
||||
(sources (string-append out "/share/cargo/src")))
|
||||
(mkdir-p out)
|
||||
|
||||
;; Make cargo reuse all the artifacts we just built instead
|
||||
|
@ -186,6 +236,18 @@ directory = '" port)
|
|||
(invoke "cargo" "install" "--no-track" "--path" "." "--root" out
|
||||
"--features" (string-join features)))
|
||||
|
||||
(when install-source?
|
||||
;; Install crate tarballs and unpacked sources for later use.
|
||||
;; TODO: Is there a better format/directory for these files?
|
||||
(mkdir-p sources)
|
||||
(for-each (lambda (crate)
|
||||
(install-file crate registry))
|
||||
(find-files "target/package" "\\.crate$"))
|
||||
|
||||
(for-each (lambda (crate)
|
||||
(invoke "tar" "xzf" crate "-C" sources))
|
||||
(find-files registry "\\.crate$")))
|
||||
|
||||
#t))
|
||||
|
||||
(define %standard-phases
|
||||
|
@ -195,6 +257,8 @@ directory = '" port)
|
|||
(replace 'build build)
|
||||
(replace 'check check)
|
||||
(replace 'install install)
|
||||
(add-after 'build 'package package)
|
||||
(add-after 'unpack 'unpack-rust-crates unpack-rust-crates)
|
||||
(add-after 'patch-generated-file-shebangs 'patch-cargo-checksums patch-cargo-checksums)))
|
||||
|
||||
(define* (cargo-build #:key inputs (phases %standard-phases)
|
||||
|
|
Reference in New Issue