[bug#77093,rust-team,v3,03/17] build-system: cargo: Support packaging Cargo workspace.
Commit Message
* guix/build-system/cargo.scm (cargo-build,cargo-cross-build)
[#:cargo-package-crates]: New argument.
* guix/build/cargo-build-system.scm (package): Use it.
* doc/guix.texi (Build Systems)[cargo-build-system]: Document it.
Change-Id: I45ccd95e90827d47127015cb0bda2d41f792335b
---
doc/guix.texi | 7 +++++++
guix/build-system/cargo.scm | 4 ++++
guix/build/cargo-build-system.scm | 21 +++++++++++++++++++--
3 files changed, 30 insertions(+), 2 deletions(-)
@@ -9363,6 +9363,13 @@ Build Systems
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.
+
+This build system supports cargo workspaces. Parameter
+@code{#:cargo-package-crates} (default: @code{''()}) allows specifying names of
+library crates to package in the @code{package} phase. Specified crates are
+packaged from left to right, in case there's dependency among them. For
+example, specifying @code{''("pcre2-sys" "pcre2")} will package
+@code{"pcre2-sys"} first and then @code{"pcre2"}.
@end defvar
@defvar chicken-build-system
@@ -94,6 +94,7 @@ (define* (cargo-build name inputs
(vendor-dir "guix-vendor")
(cargo-build-flags ''("--release"))
(cargo-test-flags ''())
+ (cargo-package-crates ''())
(cargo-package-flags ''("--no-metadata" "--no-verify"))
(features ''())
(skip-build? #f)
@@ -122,6 +123,7 @@ (define* (cargo-build name inputs
#:vendor-dir #$vendor-dir
#:cargo-build-flags #$(sexp->gexp cargo-build-flags)
#:cargo-test-flags #$(sexp->gexp cargo-test-flags)
+ #:cargo-package-crates #$(sexp->gexp cargo-package-crates)
#:cargo-package-flags #$(sexp->gexp cargo-package-flags)
#:cargo-target #$(cargo-triplet system)
#:features #$(sexp->gexp features)
@@ -154,6 +156,7 @@ (define* (cargo-cross-build name
(vendor-dir "guix-vendor")
(cargo-build-flags ''("--release"))
(cargo-test-flags ''())
+ (cargo-package-crates ''())
(cargo-package-flags ''("--no-metadata" "--no-verify"))
(cargo-target (cargo-triplet (or target system)))
(features ''())
@@ -185,6 +188,7 @@ (define* (cargo-cross-build name
#:vendor-dir #$vendor-dir
#:cargo-build-flags #$(sexp->gexp cargo-build-flags)
#:cargo-test-flags #$(sexp->gexp cargo-test-flags)
+ #:cargo-package-crates #$(sexp->gexp cargo-package-crates)
#:cargo-package-flags #$(sexp->gexp cargo-package-flags)
#:cargo-target #$(cargo-triplet (or target system))
#:features #$(sexp->gexp features)
@@ -300,11 +300,16 @@ (define* (package #:key
source
skip-build?
install-source?
+ (cargo-package-crates '())
(cargo-package-flags '("--no-metadata" "--no-verify"))
+ (vendor-dir "guix-vendor")
#:allow-other-keys)
"Run 'cargo-package' for a given Cargo package."
(if install-source?
- (if skip-build?
+ ;; NOTE: Cargo workspace packaging support:
+ ;; #:install-source? #t + #:cargo-package-crates.
+ (if (and (null? cargo-package-crates)
+ skip-build?)
(begin
(install-file source "target/package")
(with-directory-excursion "target/package"
@@ -322,7 +327,19 @@ (define* (package #:key
;;error: invalid inclusion of reserved file name Cargo.toml.orig in package source
(when (file-exists? "Cargo.toml.orig")
(delete-file "Cargo.toml.orig"))
- (apply invoke `("cargo" "package" "--offline" ,@cargo-package-flags))
+
+ (if (null? cargo-package-crates)
+ (apply invoke `("cargo" "package" "--offline" ,@cargo-package-flags))
+ (for-each
+ (lambda (pkg)
+ (apply invoke "cargo" "package" "--offline" "--package" pkg
+ cargo-package-flags)
+ (for-each
+ (lambda (crate)
+ (invoke "tar" "xzf" crate "-C" vendor-dir))
+ (find-files "target/package" "\\.crate$"))
+ (patch-cargo-checksums #:vendor-dir vendor-dir))
+ cargo-package-crates))
;; Then unpack the crate, reset the timestamp of all contained files, and
;; repack them. This is necessary to ensure that they are reproducible.