build-system: cargo: Support installing Cargo workspace.

*guix/build-system/cargo.scm (cargo-build, cargo-cross-build)
[#:cargo-install-paths]: New argument.
* guix/build/cargo-build-system.scm (install): Use it.
* doc/guix.texi (Build Systems)[cargo-build-system]: Document it.

Change-Id: I74ed1972a5716da05afeac8edb2b0e4b6834bf40
This commit is contained in:
Hilton Chain 2025-02-27 20:03:49 +08:00
parent 878bdd7fb6
commit 5494343bfc
No known key found for this signature in database
GPG key ID: ACC66D09CA528292
3 changed files with 21 additions and 5 deletions

View file

@ -9582,7 +9582,10 @@ This build system supports cargo workspaces. Parameter
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"}.
@code{"pcre2-sys"} first and then @code{"pcre2"}. Parameter
@code{#:cargo-install-paths} (default: @code{''()}) allows specifying paths of
binary crates to install in the @code{install} phase, @code{''("crates/atuin")},
for example.
@end defvar
@defvar chicken-build-system

View file

@ -100,6 +100,7 @@ to NAME and VERSION."
(cargo-test-flags ''())
(cargo-package-crates ''())
(cargo-package-flags ''("--no-metadata" "--no-verify"))
(cargo-install-paths ''())
(features ''())
(skip-build? #f)
(parallel-build? #t)
@ -129,6 +130,7 @@ to NAME and VERSION."
#: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-install-paths #$(sexp->gexp cargo-install-paths)
#:cargo-target #$(cargo-triplet system)
#:features #$(sexp->gexp features)
#:skip-build? #$skip-build?
@ -162,6 +164,7 @@ to NAME and VERSION."
(cargo-test-flags ''())
(cargo-package-crates ''())
(cargo-package-flags ''("--no-metadata" "--no-verify"))
(cargo-install-paths ''())
(cargo-target (cargo-triplet (or target system)))
(features ''())
(skip-build? #f)
@ -194,6 +197,7 @@ to NAME and VERSION."
#: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-install-paths #$(sexp->gexp cargo-install-paths)
#:cargo-target #$(cargo-triplet (or target system))
#:features #$(sexp->gexp features)
#:skip-build? #$skip-build?

View file

@ -379,6 +379,7 @@ directory = '" vendor-dir "'") port)
skip-build?
install-source?
features
(cargo-install-paths '())
#:allow-other-keys)
"Install a given Cargo package."
(let* ((out (assoc-ref outputs "out"))
@ -393,10 +394,18 @@ directory = '" vendor-dir "'") port)
;; Only install crates which include binary targets,
;; otherwise cargo will raise an error.
(or skip-build?
(not (has-executable-target?))
;; NOTE: Cargo workspace installation support:
;; #:skip-build? #f + #:cargo-install-paths.
(and (null? cargo-install-paths)
(not (has-executable-target?)))
(for-each
(lambda (path)
(invoke "cargo" "install" "--offline" "--no-track"
"--path" "." "--root" out
"--path" path "--root" out
"--features" (string-join features)))
(if (null? cargo-install-paths)
'(".")
cargo-install-paths)))
(when install-source?
;; Install crate tarballs and unpacked sources for later use.