build-system: cargo: Support packaging Cargo workspace.

* 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
This commit is contained in:
Hilton Chain 2025-02-27 19:58:04 +08:00
parent 5d294e2023
commit 878bdd7fb6
No known key found for this signature in database
GPG key ID: ACC66D09CA528292
3 changed files with 30 additions and 2 deletions

View file

@ -9576,6 +9576,13 @@ 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 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 defined it will also install a source crate repository of itself and unpacked
sources, to ease in future hacking on rust packages. 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 @end defvar
@defvar chicken-build-system @defvar chicken-build-system

View file

@ -98,6 +98,7 @@ to NAME and VERSION."
(vendor-dir "guix-vendor") (vendor-dir "guix-vendor")
(cargo-build-flags ''("--release")) (cargo-build-flags ''("--release"))
(cargo-test-flags ''()) (cargo-test-flags ''())
(cargo-package-crates ''())
(cargo-package-flags ''("--no-metadata" "--no-verify")) (cargo-package-flags ''("--no-metadata" "--no-verify"))
(features ''()) (features ''())
(skip-build? #f) (skip-build? #f)
@ -126,6 +127,7 @@ to NAME and VERSION."
#:vendor-dir #$vendor-dir #:vendor-dir #$vendor-dir
#:cargo-build-flags #$(sexp->gexp cargo-build-flags) #:cargo-build-flags #$(sexp->gexp cargo-build-flags)
#:cargo-test-flags #$(sexp->gexp cargo-test-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-package-flags #$(sexp->gexp cargo-package-flags)
#:cargo-target #$(cargo-triplet system) #:cargo-target #$(cargo-triplet system)
#:features #$(sexp->gexp features) #:features #$(sexp->gexp features)
@ -158,6 +160,7 @@ to NAME and VERSION."
(vendor-dir "guix-vendor") (vendor-dir "guix-vendor")
(cargo-build-flags ''("--release")) (cargo-build-flags ''("--release"))
(cargo-test-flags ''()) (cargo-test-flags ''())
(cargo-package-crates ''())
(cargo-package-flags ''("--no-metadata" "--no-verify")) (cargo-package-flags ''("--no-metadata" "--no-verify"))
(cargo-target (cargo-triplet (or target system))) (cargo-target (cargo-triplet (or target system)))
(features ''()) (features ''())
@ -189,6 +192,7 @@ to NAME and VERSION."
#:vendor-dir #$vendor-dir #:vendor-dir #$vendor-dir
#:cargo-build-flags #$(sexp->gexp cargo-build-flags) #:cargo-build-flags #$(sexp->gexp cargo-build-flags)
#:cargo-test-flags #$(sexp->gexp cargo-test-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-package-flags #$(sexp->gexp cargo-package-flags)
#:cargo-target #$(cargo-triplet (or target system)) #:cargo-target #$(cargo-triplet (or target system))
#:features #$(sexp->gexp features) #:features #$(sexp->gexp features)

View file

@ -302,11 +302,16 @@ directory = '" vendor-dir "'") port)
source source
skip-build? skip-build?
install-source? install-source?
(cargo-package-crates '())
(cargo-package-flags '("--no-metadata" "--no-verify")) (cargo-package-flags '("--no-metadata" "--no-verify"))
(vendor-dir "guix-vendor")
#:allow-other-keys) #:allow-other-keys)
"Run 'cargo-package' for a given Cargo package." "Run 'cargo-package' for a given Cargo package."
(if install-source? (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 (begin
(install-file source "target/package") (install-file source "target/package")
(with-directory-excursion "target/package" (with-directory-excursion "target/package"
@ -324,7 +329,19 @@ directory = '" vendor-dir "'") port)
;;error: invalid inclusion of reserved file name Cargo.toml.orig in package source ;;error: invalid inclusion of reserved file name Cargo.toml.orig in package source
(when (file-exists? "Cargo.toml.orig") (when (file-exists? "Cargo.toml.orig")
(delete-file "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 ;; Then unpack the crate, reset the timestamp of all contained files, and
;; repack them. This is necessary to ensure that they are reproducible. ;; repack them. This is necessary to ensure that they are reproducible.